Servlet 的生命周期由 Web 容器(如 Tomcat)管理,分为以下三个阶段:
init()
)
)。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>
service()
)ServletRequest
和 ServletResponse
对象。service(ServletRequest req, ServletResponse res)
方法。service()
方法根据请求类型(GET/POST)自动调用 doGet()
或 doPost()
。destroy()
)destroy()
方法。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[垃圾回收]
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();
}
}
}