本文最后更新于: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()
都该做的一个过程。 - 所以这个时候,官方针对这个过程,专门提供了一个class
HttpServlet
。 HttpServlet
已经帮程序员做好了这个过程,写好了相应的代码,就如上图的红色字体部分。集程序员不再需要去判断请求方式了。HttpServlet
内部定义了doGet(){}
和doPost(){}
这两个方法。并且在判断请求方式的if
中调用了这两个方法。- 这就是其基本的定义原理。就如下图👇
若将来想要屏蔽这种GET或POST请求方式的处理逻辑:我们可以继承 HttpServlet,并且去重写
doGet(){}
和doPost(){}
这两个方法。因为将来都是调用
service()
方法 ,并且service()
会做一个方法分发:你是get就调用doGet()
,你是post就调用doPost()
。做项目时,创建Servlet时候,推荐使用第三种方式:👉继承HttpServlet👉定义类继承HttpServlet👉 复写doGet/doPost方法
步骤
- 定义 class 继承
HttpServlet
- 重写
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方式
简单案例
- 新建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>
- 重启服务,访问页面
- 将
method="post"
改为method="get"
- 再访问页面
注意:
使用get方式后,请求的参数会跟在url后。
后续阅读相关文章
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!