Servlet 对象的生命周期

Servlet 对象的生命周期

Servlet 的生命周期由 Web 容器(如 Tomcat)管理,分为以下三个阶段:


️ 1. 初始化阶段 (init())
  • 触发时机:当容器第一次收到针对该 Servlet 的请求时,或容器启动时(若配置了 )。
  • 执行方法:调用 init(ServletConfig config) 方法。
  • 特点
    • 仅执行一次,用于加载资源(如数据库连接、配置文件)。
    • ServletConfig 对象提供初始化参数(在 web.xml 中配置)。
  • 示例配置
    <servlet>
        <servlet-name>ExampleServletservlet-name>
        <servlet-class>com.example.ExampleServletservlet-class>
        <init-param>
            <param-name>configparam-name>
            <param-value>valueparam-value>
        init-param>
        <load-on-startup>1load-on-startup>  
    servlet>
    

⚙️ 2. 请求处理阶段 (service())
  • 触发时机:每次客户端请求该 Servlet 时。
  • 执行方法
    • 容器创建 ServletRequestServletResponse 对象。
    • 调用 service(ServletRequest req, ServletResponse res) 方法。
    • service() 方法根据请求类型(GET/POST)自动调用 doGet()doPost()
  • 特点
    • 可多次执行(每个请求独立线程)。
    • 线程不安全!避免使用实例变量存储请求相关数据。

️ 3. 销毁阶段 (destroy())
  • 触发时机:容器关闭或应用重新部署时。
  • 执行方法:调用 destroy() 方法。
  • 特点
    • 仅执行一次,用于释放资源(如关闭数据库连接)。
    • 执行后 Servlet 实例被垃圾回收。

生命周期流程图

graph LR
    A[容器启动] --> B{是否配置 load-on-startup?}
    B -->|是| C[调用 init()]
    B -->|否| D[等待第一次请求]
    D --> C
    C --> E[调用 service() 处理请求]
    E --> F[多次处理请求]
    F --> G[容器关闭/重新部署]
    G --> H[调用 destroy()]
    H --> I[垃圾回收]

⚠️ 关键注意事项

  1. 线程安全
    • 避免在 Servlet 中使用实例变量(可能被多线程同时修改)。
    • 必要时用同步锁(但会降低性能)。
  2. 单例模式
    • 每个 Servlet 类只有一个实例,所有请求共享该实例。
  3. 资源释放
    • destroy() 中必须释放长期占用的资源(如数据库连接)。

代码示例

public class ExampleServlet extends HttpServlet {
    private Connection dbConnection; // 需谨慎使用(非线程安全)

    @Override
    public void init() throws ServletException {
        // 初始化数据库连接
        dbConnection = DriverManager.getConnection("jdbc:mysql://localhost/db");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) {
        // 处理 GET 请求(使用局部变量确保线程安全)
        String data = req.getParameter("data");
        // ...
    }

    @Override
    public void destroy() {
        // 关闭数据库连接
        if (dbConnection != null) {
            dbConnection.close();
        }
    }
}

你可能感兴趣的:(Servlet 对象的生命周期)