12. Servlet入门 - Servlet体系结构

前言

前面的章节中,我们基本认识了 Servlet 程序的实现方法,就是实现 Servlet 接口。

下面我们来看看 Servlet 的体系结构,然后再来看看如何更加方便实现 Servlet 程序的方法。

使用 Idea 中查看 Servlet 的体系结构

1.进入 Servlet 接口的源码,右键 Servlet,打开 Servlet 接口的体系结构图


12. Servlet入门 - Servlet体系结构_spring


12. Servlet入门 - Servlet体系结构_java_02


2.继续查看实现 Servlet 接口的方法

12. Servlet入门 - Servlet体系结构_spring_03


12. Servlet入门 - Servlet体系结构_servlet_04


12. Servlet入门 - Servlet体系结构_spring_05


好了,到这里我们也大概知道 Servlet 接口实现的体系结构,下面我们再基于 API 文档来深入认识一下,然后再用代码实现一下。

在 API 文档查看 Servlet 的体系结构

查阅API查看Servlet接口的体系结构如下:12. Servlet入门 - Servlet体系结构_javaee_06

由API文档来看,我们可以使用继承 GenericServlet 或者HttpServlet来实现接口,我们下面我们分别看看这两个类,并且分别实现 Servlet。

1. GenericServlet 类

12. Servlet入门 - Servlet体系结构_javaee_07

1.2 使用GenericServlet 创建servlet:

  1. 创建一个类
  2. 继承GenericServlet
  3. 重写service方法

12. Servlet入门 - Servlet体系结构_java_08


package com.web;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
* @author Aron.li
* @date 2020/12/24 22:37
*/
@WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic")
public class GenericDemoServlet extends GenericServlet {

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("GenericDemoServlet执行.......");
}

}

虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。

2. HttpServlet 类

12. Servlet入门 - Servlet体系结构_接口_09

阅读上图的API可知,继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。

2.1 使用HttpServlet创建servlet:

  1. 创建一个类
  2. 继承HttpServlet
  3. 重写doGet方法和doPost方法

12. Servlet入门 - Servlet体系结构_javaee_10


12. Servlet入门 - Servlet体系结构_javaee_11


@WebServlet("/httpServlet")
public class HttpDemoServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GET 方法。。。。");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST 方法。。。。");
}

}

通过重写不同的方法,可以分别执行 GET 或者 POST 请求的业务。

2.2 在GET请求与POST请求处理相同业务的情况下,我们会选择在doGet中调用doPost

12. Servlet入门 - Servlet体系结构_spring_12


package com.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* Servlet的常用的编写方法:
* 1. 写一个类继承HttpServlet,重写doGet和doPost方法
* 1.1 doGet()方法,是处理来自客户端的get请求
* 1.2 doPost()方法,是处理来自客户端的post请求
*
* 通常情况下:服务器端针对同一个请求(不同的请求方式)不会做不同的处理,所以我们会选择在doGet中调用doPost
* 2. 配置servlet的映射路径
*
* @author Aron.li
* @date 2020/12/24 22:45
*/
@WebServlet("/httpServlet")
public class HttpDemoServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp); // 在doGet方法中调用doPost方法
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST 方法。。。。");
}

}

总结

通过以上两个API阅读,我们注意一个细节HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。