本文最后更新于:4 个月前

我们在写一个class 并 implement Servlet时,需要重写Servlet中的5个方法,但是大多时候都只用到 service 方法

虽然中用到service方法,但其余的4个方法还得重写。

那我们能不能编写一个class,去继承或实现 Servlet 后,只用定义一个 service 方法就可以了。其他方法想有就有,不想有就没有?

这时候我们就要聊聊 Servlet 体系结构了。

Servlet 体系结构

Servlet – interface,接口

↓|实现

GenericServlet – 实现类,抽象类

↓|继承

HttpServlet – 实现类,抽象类

做项目时,创建Servlet时候,推荐使用第三种方式:👉继承HttpServlet👉定义类继承HttpServlet👉 复写doGet/doPost方法

GenericServlet

  • Servlet 接口中的其他方法做了默认空实现只将 service() 方法作为抽象
  • 将来定义 Servlet 类时候,可以继承 GenericServlet,实现 service() 方法即可
  • 其余四种方法, 若有需要,手动重写即可。
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("demo2....");
    }
    
}

HttpServlet

  • 该抽象类是对 HTTP协议 的封装和描述,可以简化某些操作
  • HTTP协议 有 7种 请求方式。现在,我们假设只是用最常用的两种请求方式GET和POST这两种请求方式。
  • service()方法中 最先要干 的其中2件事👇

service()方法要干的其中2件事

  • 将来不管怎么样,都得做这么一件事:“先判断请求方式👉判断完后,要通过不同的请求方式,做出不同的代码逻辑“。
  • 那么,这个过程是非常麻烦的。
  • 同时,这个过程也是所有 service() 都该做的一个过程。
  • 所以这个时候,官方针对这个过程,专门提供了一个class HttpServlet
  • HttpServlet 已经帮程序员做好了这个过程,写好了相应的代码,就如上图的红色字体部分。集程序员不再需要去判断请求方式了。
  • HttpServlet 内部定义了 doGet(){}doPost(){} 这两个方法。并且在判断请求方式的 if 中调用了这两个方法。
  • 这就是其基本的定义原理。就如下图👇

HttpServlet类

  • 若将来想要屏蔽这种GET或POST请求方式的处理逻辑:我们可以继承 HttpServlet,并且去重写 doGet(){}doPost(){}这两个方法。

  • 因为将来都是调用 service()方法 ,并且 service()会做一个方法分发:你是get就调用 doGet() ,你是post就调用 doPost()

  • 做项目时,创建Servlet时候,推荐使用第三种方式:👉继承HttpServlet👉定义类继承HttpServlet👉 复写doGet/doPost方法

步骤

  1. 定义 class 继承 HttpServlet
  2. 重写doGet()doPost() 两个方法
/* ServletDemo3.java  */
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;

/**
 * @Classname ServletDemo3
 * @Description TODO
 * @Date 2020/2/20 下午 10:54
 * @Created by jerry
 */
@WebServlet("demo3")
public class ServletDemo3 extends HttpServlet {

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

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

注意

  • 通过浏览器直接请求,是GET方式
  • 现在掌握的知识,只能通过表单,完成POST方式

简单案例

  1. 新建login.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表单</title>
</head>
<body>
    <form action="/demo3" method="post">
        <input name="username">
        <input type="submit" value="提交">
    </form>
</body>
</html>
  1. 重启服务,访问页面

3msHLq.gif

  1. method="post" 改为 method="get"
  2. 再访问页面

3myRXR.gif

注意:

使用get方式后,请求的参数会跟在url后。

3myjBt.png


后续阅读相关文章

1、GenericServlet和HttpServlet

2、GenericServlet 、Servlet和httpServler他们之间的关系

3、GenericServlet和HttpServlet有什么区别?


 目录