1.3、常见错误
1.3.1、url-pattern 中配置的路径没有以斜杠打头
1.3.2、servlet-name 配置的值不存在
二、Servlet生命周期
=============
2.1、Servlet生命周期
Servlet 对象的生命周期:Servlet 创建对象–>初始化操作–> 运行操作–>销毁操作
Web 服务器管理了 Servlet 的生命周期,Servlet 对象整个过程都是 Web 服务器来管理的。
2.2、Servlet 接口中生命周期方法
| 生命周期方法 | 作用 | 运行次数 |
| — | — | — |
| 构造方法 | 在对象实例化的时候执行
必须有公共的无参数构造方法 | 1次 |
| void init(ServletConfig config) | 在初始化的时候执行 | 1次 |
| void service(ServletRequest req, ServletResponse res) | 每次请求都会执行 | n次 |
| void destroy() | 在服务器正常关闭的时候 | 1次 |
2.3、Servlet的请求流程
localhost:8080/one/hello
# 1. 浏览器发送请求,Tomcat接收到请求并通过结息请求地址来获取到要访问的项目路径和资源路径。
项目路径:/one
资源路径:/hello
# 2. Tomcat会扫描服务器内部的one项目下的所有Servlet,获取每一个Servlet的访问地址,并存储到一个集合中。资源路径作为ket,类的全限定名作为value。
Map<String,String> map = new HashMap<>();
map.put("/one","com.servlet.HelloServlet");
# 3. 将资源路径/one作为key从map中获取value,得到了类的全限定名。
# 4. 他会预先创建一个Servlet实例缓存池(key是Servlet的全限定名,value是Servlet的实例对象),拿着找到的key,去servletmap中寻找,如果找得到说明不是第一次访问,如果找不到,说明是第一次访问。
Map<String,Servlet> servletmap = new HashMap<>();
if(servletmap.get(“全限定名”) == null){
// 第一次访问,执行第5步
} else{
// 第N次,直接执行第7步
}
# 5. 通过反射实例化这个Servlet对象,并放入实例缓存池中。
# 6. Tomcat创建ServletConfig对象,然后调用init方法,传入创建的Servlet对象
# 7. 创建HttpRequest和HttpResponse对象,并调用service方法,传入HttpRequest和HttpResponse对象。
# 8. 等待下一次访问。
复制代码
2.4、Servlet的继承体系
2.4.1、GenericServlet类
默认实现了 Servlet 和 ServletConfig 这两个接口,它的子类是 HttpServlet,如果我们写的Servlet使用的是 Http 协议。
package cn.servlet;
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;
@WebServlet(urlPatterns = "/demo")
public class DemoServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {