JAVAEE_Servlet_03_Servlet对象生命周期

Servlet的对象声明周期

* 什么是对象生命周期?

       - 生命周期表示一个JAVA对象从创建到销毁的过程是一个生命周期



*  Servlet对象生命周期
  
      1. Servlet对象创建         无参构造

      2. Servlet对象初始化        init()

      3. Servlet对象服务的执行    service()

      4. Servlet对象被销毁        destroy()




* Servlet对象的生命周期可以干涉吗?
       
   > 程序员无法干涉Servlet的生命周期,甚至Servlet对象相关方法的调用程序员也是无权干涉的

   > Servlet对象从创建--->方法的调用---->最后销毁,整个过程都是由web容器来管理的(服务器)

   > WebContainer 来管理Servlet的生命周期

 *  描述Servlet的生命周期?
     
     >  1.首先用户在浏览器的地址栏中输入URL,发出请求。
       
     >  2.服务器截取请求路径

     >  3.服务器在请求上下文中找到该请求路径对应的Servlet对象

     >  4.若没有找到对应的Servlet对象。
          
  	- 会通过Web.xml中的相关配置信息,得到该请求路径的Servlet完整类名。
  	
  	- 然后通过反射机制,调用该Servlet类的无参数构造方法,完成Servlet对象的实例化,
  	
  	- 然后服务器调用Servlet对象的init方法进行初始化。

  	- 然后服务器调用Servlet对象的Service方法提供服务


     >  5.若找到了对应的Servlet对象
          
  	- 服务器直接调用Servlet对象的Service方法提供服务

     >  6.Web容器在关闭的时候/Webapp重新部署的时候/该Servlet对象长时间没有用户再次访问的时候,Web容器会将该Servlet对象销毁,在销毁该对象之前,Web容器会调用该对象的destory方法,完成销毁前的准备


  *  Servlet对象总结:
     
       > Servlet类的构造方法只执行一次

   > Servlet对象的init方法只执行一次

   > Servlet对象的Service方法只要用户请求一次,就会执行一次

   > Servlet对象的destory方法只执行一次。


* Servlet注意
       
   > init方法执行的时候,Servlet对象已经被创建好

   > destory方法执行的时候,Servlet对象还没有被销毁,即将被销毁。

   > Servlet对象是单例,但不符合单例模式,只能称为伪单例,真单例的构造方法是私有化的,所以Servlet对象是在单例多线程的环境下运行的。

   > 因为Servlet对象是单例多线程的,所以在Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。


* Servlet对象实例化之后放在哪里?
    
    > 大多数的Web容器都是将Servlet对象以及对应的url-pattern存储到了Map集合中。

    > 在Web容器中存在这样一个Map集合
       
       Map<String, Servlet>
    
      Key                Value
  ---------------------------------
    /login        loginServlet对象引用

    /delete       deleteServlet对象引用

    /Save         saveServlet对象的引用


       


  * 在JavaWeb网站中的所有Servlet接口实现类的实例对象,只能由服务器负责创建,开发人员不能手动创建Servlet接口实现类的实例对象。

  * 在默认情况下,服务器接收到浏览器对于当前Servlet接口实现类的第一次请求时,服务器会自动创建这个Servlet接口的实例对象。如果浏览器没有请求这个Servlet实例对象,那么服务器也就不会创建这个实例对象。

  * 在手动配置情况下,是可以要求服务器启动的时候就自动创建该Servlet接口的实例对象,无论浏览器有没有请求该对象。

     - 配置方法: 在web.xml中进行手动配置

     <servlet>
       <servlet-name><servlet-name>
       <servlet-class></servlet-class>
       <load-no-startup>1</load-on-startup><!-- 在该标签中填写一个整数,就代表告诉服务器,在启动时就自动创建该Servlet实例对象,数字越小优先级越高,越先创建,0的优先级最高-->
     </servlet>

  * 在服务器运行期间,一个Servlet接口实现类,只能创建一个实例对象(一个进程(Servlet接口实现类的实例对象)  对应  多个线程(用户请求),无论有多少个用户请求来访问该Servlet实例对象,都只是访问的同一个Servlet实例对象)

  * 在服务器关闭的时候,会将所有创建的Servlet实现类的实例对象销毁。

  * 在Servlet接口实现类中的构造方法必须使用public修饰,要不然就会报错: HTTP状态 500  实例化Servlet类[com.shige.controller.OneServlet]异常

  * 在Servlet接口实现类中重写doGet()和doPost()方法,在正常实现这些方法的时候,不应该调用super.xxx()方法,而是重新去实现这些方法,要不然就会报错  HTTP状态 405 - 方法不允许 此URL不支持Http方法GET。
posted @ 2021-04-19 16:47  失昼  阅读(70)  评论(0)    收藏  举报