Servlet的生命周期分为5个阶段:加载、创建、初始化 init()、处理客户请求 service()、卸载 destroy()。
1.加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet。
2.创建:通过调用Servlet的构造函数来创建一个Servlet实例。
3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
4.处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的Service()方法来响应客户端请求(Service方法是根据请求的method属性来调用doGet()和doPost())。
5.卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
主要有三个方法:
初始化阶段:
Servlet 容器加载 Servlet,加载完成后,Servlet 容器会创建一个 Servlet 实例并调用 init() 方法,init() 方法只会调用一次
Servlet 容器会在一下几种情况装载 Servlet:
Servlet 容器启动时自动装载某些 servlet,实现这个需要在 web.xml 文件中添加 1
在 Servlet 容器启动后,客户首次向 Servlet 发送请求
Servlet 类文件被更新后,重新装载
处理客户端请求阶段:
每收到一个客户端请求,服务器就会产生一个新的线程去处理。
对于用户的 Servlet 请求,Servlet 容器会创建一个特定于请求的 ServletRequest 和 ServletResponse。
对于 tomcat 来说,它会将传递来的参数放入一个 HashTable 中,这是一个 String–>String[] 的键值映射
终止阶段:
当 web 应用被终止,或者 Servlet 容器终止运行,或者 Servlet 重新装载 Servlet 新实例时,Servlet 容器会调用 Servlet 的 destroy() 方法
客户发送一个请求,Servlet 调用 service() 方法对请求进行响应,service() 方法会对请求的方法进行匹配,进入相应的逻辑层,完成请求的响应。
但是 Servlet 接口和 GenericServlet 接口中没有 doGet(),doPost() 等方法,HttpServlet 中定义了这些,但是返回的都是 Error 信息,所以每次定义 Servlet 都要重写这些方法。
Sertvlet 和 GenericServlet 是不特定于任何协议的,而 HttpServlet 是特定于 Http 协议的,所以 HttpServlet 中的 service() 方法中将 ServletRequest,ServletResponse 强转为 HttpRequest 和 HttpResponse,最后调用自己的 service 方法去完成响应。