0%

Servlet

添加依赖

设计一个能够处理客户端HTTP请求的Web应用,我们需要项目添加对Servlet框架的依赖,在pom.xml文件中添加依赖如下

1
2
3
4
5
6
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>

<scope>标签解释:标注依赖和本项目项目开发流程的关系

  • provided:在项目编译和运行时需要此依赖,在最终打包项目时不需要此依赖
  • compile:标签默认模式,该依赖会在最终被打包进项目中
  • runtime:在运行项目时需要此依赖,在编译时项目时不需要

添加Servlet请求处理类型

对于客户端一个具体的HTTP请求,我们需要实现一个Servlet类型来处理,代码如下

1
2
3
4
5
6
7
8
9
10
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Test> tests = new TestServiceImpl().TestSelect();
System.out.println(tests);
req.setAttribute("list", tests);
req.getRequestDispatcher("list.jsp").forward(req, resp);
}
}

Tips:

  • @WebServlet("/test")标记,指定了当前Servlet将处理客户端的哪种请求,该请求由客户端指定的URL路径特殊标识

  • extends HttpServlet继承父类HttpServlet,只有当前Servlet类型继承该父类以后,才是一个真正的Servlet处理类型

  • 对于HTTP中的GET请求,我们需要重写父类的doGet方法,同理,处理POST请求则重写doPost方法。在doGet方法中,通过参数HttpServletRequest类型,我们可以获取HTTP请求报文的所有参数

  • req.setAttribute方法在上述doGet方法中,将Model层服务提供的数据库表单添加到HttpServletRequest的属性中,属性名list属性值tests(服务层提供的数据),也可以理解为HTTP请求报文中的请求行添加一个字段信息。

    为什么会在浏览器提交HTTP请求报文后,我们还会在doGet方法中丰富这个请求的内容?可以这样理解,HTTP请求报文信息对应一个HttpServletRequest实例,在setAttrubute方法之后,我们会将GET请求的处理转移到目标资源JSP文件中执行,而执行内容就是将数据放在JSP文件中返回回去,所以为了能够让JSP文件能够得到我们MVC架构中Model层提供数据,我们会将该数据以请求报文信息的形式转交给JSP文件。

  • req.getRequestDispatcher方法将GET请求的处理转移到指定资源中进行,这里就是list.jsp文件,而改行代码中的forward方法会将请求类型响应类型都转发到该jsp文件中。单就这个转发操作而言,就是把客户端的HTTP请求转交给目标资源jsp进行处理,而该jsp资源有可以通过之前的到的list属性将服务器得到的数据嵌在jsp文件中,最后解析并返回给浏览器

MVC设计模式

概念解析

  • Model:处理或获取数据,属于MVC设计模式的最底层,将整个Web项目的功能目标拆分为一个个小功能,例如数据库查询、数据处理等
  • Controller:负责响应用户并调用Model的服务,其作为中间层,接收来自View的输入,解析请求并选择调用Model的哪一项服务,最后将Model返回的服务内容反馈到View
  • View:UI界面,用户直接看到的Web信息

举例说明

MVC设计模式可以存在于“浏览器查询服务器数据库”这一简单的DEMO中,项目结构如下

用MVC设计模式理解该项目架构

  1. View层,浏览器发出数据库查询的HTTP请求
  2. Controller层,TestServlet类型监听客户端的相应请求,并在触发后开始调用Model的服务
  3. Model层,TestMapper接口借助MyBatis框架,实现Java方法直接操作数据库的方式,接口的函数体逻辑定义在TestMapper.xml映射器文件中
  4. Model层,Test类型作为一个JavaBean,其实并没有运行任何业务逻辑,其存在的意义只是将数据库中的记录以Java类型的形式表现出来,方便在Java代码中使用。这里TestMapper接口函数得到的数据库数据以Test类型的形式返回给TestServlet
  5. Controller层,TestServlet处理类型得到数据以后,准备将其放在JSP资源中返回回去
  6. View层,最终浏览器将JSP资源解析得到的HTML资源渲染在用户面前