• 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对象中使用实例变量,尽量使用局部变量。

  • 相关阅读:
    直接插入排序学习笔记
    选择排序学习笔记
    冒泡排序学习笔记
    阿里云ssl证书申请及域名绑定流程
    Nginx user_agent、if指令及全局变量
    rewrite和return笔记
    rewrite和return的简单需求
    Nginx Rewrite正则表达式案例
    linux下WordPress伪静态规则设置
    集群前后端分离(api接口)
  • 原文地址:https://www.cnblogs.com/798911215-Darryl-Tang/p/9119334.html
Copyright © 2020-2023  润新知