Servlet生命周期

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Servlet⽣命周期
Servlet 的⽣命周期就是 Servlet 从创建到销毁的过程。

Servlet 的⽣命周期由 Servlet 容器管理,主要分为以下 3 个阶段。

初始化阶段
运⾏时阶段
销毁阶段
在 javax.servlet.Servlet 接⼝中定义了 3 个⽅法:init()、service()、destory(),它们分别在 Servlet ⽣命周期的不同阶段被 Servlet 容器调⽤。

初始化阶段
Servlet 初始化是其⽣命周期的第⼀个阶段,也是其他阶段的基础。

只有完成了初始化,Servlet 才能处理来⾃客户端的请求。

Servlet 初始化阶段分为 2 步:
加载和实例化 Servlet;
调⽤ init() ⽅法进⾏初始化。

1. 加载和实例化 Servlet
Servlet 容器负责加载和实例化 Servlet。

当容器启动或⾸次请求某个 Servlet 时,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进⾏加载。

加载成功后,容器会通过反射对 Servlet 进⾏实例化。

因为 Servlet 容器是通过 Java 的反射 API 来创建 Servlet 实例的,需要调⽤ Servlet 的默认构造⽅法(default constructor,即不带参数的构造⽅法),所以在编写 Servlet 类时,不能只提供⼀个带参数的构造⽅法。

2. 调⽤ init() ⽅法进⾏初始化
加载和实例化完成后,Servlet 容器调⽤ init() ⽅法初始化 Servlet 实例。

初始化的⽬的:让 Servlet 实例在处理请求之前完成⼀些初始化⼯作,例如建⽴数据库连接,获取配置信息等。

在 Servlet 的整个⽣命周期内,init() ⽅法只能被调⽤⼀次。

初始化期间,Servlet 实例可以通过 ServletConfig 对象获取在 web.xml 或者 @WebServlet 中配置的初始化参数。

运⾏时阶段
运⾏时阶段是 Servlet ⽣命周期中最重要的阶段。

Servlet 容器接收到来⾃客户端请求时,容器会针对该请求分别创建⼀个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传⼊ service() ⽅法内,并调⽤该⽅法对请求进⾏处理。

这⾥需要注意的是,执⾏ service() ⽅法前,init() ⽅法必须已成功执⾏。

在 service() ⽅法中,Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。

在请求处理完成后,通过 ServletResponse 对象将响应信息进⾏包装,返回给客户端。

当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。

在 Servlet 的整个⽣命周期内,对于 Servlet 的每⼀次请求,Servlet 容器都会调⽤⼀次 service() ⽅法,并创建新的 ServletRequest 和 ServletResponse 对象。

即 service()⽅法在 Servlet 的整个⽣命周期中会被调⽤多次。

销毁阶段
当 Servlet 容器关闭、重启或移除 Servlet 实例时,容器就会调⽤ destory() ⽅法,释放该实例使⽤的资源,例如:关闭数据库连接,关闭⽂件的输⼊流和输出流等,随后该实例被Java 的垃圾收集器所回收。

对于每个 Servlet 实例来说,destory() ⽅法只能被调⽤⼀次。

Servlet ⽣命周期执⾏流程
Servlet ⽣命周期流程如下图所⽰。

在 Servlet 的整个⽣命周期中,创建 Servlet 实例、init() ⽅法和 destory() ⽅法都只执⾏⼀次。

当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调⽤它的 service()⽅法,为接收到的请求服务。

⽰例
下⾯通过⼀个案例加深对 Servlet ⽣命周期的理解。

1. 在 servletDemo 项⽬中,对 MyServlet.java 进⾏修改,代码如下:
package net.biancheng.www;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private int initCount = 0;
private int httpCount = 0;
private int destoryCount = 0;
@Override
public void destroy() {
destoryCount++;
super.destroy();
// 向控制台输出destory⽅法被调⽤次数
System.out.println(
"**********************************destroy⽅法:" + destoryCount + "*******************************");
}
@Override
public void init() throws ServletException {
initCount++;
super.init();
// 向控制台输出init⽅法被调⽤次数
System.out.println("init⽅法:" + initCount);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
httpCount++;
// 控制台输出doGet⽅法次数
System.out.println("doGet⽅法:" + httpCount);
// 设置返回页⾯格式与字符集
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
// 向页⾯输出
writer.write("初始化次数:" + initCount + "<br/>" + "处理请求次数:" + httpCount + "<br/>" + "销毁次数:" + destoryCount); writer.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
__EOF__。

相关文档
最新文档