关于Servlet对象的生命周期

时间:2021-12-07 21:02:09
1.生命周期
一个Java对象从最初被创建,到最后被销毁,所经历里的过程


2.servlet对象从最初的创建,方法的调用,以及对象的销毁,都是由web容器(Web Container)管理的,程序员无权干涉。


3.默认情况下,servlet对象在web服务器启动阶段中不会被实例化,若需要启动时实例化,则需要特殊的设置


4.概述servlet对象生命周期
1)用户在浏览器地址栏输入URL
2)web容器截取请求路径
3)web容器在容器上下文中招请求路径
1>通过web.xml文件中的相关配置信息找到请求路径
2>通过反射机制,调用servlet的无参构造方法完成servlet对象的实例化
3>web容器调用servlet的init()方法完成初始化操作
4>web容器调用servlet的service()方法提供服务
5)若找到对应的servlet对象
1>web容器直接调用servlet的service()方法提供服务
6)web容器关闭的时候、webapp重新部署的时候、该servlet对象长时间无用户再次访问时,web容器会将该servlet对象销毁。
  销毁值前,web容器会调用servlet的destroy()方法,完成销毁之前的准备。

5.总结
1.servlet类的构造方法只执行一次
2.servlet对象的init()只执行一次
3.servlet对象的service()方法用户调用一次,执行一次
4.2.servlet对象的destroy()只执行一次


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


7.servlet对象是单例,但是不符合单例模式。只能成为伪单例。真单例的构造方法是私有化的,Tomcat服务器是支持1多线程的
所以servlet对象在单实例多线程的环境下运行。

那么servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个servlet对象一定存在线程安全问题,不建议在servlet对象中使用实例变量。尽量使用局部变量。


8.Servlet对象实例化之后,被存放在哪里?
   大多数web容器都是将Servlet对象以及对应的URL-pattern存放在Map集合中
        在web容器中有一个Map集合
        Map<String,Servlet>集合
        key                            value
        ------------------------------------
        /login                         LoginServlet对象引用
        /delete                        DeleteServlet对象引用
        /save                          SaveServlet对象引用
        
        
9.服务器在启动的时候就会解析各个webapp的wed.xml文件,做了什么?
    将web.xml文件中的url-pattern相对应地Servlet完整类名存到Map集合中。
    在web容器中有一个Map集合
    Map<String,Servlet>集合
         key                            value
        ----------------------------------------------
        /login                        javaweb.servlet.LoginServlet
        /delete                        javaweb.servlet.DeleteServlet


10.Servlet接口中的方法什么时候用?
     1)无参构造方法(以后不要再考虑构造函数了)
     2)init()方法
     以上两个方法执行时间几乎是相同的,执行次数都是一次。构造方法执行时对象正在创建,init方法执行的时候,对象已经被创建好了。
     若系统要求在对象创建时刻执行一段特殊程序,这段程序尽量写到init方法中。
     为什么不建议写到构造方法中?
         存在风险
         当程序员编写构造函数时,可能会导致无参构造方法不存在
         一个类不编写任何构造函数,默认有一个无参构造。但是一旦编写一个有参数的构造函数,系统则不再提供无参构造函数。
         
     
     Servlet中的init方法是SUN公司为Javaweb程序员提供的一个初始化时刻。若希望在初始化时刻编写一段特殊程序。则可以编写到init方法中。
     
     
11.service方法
   这个方法是必然要重写的。因为这个方法要完成哑无逻辑的处理,请求的处理,以及完成的响应。
   而且这个方法中的代码(业务代码)是最有价值的,也是最难写的。
   
   
12.destroy方法
   这个方法是SUN公司为Javaweb程序员提供的一个特殊时刻。这个时刻就是对象的销毁时刻
   若希望在对象销毁时刻编写一段特殊程序。则可以编写到destroy方法中,自动被容器调用。