一、Servlet 生命周期
Servlet 生命周期流程如下图所示:
在 Servlet 的整个生命周期中,创建 Servlet 实例、init() 方法和 destory()方法都只执行一次。当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service() 方法,为接收到的请求服务。
二、与 Servlet 生命周期有关的方法
与 Servlet 生命周期有关的方法一般有以下三个:
init() 方法 init() 方法是在创建 Servlet 对象时被调用,而且只能被调用一次,用于 Servlet
对象在整个生命周期内的唯一一次初始化。只有在 init() 方法调用成功后,Servlet 才会处于服务状态,才能够去处理客户端的请求。service() 方法 service() 方法是 Servlet 工作的核心方法。当客户端请求访问 Servlet
时,Servlet 容器就会调用 service() 方法去处理来自客户端的请求,并把处理后的响应返回给客户端。destroy() 方法 destory() 方法是 Servlet 容器回收 Servlet
对象之前调用的,且只会调用一次,而此时的服务器处于停止状态或者访问资源已经被移除。
上图描述了 Servlet 的完整生命周期,按照功能的不同,大致可以将 Servlet 的生命周期分为三个阶段:
1. 初始化阶段
2. 运行阶段
3. 销毁阶段
1) 初始化阶段
当用户第一次向 Servlet 容器发出 HTTP 请求要求访问某个 Servlet 时,Servlet 容器会在整个容器中搜索该 Servlet 对象,发现这个 Servlet 对象没有被实例化,于是创建这个 Servlet 对象,然后调用该对象的 init() 方法完成初始化。
当用户第二次访问这个 Servlet 时,Servlet 容器仍然在容器中搜索该 Servlet 对象,结果找到了该对象的实例,则不去创建而直接使用该对象。
找到了对应的 Servlet 对象,随后 Servlet 进入到运行阶段。
需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只被调用一次。
2) 运行阶段
这是 Servlet 生命周期中最核心的阶段。在该阶段中,Servlet 容器会为当前的请求创建一个 ServletRequest 对象和一个 ServletResponse 对象(它们分别代表 HTTP 请求和 HTTP 响应),并将这两个对象作为参数传递给 Servlet 的 service() 方法。
service() 方法从 ServletRequest 对象中获得用户的详细请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。
需要强调的是,在 Servlet 的整个生命周期内,用户每次请求访问 Servlet 时,Servlet 容器都会调用一次 Servlet
的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象。
3) 销毁阶段
当服务器停止时,Servlet 容器需要回收 Servlet 对象所占用的内存,在回收之前,会自动调用该对象的 destroy() 方法做好回收内存前的准备,辟如关闭后台线程。
和 init() 方法类似,destroy() 方法也只会被调用一次。
注意:Servlet 对象一旦创建就会驻留在内存中一直等待客户端的访问,直到服务器关闭或项目被移除出容器时,Servlet 对象才会被销毁。
三、示例
代码示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("调用了init方法");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用了service方法");
}
@Override
public void destroy() {
System.out.println("调用了destroy方法");
}
}
四、总结
对 Servlet 声明周期的几点汇总:
1.Servlet 对象被创建之后执行 init() 方法,并且 init() 方法只执行一次,其主要目的是完成 Servlet对象的初始化工作。
2.对于 Servlet 对象的 service() 方法,只要用户请求一次,那么 service() 方法就执行一次。
3.Servlet 对象被回收之前,destroy() 方法会被调用,该方法只执行一次,执行的时候 Servlet 对象还在。
Servlet 对象的创建、对象提供服务、对象的销毁等操作皆由 Servlet 容器来管理,Java 程序员的任务只是负责编写 Servlet 类,无法干涉 Servlet 对象的生命周期。