Skip to content

J2EE Servlet 生命周期笔记

1. 什么是Servlet生命周期?

  • 初始化阶段:当Servlet被加载到容器中时,init() 方法会被调用。在此期间,可以进行资源的初始化操作(如数据库连接)。

  • 服务请求阶段:每当有新的HTTP 请求到达服务器,并且该请求映射到了这个Servlet 时,service() 方法会被调用。根据不同的 HTTP 请求方法(GET、POST 等),相应的 doGet(), doPost() 等方法会被自动调用。

  • 销毁阶段:当 Servlet 容器决定移除该Servlet 时,会先调用 destroy() 方法,在此期间释放资源(如关闭数据库连接)。

2. 创建一个演示生命周期的Servlet

java
package com.example.servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/lifecycle")
public class LifecycleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 初始化阶段
    public void init() throws ServletException {
        System.out.println("LifecycleServlet: 初始化完成");
        // 可以在这里初始化资源,如数据库连接等。
    }

    // 处理HTTP GET请求
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        System.out.println("LifecycleServlet: 接收到GET请求");
        
        response.setContentType("text/plain");
        response.getWriter().println("Hello! 这是一个演示Servlet生命周期的示例。");
    }

    // 处理HTTP POST请求
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        System.out.println("LifecycleServlet: 接收到POST请求");
        
        response.setContentType("text/plain");
        response.getWriter().println("处理了你的POST请求!");
    }

    // 销毁阶段
    public void destroy() {
        System.out.println("LifecycleServlet: 正在销毁,释放资源...");
        // 在这里可以进行资源的清理工作。
    }
}

3. 配置web.xml文件(可选)

如果使用注解 @WebServlet 定义URL映射,则不需要手动配置web.xml。但为了完整性,提供一个示例:

xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
          version="3.0">
    <servlet>
        <servlet-name>LifeCycleServlet</servlet-name>
        <class>com.example.servlets.LifecycleServlet</class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LifeCycleServlet</servlet-name>
        <url-pattern>/lifecycle/*</url-pattern>
    </servlet-mapping>
</web-app>

4. 运行环境

  • Tomcat服务器:确保已安装并配置好。

  • 将项目打包为 .war 文件,部署到 Tomcat 的 webapps 目录。

启动 Tomcat 后,访问 http://localhost:8080/YourProjectName/lifecycle 来测试 Servlet 是否正常工作。

5. 使用curl调试代码

测试GET请求:
bash
# 发送GET请求
curl http://localhost:8080/YourProjectName/lifecycle/

# 示例输出:
Hello! 这是一个演示Servlet生命周期的示例。
测试POST请求:
bash
# 发送POST请求,使用-d参数添加数据(可选)
curl -X POST http://localhost:8080/YourProjectName/lifecycle/post

# 示例输出:
处理了你的POST请求!

6. 观察生命周期日志

  • 启动 Tomcat 时查看控制台,确认 init() 方法是否被调用。

  • 在发送每个HTTP 请求时,观察对应的 doGetdoPost 是否被执行。

  • 当停止或重新启动 Tomcat 服务时,检查是否有 destroy() 方法的输出日志。

7. 注意事项

  • 确保在初始化和销毁阶段正确处理资源管理,避免内存泄漏。

  • 在高并发情况下,注意线程安全问题。虽然每个请求都会被独立处理,但共享资源需要适当的同步机制。