Servlet 是一种基于 Java 的 Web 组件,它运行在 Web 服务器中,处理客户端的请求并生成响应。Servlet 的生命周期由 Servlet 容器(例如 Tomcat)管理,包括从创建到销毁的多个阶段。
Servlet 的生命周期主要包括以下几个阶段:
1. 加载与实例化
当 Servlet 容器启动时,或者当请求到达一个尚未实例化的 Servlet 时,Servlet 容器会根据 web.xml 配置文件中的定义或注解来加载并实例化相应的 Servlet 类。
- 如果
load-on-startup
配置了某个值,Servlet 会在服务器启动时加载并实例化。 - 如果没有配置,则 Servlet 会在第一次请求到达时被加载并实例化。
2. 初始化
在 Servlet 实例化之后,Servlet 容器会调用 Servlet 的 init()
方法进行初始化。该方法只会在 Servlet 的生命周期中被调用一次,主要用于执行一些初始化操作(例如:数据库连接的建立、资源加载等)。
java
public void init() throws ServletException {
// 初始化代码
}
init()
方法接收一个 ServletConfig
对象作为参数,它提供了 Servlet 配置信息,包括 Servlet 的初始化参数。
3. 请求处理
在 Servlet 被初始化后,每当有客户端的请求到达时,Servlet 容器会调用 service()
方法来处理请求。service()
方法接收两个参数:
HttpServletRequest
:包含客户端请求的各种信息(如请求参数、请求头等)。HttpServletResponse
:用于发送响应给客户端。
通常,service()
方法会根据请求的 HTTP 方法(如 GET、POST、PUT、DELETE 等)调用对应的 doGet()
、doPost()
等方法来处理具体的请求。
java
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 根据请求类型调用相应的方法,如 doGet、doPost
}
例如,HttpServlet
类实现了 service()
方法,并将请求委托给 doGet()
或 doPost()
等方法。
4. 销毁
当 Servlet 容器决定卸载 Servlet 时,会调用 destroy()
方法来销毁 Servlet 实例,释放相关资源。destroy()
方法在 Servlet 的生命周期中只会调用一次,通常用于执行清理操作,例如关闭数据库连接、释放占用的系统资源等。
java
public void destroy() {
// 清理资源代码
}
5. Servlet 生命周期总结
- 加载与实例化:当容器启动或第一次请求时,Servlet 被加载并实例化。
- 初始化 :Servlet 实例化后,容器调用
init()
方法进行初始化。 - 请求处理 :每次请求到达时,容器调用
service()
方法来处理请求。 - 销毁 :当 Servlet 被销毁时,容器调用
destroy()
方法。
6. 示例代码
java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 初始化操作
System.out.println("Servlet 初始化...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理 GET 请求
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello, Servlet!</h1>");
}
@Override
public void destroy() {
// 清理操作
System.out.println("Servlet 销毁...");
}
}
7. Servlet 生命周期的控制
- web.xml 配置 :Servlet 的生命周期可以通过
web.xml
中的配置进行控制。例如,可以使用load-on-startup
配置来确保 Servlet 在容器启动时加载。
XML
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
注解配置:Servlet 3.0 引入了注解,允许通过注解来配置 Servlet。
java
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
// Servlet 代码
}
总结
Servlet 的生命周期包含四个主要阶段:加载与实例化、初始化、请求处理、销毁。开发者可以在这些生命周期方法中编写初始化、请求处理和资源清理的代码,确保 Web 应用程序的正常运行。