栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb:Servlet对象的生命周期

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb:Servlet对象的生命周期

Servlet对象的生命周期

用户第一次请求

  • Tomcat服务器通过反射机制,调用无参数构造方法,创建Servlet对象。
  • Tomcat服务器调用Servlet对象的init方法完成初始化。
  • Tomcat服务器调用Servlet对象的service方法处理请求。

用户第二次到第n次请求

  • Tomcat服务器调用Servlet对象的service方法处理请求。
  • Tomcat服务器调用Servlet对象的service方法处理请求。

服务器关闭

  • Tomcat服务器调用Servlet对象的destroy方法,做销毁之前的准备工作。
  • Tomcat服务器销毁Servlet对象。
编写测试代码

LifeCycleServlet.java

public class LifeCycleServlet implements Servlet {
    
    // 不建议手动编写构造方法,因为可能导致Servlet对象无法实例化
    // 无参构造,在对象实例化时执行
    public LifeCycleServlet() {
        System.out.println("LifeCycleServlet的无参数构造方法执行了!");
    }

    // init方法通常是用来完成初始化操作的,只在对象实例化后执行一次,与无参构造方法几乎在同一时间执行
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("LifeCycleServlet的init方法执行了!");
    }

    // service方法是处理用户请求的核心方法,用户发送一次请求就执行一次
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("LifeCycleServlet的service方法执行了!");
    }

    // destroy方法只在对象销毁之前调用一次
    @Override
    public void destroy() {
        System.out.println("LifeCycleServlet的destroy方法执行了!");
    }

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

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

web.xml


    LifeCycleServlet
    cn.lwx.javaweb.servletLifeCycle.LifeCycleServlet
    
    


    LifeCycleServlet
    /life

默认情况下服务器启动的时候LifeCycleServlet对象并没有被实例化

用户发送第一次请求的时候,控制台输出了以下内容:

LifeCycleServlet的无参数构造方法执行了!
LifeCycleServlet的init方法执行了!
LifeCycleServlet的service方法执行了!

根据以上输出内容得出结论:

  1. 用户在发送第一次请求的时候Servlet对象被实例化(LifeCycleServlet的无参数构造方法被执行了)
  2. LifeCycleServlet对象被创建出来之后,Tomcat服务器马上调用了LifeCycleServlet对象的init方法。
  3. 用户发送第一次请求的时候,init方法执行之后,Tomcat服务器马上调用AServlet对象的service方法。

用户继续发送第二次请求,控制台输出了以下内容:

LifeCycleServlet的service方法执行了!

根据以上输出结果可得,用户在发送第二次,或者第三次,或者第四次请求的时候,Servlet对象并没有新建,还是使用之前创建好的Servlet对象,直接调用该Servlet对象的service方法,这说明:

  1. Servlet对象是单例的(单实例的。但是要注意:Servlet对象是单实例的,但是Servlet类并不符合单例模式。我们称之为假单例。之所以单例是因为Servlet对象的创建我们javaweb程序员管不着,这个对象的创建只能是Tomcat来说了算,Tomcat只创建了一个,所以导致了单例,但是属于假单例。真单例模式,构造方法是私有化的。)
  2. 无参数构造方法、init方法只在第一次用户发送请求的时候执行。也就是说无参数构造方法只执行一次。init方法也只被Tomcat服务器调用一次。
  3. 只要用户发送一次请求,service方法必然会被Tomcat服务器调用一次。

关闭服务器的时候,控制台输出了以下内容:

LifeCycleServlet的destroy方法执行了!

根据以上输出内容得出结论:

  1. Servlet的destroy方法只被Tomcat服务器调用一次。
  2. destroy方法是在服务器关闭的时候被调用。
    • 因为服务器关闭的时候要销毁AServlet对象的内存。
    • 服务器在销毁 LifeCycleServlet 对象内存之前,Tomcat服务器会自动调用LifeCycleServlet对象的destroy方法。

总结:

  • 构造方法只在Servlet对象被实例化时执行一次。
  • init方法只在Servlet对象被实例化后执行一次。
  • service方法在用户发送一次请求时执行一次,发送N次请求则执行N次。
  • destroy方法只在对象销毁时执行一次。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878589.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号