Servlet类的生命周期

Servlet 与普通 Java 类的区别

Servlet 是一个供其他 Java 程序(Servlet 引擎)调用的 Java 类,它不能独立运行,其运行完全由 Servlet 引擎来控制和调度。

针对客户端的多次 Servlet 请求,通常情况下服务器只会创建一个 Servlet 实例对象。也就是说 Servlet 实例对象一旦创建,就会驻留在内存中,为后续的其它请求服务,直至 Web 容器退出,Servlet 实例对象才会销毁。

在 Servlet 的整个生命周期内,init 方法只被调用一次。而对一个 Servlet 的每次访问请求,Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 service() 方法,service 方法再根据请求方式分别调用 doXXX 方法。

Servlet 生命周期

Servlet 从产生到毁灭的整个过程包含三个生命周期函数:

方法说明
init()初始化方法,整个生命周期中只执行一次
service()处理客户请求的方法
destroy()终止方法,销毁时调用

init 方法

在一个 Servlet 的生命周期中,init 方法只会被执行一次,之后无论用户执行多少次请求都不会再调用。关于 init 方法的执行时机,默认是在服务器启动后第一个用户请求该 Servlet 时调用,也可以配置为服务器启动后自动执行。init 方法负责创建或加载一些数据,供该 Servlet 整个生命周期使用。

service 方法

当一个客户请求该 Servlet 时,实际的处理工作全部由 service 方法完成。每一次请求服务器都会开启一个新的线程并执行一次 service 方法。service 根据客户端的请求类型,调用 doGetdoPost 等方法。service 由 Web 容器调用,无需对其做额外处理,它会自动根据请求类型分派到对应的方法。

destroy 方法

该方法在整个生命周期中也只会被调用一次,在 Servlet 对象被销毁时调用。可以在其中做一些资源释放操作,之后 Servlet 对象等待 JVM 垃圾回收机制回收。

执行顺序演示

创建 HomeServlet,重写构造函数、initservicedestroydoGetdoPost 方法:

package com.foxdevelop.demo;

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

public class HomeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public HomeServlet() {
        // 构造函数
    }

    public void init(ServletConfig config) throws ServletException {
        // 初始化
    }

    public void destroy() {
        // 销毁
    }

    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().write("service---");
        super.service(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().write("doGet----");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().write("doPost----");
    }
}Code language: JavaScript (javascript)

执行顺序说明

  • 第一次请求(GET 方式):构造函数 → initservicedoGet
  • 第二次及后续请求:直接执行 servicedoGet(或 doPost,取决于请求方式)
  • POST 请求servicedoPost
  • destroy 方法:在 Servlet 销毁时由容器调用(如停止服务器)

时序图

客户端请求 → Web容器 → 创建Servlet实例 → 调用构造函数 → 调用init()
                                        ↓
客户端请求 → Web容器 → 调用service() → 根据请求方式调用doGet()/doPost() → 返回响应
                                        ↓
客户端请求 → Web容器 → 调用service() → 根据请求方式调用doGet()/doPost() → 返回响应
                                        ↓
停止服务器 → Web容器 → 调用destroy() → 等待GC回收

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注