Servlet 生命周期概述
Servlet的生命周期由Servlet容器(如Tomcat)管理,主要包括初始化、服务和销毁三个阶段。每个阶段对应特定的方法,开发者可以通过重写这些方法实现自定义逻辑。
初始化阶段(init)
当Servlet第一次被请求或容器启动时,容器会调用init()方法进行初始化。该方法仅在Servlet生命周期中执行一次。
java
public void init(ServletConfig config) throws ServletException {
// 初始化代码(如数据库连接、配置文件加载)
}
ServletConfig参数提供Servlet的配置信息(如web.xml中的<init-param>)。- 若初始化失败,抛出
ServletException,Servlet不会被加载。
服务阶段(service)
初始化完成后,Servlet进入服务阶段。每次客户端请求时,容器会调用service()方法处理请求。
java
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 根据请求方法(GET/POST)调用doGet()或doPost()
}
- 默认实现根据HTTP方法(GET、POST等)分发到对应的
doGet()、doPost()等方法。 - 开发者通常直接重写
doGet()或doPost(),而非service()。
销毁阶段(destroy)
当容器决定卸载Servlet(如应用关闭或资源回收时),会调用destroy()方法释放资源。
java
public void destroy() {
// 清理资源(如关闭数据库连接)
}
- 方法执行后,Servlet实例被标记为可垃圾回收。
生命周期流程图
- 容器加载Servlet类。
- 调用
init()初始化。 - 对每个请求调用
service()(内部调用doGet()/doPost())。 - 容器卸载时调用
destroy()。
注意事项
- 线程安全 :Servlet是单例的,多个请求共享同一实例。避免在
service()或doGet()/doPost()中使用实例变量。 - 懒加载 :可通过
<load-on-startup>配置在容器启动时立即初始化。 - 重新初始化 :Servlet被销毁后,若再次请求,容器会重新创建实例并调用
init()。