zoukankan      html  css  js  c++  java
  • 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对象中使用实例变量,尽量使用局部变量。

  • 相关阅读:
    (初学者)安装hadoop集群注意事项
    配置HADOOP_HOME
    修改用户所在组,修改文件的所有者,明明是自己的文件什么不能解压?
    方法被阻塞,一直要等到线程任务返回结果的例子
    Python复习笔记(一)高级变量类型
    我的vim插件配置
    vim使用笔记
    Linux命令(九)查找文件find
    Linux命令(八)Linux系统信息相关命令
    Linux命令(七)Linux用户管理和修改文件权限
  • 原文地址:https://www.cnblogs.com/798911215-Darryl-Tang/p/9119334.html
Copyright © 2011-2022 走看看