servlet生命周期

本文详细解析了Servlet的生命周期,包括init(初始化)、service(服务请求)和destroy(销毁)方法的执行时机,以及如何影响服务器创建和对象销毁的过程。通过实例和实验验证了各阶段的行为。
摘要由CSDN通过智能技术生成

想要知道servlet的生命周期是怎样的,不妨我们先去看一下servlet接口中有什么吧!

查看源码发现,servlet接口中有以下五个方法:

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    void destroy();

    String getServletInfo();

    ServletConfig getServletConfig();
}

我们知道,getxxxx()这类的方法通常是获取信息用的,我们这里研究的是servlet生命周期,因此先不需要看getSerevletInfo()和getServletConfig()这两个方法。其余三个方法,通过翻译可知,init是初始化,service是服务,destroy是销毁,根据其意思我们也可以猜测到,这三个方法是跟生命周期有关的,所以接下来我们主要对这三个方法进行研究。

先写一个测试类实现servlet接口:

package com.qqq.lifetime;
import jakarta.servlet.*;
import java.io.IOException;

public class LifeTimeTest01 implements Servlet {

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            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;
    }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0"
         metadata-complete="true">
    <servlet>
        <servlet-name>lifetimetest01</servlet-name>
        <servlet-class>com.qqq.lifetime.LifeTimeTest01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>lifetimetest01</servlet-name>
        <url-pattern>/lifetimetest01</url-pattern>
    </servlet-mapping>
</web-app>

然后启动服务器,查看控制台:

可以看到,控制台并没有输出以上三个方法中的输出信息,由此可以猜测,启动服务器 时,这三个方法都没有被执行,我们可以是认为servlet对象是没被创建吗?为了证明我们的猜测,可以在此servlet类中添加一个无参数的构造方法:

public LifeTimeTest01(){
        System.out.println("servlet对象被创建了,无参构造方法执行了");
    }

重启服务器,控制台如下:

由此可以证明我们的猜测是正确的:在服务器启动时,servlet对象没有被创建出来。 

那servlet对象什么时候被创建出来的呢?接下来,复制控制台中的地址http://localhost:8080/lifetime,再加上请求路径http://localhost:8080/lifetime/lifetimetest01,向服务器发送一次请求,控制台如下:

无参构造,init(),service()这三个方法执行了,servlet对象被创建出来了,由此可知,当我们向服务器发送请求时,servlet对象被创建。但servlet对象是谁给创建出来的呢? 我们并没有new对象啊!通过这个测试可知,servlet对象并不是我们程序员创建出来的,而是web服务器给创建出来的

再发一次请求,控制台如下:

第三次请求,控制台如下:

 

由此得出结论:init()方法在第一次请求时执行,并只执行一次,而service()方法请求一次,执行一次,请求几次便执行几次

现在只剩下destroy()方法没被执行了,根据其意思销毁,我们可以猜测一下,是不是该方法在对象被销毁的时候执行?对象什么时候被销毁呢?是不是在关闭服务器的时候呢?接下来带着我们的猜测去测试一下,关闭服务器,控制台如下:

servlet对象被创建了,无参构造方法执行了
init()方法执行了
service()方法执行了
service()方法执行了
service()方法执行了
destroy()方法执行了

 由此说明,我们的猜测正确:destroy()方法在服务器被关闭的时候执行。这里有一个关键问题,destroy()方法执行的时候,servlet对象有被服务器销毁掉吗?答案是没有的。destroy()是servlet类中的实例方法,实例方法必须通过对象的方式才能被执行,若对象被销毁掉,destroy方法就无法执行了,所以,destroy()方法被执行的时候,servlet对象没有被销毁,只有当destroy()方法执行完后,服务器再将其销毁。

若要是想在服务器启动时就创建servlet对象,则在web.xml文件中加入以下代码:

<servlet>
        <servlet-name>lifetimetest01</servlet-name>
        <servlet-class>com.qqq.lifetime.LifeTimeTest01</servlet-class>

        //启动服务器时创建servlet对象
        <load-on-startup>1</load-on-startup>

</servlet>
<servlet-mapping>
        <servlet-name>lifetimetest01</servlet-name>
        <url-pattern>/lifetimetest01</url-pattern>
</servlet-mapping>

<load-on-startup>正整数</load-on-startup>,该标签里的整数越小,它所对应的servlet对象越先被创建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值