servlet生命周期

来源:互联网 发布:国家博物馆淘宝 编辑:程序博客网 时间:2024/06/07 15:31
prj.servlet-03
    servlet的生命周期
      1 什么是生命周期?
          生命周期表示一个Java对象从最初被创建到最终被销毁经历的所有过程
      2 Servlet对象的生命周期谁来管理?程序员可以干涉么?
      Servlet对象的生命周期,javaweb程序员无权干涉,包括Servlet对象的相关方法的调用,javaweb
      程序员也是无权干涉的
      Servlet对象从最初的创建,方法的调用以及对象的销毁整个过程有WEB容器来管理。
      Web Container管理Servlet对象的生命周期。
      3 “默认情况下”,Servlet对象在WEB服务器启动阶段不会实例化。【若希望在WEB服务器启动阶段实例化Servlet对象,需要进行特殊设置】
      4 描述Servlet对象生命周期
         1)用户在浏览器地址栏上输入URL:http://localhost:8080/prj.servlet-03/testLifeCycle
         2)web容器截取请求路径:/prj.servlet-03/testLifeCycle
         3)web容器在容器上下文中找请求路径/prj.servlet-03/testLifeCycle对应的Servlet对象
         4)若没有找到对应的Servlet对象
            4.1)通过web.xml文件中相关文件的配置信息,请求得到路径/testLifeCycle对应的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容器会将Servlet对象
         销毁,在销毁该对象之前,Web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。
       5 总结:
        5.1 Servlet类的构造方法只执行一次
        5.2 Servlet对象的init方法只执行一次
        5.3 Servlet对象的service方法用户请求一次,则执行一次
        5.4 Servlet对象的destroy方法只执行一次
       6 注意:
         init方法执行的时候,Servlet对象已经被创建好了。
         destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁。
       7 Servlet对象是单例,但是不符合单例模式。真单例的构造方法是私有化的,tomcat服务器支持多线程。
                      所以Servlet对象在单实例多线程的环境下运行。那么Servlet对象中若有实例变量,并且实例变量涉及
                     修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用
                    局部变量。 
      8 若希望在web容器启动阶段实例化Servlet对象,需要在web.xml中进行相关配置。例如:
 
 <servlet>
 <servlet-name>welcomeServlet</servlet-name>
     <servlet-class>com.bjpowernode.javaweb.servlet.WelcomeServlet</servlet-class>
  <load-on-startup>0</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>welcomeServlet</servlet-name>
 <url-pattern>/welcome</url-pattern>
 </servlet-mapping>
        <load-on-startup>0</load-on-startup>中间的自然数越小优先级越高。
      9 Servlet对象实例化之后,这个Servlet对象被存储在哪里?
                  大多数的WEB容器都是将该Servlet对象以及对应的URL-pattern存储到map集合中了。
                   在WEB容器中有这样一个Map集合
               Map<String,Servlet>集合
               key           value
           -----------------------------
              /login         LoginServlet对象的调用
              /delete        DeletServlet对象引用
              /save          SaveServlet对象引用
     10 服务器在启动的时候就会解析各个webApp的web.xml文件,做了什么?
                    将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了:
                    在Map<String,String> 集合
           Key           value
        ---------------------------------------
        /login      com.bjpowernode.javaweb.servlet.LoginServlet
        /delete     com.bjpowernode.javaweb.servlet.DeleteServlet
        .......
      11 Servlet接口这些方法中编写什么代码?什么时候使用这些方法?
       1)无参数构造方法【以后不考虑构造函数论,尽量别动构造函数】
       2)init方法
                     以上两个方法执行时间几乎相同,执行次数都以一次,构造方法执行的时候对象正在创建,init方法执行时,对象已经创建:
                     若系统要求在对象创建时刻执行一段特殊的程序,这端程序尽量卸载init方法中
                     为什么不建议将代码编写到构造函数中呢?
                                存在风险,当程序员编写构造方法的时候,可能会导致无参数构造方法不存在。
                                 一个类不编写任何构造函数,默认有一个无参数的构造方法,但是一旦编写有参数的构造方法之后,系统
                                 则不在提供无参数构造函数。
      Servlet中的init方法是sun送死为javaweb程序员专门提供的一个初始化时刻,
                          若希望初始化时刻执行一段特殊的程序,这个程序可编写到inti方法,将会被自动调用         
       3)service方法   
                      这个方法必然要重写,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
                      而且这个方法中的代码最优价值。
                      也是最难编写的,最难编写的就是业务代码。
       4)destroy方法 
                      这个方法也是SUN公司为javaweb程序员提供的一个特殊的时刻,这个特殊的时刻被称为对象销毁时刻,
                        若希望在销毁时刻执行一段特殊的代码,需要将这段程序编写到destroy方法中,将会被自动调用
                        
                                类加载时刻,代码编写在哪里?
                                     静态代码块中
                       结论:
             sun公司为我们程序员提供了很多个不同时刻 ,若要在这个特殊的时刻执行特殊程序,这些程序是有位置编写的。
                
3 0
原创粉丝点击