这一节主要介绍最基本的JavaWeb开发技术,流行的JavaWeb开发框架的底层都是Servlet与与JSP,因此了解他们是接下来学习的基础。参考资料如下:

WEB开发基础

Servlet与JSP的功能与职责

在JavaWeb的开发中,我们往往使用Servlet与JSP来实现应用服务器,他们是SpringMVC等其他Web技术的底层基础技术。其中Servlet是核心,JSP文件最终也会编译成Servlet。我们可以在JSP中写Java逻辑代码,调用数据库,绑定数据。但是实际项目开发时,应当职责清晰。Servlet偏向于实现Controller逻辑(Model层),而JSP仅仅用于展示页面数据的View层。由于JSP功能强大,过于复杂,往往导致代码逻辑混乱,在很多项目中要么只使用JSP的部分功能(如只有EL表达式展示数据),或者干脆代替JSP,选择其他的模板引擎,如Velocity等。

认识HTTP协议

任何Web开发技术都无法避免学习Http协议,把握以下几点。

Web应用目录结构

常见目录结构

新建的java web工程目录如下

目录结构多种多样,但是基本要素相同。还有一种常见的是

web.xml分析

web.xml是web工程的入口配置文件,一般分析一个web项目由它开始。

Servlet详解

编写基本功能的Servlet

我们可以直接继承Servlet接口实现service(ServletRequest var1, ServletResponse var2)方法。所有去请求都会走这里,但是为了更加方便,推荐使用HttpServlet,对http请求进行了分类(get post put del等 )。

转发与重定向

// 在doGet中,转发给jsp页面的Servlet处理
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
       // 设置attr,可以在jsp中读取到这个值
        request.setAttribute("title", "Hello Servlet");
        request.setAttribute("content", "你好");
        RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp");
        rd.forward(request, response);
    }

// 在doGet中,重定向给jsp页面的Servlet处理
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      response.sendRedirect("HelloServlet")
}

jsp代码如下

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>${title}</title>
    </head>
    <body>
        <h1>${content}</h1>
    </body>
</html>

几种常见场景

Servlet API

Servlet源码浅析

接口分析

继承关系

Servlet--GenericServlet--HttpServlet

重要的对象

Servlet运行模型

值得注意的细节

JSP简介

理解JSP

JSP(JavaServer Pages)是以.jsp为后缀名的一种脚本语言。使Java代码和特定的预定义动作可以嵌入到静态页面中。它经过编译后成为Java的Servlet类。通俗的理解,我们编写的.jsp文件(包含html,css,js,java逻辑代码)会在服务端动态处理(执行了jsp中的java代码)成一个由Servlet,最终该Servlet会out.println输出的静态html语句。

JSP技术的取舍

JSP技术是特定历史时期的产物,用来方便我们编写动态网页,简化Servlet的编写(现有Servlet技术,所有html语句在java中print太复杂,后来才发展的JSP)。但是由于JSP功能丰富,可以直接调用任何java代码,如数据库操作等,会带来一个严重的问题,即容易将业务逻辑代码(Model层,大部分是java代码)混杂在View层中(html,css,js),导致高度的耦合。因此现在网页开发框架中,依据Model2模型,往往使用模板技术代替JSP,模板仅仅有填值的功能,使用model层传过来的值渲染界面。

当然,我们也可以使用JSP实现模板功能,并且使用扩展的标签(JSTL)来取代只有Java才能实现的逻辑判断(如if while)。这里谈一下JSP使用的最佳实践:

基本语法

EL

用来取代JSP的表达式功能(<%=..%>),可以用来进行属性、请求参数、cookies的获取,以及一些简单运算判断。

JSTL

最基础的功能是提供逻辑判断的标签,可以彻底取代jsp文件中的java代码。当然它还提供了通过标签加入各种功能。但是不建议滥用。