Servlet的生命周期

本文详细探讨了Servlet的生命周期,包括Tomcat如何在用户访问时创建Servlet对象,执行init、service和destroy方法。通过三个测试,展示了Servlet的初始化、多次访问及销毁过程。了解到可以通过配置`<load-on-startup>`标签来改变Servlet的加载时机,使其在Tomcat启动时即创建对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet 的生命周期

一个 Servlet开始死亡

1、示例代码

首先看以下的示例代码,这是一个最为普通的 Servlet 实现

import javax.servlet.*;
import java.io.IOException;


public class StudentServlet implements Servlet {

    /**
     * 无参构造
     */
    public StudentServlet() {
        System.out.println("无参构造方法执行了");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init 方法执行了");
    }


    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        System.out.println("service 方法执行了");
    }

    @Override
    public void destroy() {
        System.out.println("destroy 方法执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }


}
1.1、测试1

然后开始使用 Tomcat 执行:

Tomcat输出了以下内容:

无参构造方法执行了
init 方法执行了
service 方法执行了
1.1.1、测试1 结论

得出结论:

  • 1)Tomcat 执行的时候 首先会在用户访问 Servlet 的时候创建 该 Servlet 对象
  • 2)然后 Tomcat 会调用 init 方法
  • 3)之后调用 service 方法
1.2、测试2

然后我再次刷新 3次 网页:

Tomcat输出了以下内容:

service 方法执行了
service 方法执行了
service 方法执行了
1.2.1、测试2 结论

得出结论:

  • Tomcat 执行的时候 首先会在用户访问 Servlet 的时候创建 该 Servlet 对象,然后,在创建的时候调用一次 init 方法,之后每次刷新都会调用 service 方法。(Tomcat 只会创建一次该对象,假单例模式)
1.3、测试3

最后我在 idea 里面关闭 Tomcat 的执行

Tomcat输出了以下内容:

destroy 方法执行了
1.3.1、测试3 结论

得出结论:

  • 由此可见 Tomcat 会在 Servlet 对象销毁前调用 destroy 方法(因为如果不可能在对象销毁后调用,没有对象调用不了)

得出最终结论:

Tomcat 会在用户访问某个 Servlet 的时候创建该 Servlet 对象,执行无参构造方法,然后会在执行的时候调用一次 init 方法,之后每一次访问该 Servlet 的时候都是调用该 ServletService 方法,最后在(Tomcat关闭) 对象销毁前 Tomcat 会调用一次 destroy方法(遗书)死亡前调用一次。


Servlet 方法调用顺序

image-20220427162507514

不等用户访问先创建Servlet对象:

Tomcat 默认是当用户第一次访问 Servlet 的时候创建该Servlet对象。如果想不等待用户访问,在启动 Tomcat 的时候立即创建对象,如下:

在对应的Servlet xml 配置文件里面加上如下:

<load-on-startup>0</load-on-startup>

里面的参数是一个正整数,当有多个 Servlet 都配置了 ‘<load-on-startup>0</load-on-startup>’ 的时候,里面的参表示其创建对象的优先级,正整数越小,就越先创建对象

如下为启动 Tomcat 的时候输出:(用户还未访问)

无参构造方法执行了
init 方法执行了

以上如果有任何问题还请及时指出,谢谢,希望对你有用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值