简介: 讲解Servlet的⽣生命周期
- Servlet 接⼝口⾥里里⾯面有5个⽅方法,其中三个⽣生命周期⽅方法和两个普通⽅方法
1. 加载和初始化阶段
-
过程:
- 当一个 Servlet 第一次被客户端请求时或者服务器启动时,Servlet 容器会加载该 Servlet 类(如果未加载过)。
- 容器会创建该 Servlet 的一个实例,并调用其
init()
方法进行初始化,Servlet生命周期,仅执行一次init()方法。
-
触发条件:
- 第一次请求到达时(默认行为)。
- 配置了
<load-on-startup>
参数,服务器启动时就会加载。
-
方法:
public void init(ServletConfig config) throws ServletException {// 初始化代码,例如读取配置文件、连接数据库等
}
作用:
- 用于执行一次性初始化任务,例如读取配置、初始化资源(如数据库连接)。
2. 请求处理阶段
-
过程:
- 每次有客户端请求到达时,Servlet 容器会调用该 Servlet 的
service()
方法。 service()
方法根据请求的 HTTP 方法(GET、POST 等)调用对应的doGet()
、doPost()
、doPut()
等方法,这样开发人员可以专注实现请求逻辑,而不需要关心请求分发。- HttpServlet提供默认service实现方法,该方法根据请求方式,调用对应doxx方法,那么开发人员只需根据请求类型重新对应doxx()方法
- 每次有客户端请求到达时,Servlet 容器会调用该 Servlet 的
-
方法:
@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {super.service(req, res);}
作用:
- 处理每个客户端请求并返回响应内容。
3.销毁阶段
-
过程:
- 当服务器关闭或 Servlet 被从容器中卸载时,Servlet 容器会调用该 Servlet 的
destroy()
方法。 - 资源被释放,例如关闭数据库连接、清理缓存等。
- 当服务器关闭或 Servlet 被从容器中卸载时,Servlet 容器会调用该 Servlet 的
-
方法:
@Overridepublic void destroy() {System.out.println("Servlet destroy");}
-
触发条件:
- 容器关闭。
- 手动卸载应用程序。
-
作用:
- 释放资源,避免资源泄漏。
- 关于Servlet继承与实现关系:
Servlet 生命周期方法总结
方法 | 描述 |
---|---|
init() | Servlet 初始化,仅调用一次。用于加载配置和初始化资源。 |
service() | 每次请求都会调用,处理请求并分发给 doGet 、doPost 等方法。 |
destroy() | Servlet 被销毁时调用,仅调用一次。用于释放资源或做清理工作。 |
Servlet 生命周期图解
最后一点:
1. 默认情况下
- Servlet 类的加载和实例化通常发生在 用户请求到达时,即“懒加载(Lazy Loading)”模式。
- 流程:
- 客户端发出请求。
- Servlet 容器检查该 Servlet 是否已经加载并初始化。
- 如果没有加载:
- 容器加载 Servlet 类。
- 创建实例并调用
init()
方法。
- 然后调用
service()
方法处理请求
-
配置了
<load-on-startup>
-
如果在
web.xml
文件中为某个 Servlet 配置了<load-on-startup>
参数,Servlet 容器会在服务器启动时加载并初始化该 Servlet,也就是调用init()而不需要等待请求。
<servlet><servlet-name>userServlet</servlet-name><servlet-class>com.gaze.UserServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>
<load-on-startup>
参数说明:
- 正整数:值越小,优先级越高,优先加载。
- 负整数或省略:默认懒加载模式。
场景推荐:
- 如果某个 Servlet 涉及到初始化复杂资源(如数据库连接池),推荐使用
<load-on-startup>
提前加载,以减少首次请求的响应时间。 - 对于无特殊需求的 Servlet,可以保留默认的懒加载行为,节省服务器资源。