• Servlet 的生命周期 及 注意事项 总结


                                                        Servlet的生命周期

    • 图解Servlet的生命周期

    20180126171821

    • 生命周期的各个阶段

      • 实例化 :Servlet 容器创建 Servlet 的实例
      • 初始化 :该容器调用init() 方法
      • 请求处理 :如果请求Servlet,则容器调用 service()方法
      • 服务终止 :销毁实例之前调用destroy() 方法
    • Servlet生命周期详解

    Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。常用的tomcat、jboss、weblogic都是Servlet容器)中的,其生命周期是由容器来管理。Servlet的生命周期通过java.servlet.Servlet接口中的init()、service()、和destroy()方法表示。Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。

    • 加载并实例化

    ​ Servlet容器负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,Servlet通过类加载器来加载Servlet类,加载完成后再new一个Servlet对象来完成实例化。

    • 初始化

    ​ 在Servlet实例化之后,容器将调用init()方法,并传递实现ServletConfig接口的对象。在init()方法中,Servlet可以部署描述符中读取配置参数,或者执行任何其他一次性活动。在Servlet的整个生命周期类,init()方法只被调用一次。

    • 请求处理

    ​ 当Servlet初始化后,容器就可以准备处理客户机请求了。当容器收到对这一Servlet的请求,就调用Servlet的service()方法,并把请求和响应对象作为参数传递。当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。通过分析ServletRequest或者HttpServletRequest对象,service()方法处理用户的请求,并调用ServletResponse或者HttpServletResponse对象来响应。

    • 销毁

    ​ 一旦Servlet容器检测到一个Servlet要被卸载,这可能是因为要回收资源或者因为它正在被关闭,容器会在所有Servlet的service()线程之后,调用Servlet的destroy()方法。然后,Servlet就可以进行无用存储单元收集清理。这样Servlet对象就被销毁了。这四个阶段共同决定了Servlet的生命周期。

    20150628211705937

    Servlet生命周期,即阐述Servlet从产生到毁灭的整个过程。 

     在Servlet产生到消亡的过程中,有三个生命周期函数,初始化方法init(),处理客户请求的方法service(),终止方法destroy()。

    init方法
            在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。 
            关于init方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求改Servlet是调用,你也可以设置该Servlet在服务器启动后自动执行。 
    init方法负责简单的创建或者加载一些数据,这些数据将用于该Servlet的整个生命周期中。

    service方法
            当一个客户请求改Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。 
            每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。 
            service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。

    destroy方法
            该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。

    doGet、doPost方法
            实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。


    1、什么是生命周期?

    生命周期表示一个java对象从最初被创建到最终被销毁,经历的所有过程。

    2、Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?
    Servlet对象的生命周期,javaweb程序员是无权干涉的,包括该Servlet对象的相关方法的调用,javaweb程序员也是无权干涉的。
    Servlet对象从最初的创建,方法的调用,以及最后对象的销毁,这个过程,是由Web容器来管理的。
    Web Container管理Servlet对象的生命周期。

    3、“默认情况下”,Servlet对象在WEB服务器启动阶段不会被实例化。【若希望在Web服务器启动阶段实例化Servlet对象,需要进行特殊的设置】

    4、描述Servlet对象的生命周期
    1)用户在浏览器中输入Serlvet的URL
    2)web容器截取请求链接
    3)web容器在容器上下文中找请求路径对应的Servlet对象
    4)若没有找到对应的Servlet对象
        4.1)通过web.xml文件中的相关配置信息,得到请求路径对应的Servlet对象
        4.2)通过反射机制,调用Servlet类的无参构造方法完成Servlet对象的实例化
        4.3)web容器调用Servlet对象的init方法完成实例化操作
        4.4)web容器调用Servlet对象的service方法提供服务
    5)若找到对应的Servlet对象
        5.1)web容器直接调用Servlet对象的service方法提供服务
    6)web容器关闭的时候/webapp重新部署的时候/该Servlet对象长时间没有用户再次访问的时候,web容器会将该Serlvet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destory方法,完成销毁之前的准备。

    5、总结:
    5.1)Servlet类的构造方法只执行一次
    5.2)Servlet对象的init方法只执行一次
    5.3)Servlet对象的service方法,只要用户请求一次,则执行一次
    5.4)Servlet对象的destory方法,只执行一次

    6、注意
    init方法执行的时候,Servlet对象已经被创建好了。
    destory方法执行的时候,Servlet对象还没有被销毁,即将被销毁

    7、Servlet对象是单例,但是不符合单例测试,只能称为伪单例。真单例的构造方法是私有化的,Tomcat服务器是支持多线程的。所以Servlet对象在单实例多线程的环境下运行的。那么Servelet对象中若有示例变量,并且示例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。

  • 相关阅读:
    Java8 Stream Function
    PLINQ (C#/.Net 4.5.1) vs Stream (JDK/Java 8) Performance
    罗素 尊重 《事实》
    小品 《研发的一天》
    Java8 λ表达式 stream group by max then Option then PlainObject
    这人好像一条狗啊。什么是共识?
    TOGAF TheOpenGroup引领开发厂商中立的开放技术标准和认证
    OpenMP vs. MPI
    BPMN2 online draw tools 在线作图工具
    DecisionCamp 2019, Decision Manager, AI, and the Future
  • 原文地址:https://www.cnblogs.com/798911215-Darryl-Tang/p/9119334.html
Copyright © 2020-2023  润新知