zoukankan      html  css  js  c++  java
  • Servlet对象的生命周期

    1.Servlet对象的生命周期是由谁管理的?程序员可以干涉吗?

      Servlet对象的生命周期包括Servlet对象的创建,方法的调用以及Servlet对象的销毁等过程。

      它的生命周期由Web容器来管理,程序员无权干涉。

    2.描述Servlet对象的生命周期

      1)用户在浏览器中输入URL:http://localhost:8080/prj-servlet-03/testLifeCycle

      2)web容器截取请求路径:/prj-servlet-03/testLifeCycle

      3)web容器在容器上下文中找请求路径所对应的Servlet对象

      4)若没有找到Servlet对象

        4.1)通过web.xml文件中相关的配置信息,得到请求路径/testLifeCycle对应的完整类名

        4.2)通过反射机制,调用Servlet对象的无参构造方法完成实例化

        4.3)web容器调用Servlet对象的init方法完成初始化

        4.4)web容器调用Servlet对象的service方法提供服务

      5)若找到了Servlet对象

        5.1)web容器直接调用Servlet对象的service方法提供服务

      6)web容器关闭/webapp重新部署/Servlet对象长时间没有用户再次访问 的时候,web容器会销毁Servlet对象,在销毁之前调用Servlet对象的destroy方法

    3.关于Servlet对象生命周期的几个总计和注意事项

      1)Servlet对象的构造方法、init方法、destroy方法只执行一次

      2)Servlet对象的service方法,用户请求一次便执行一次

      3)init方法执行的时候,Servlet对象已经创建好了

      4)destroy方法执行的时候,Servlet对象还没有被销毁

    4.关于Servlet对象的线程安全问题

      Servlet对象是单实例的(构造方法,init方法只调用一次,所有用户公用一个Servlet对象),但是不符合单例模式(24设计模式之一,单例模式的构造方法是私有的)。

      而tomcat服务器支持多线程(多用户),所以Servlet对象是在单实例多线程环境下运行的。

      若Servlet对象中有实例变量,并且实例变量涉及修改操作,那么便存在线程安全问题,解决方法是不使用实例变量,使用局部变量。

    5.默认情况下,Servlet对象在web服务器启动阶段不会被实例化。若希望再web服务器(tomcat等)启动阶段实例化Servlet对象,可以再web.xml中进行配置。

    <servlet>
        <servlet-name></servlet-name>
        <servlet-class></servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>

    在上面的<load-on-startup></load-on-startup>标签中设置自然数就可以决定Servlet对象启动时的优先级,自然数越小优先级越高。

    6.访问Servlet时的URL配置

      如上面的xml文本,

      <servlet-name></servlet-name>是Servlet对象的注册名称,随意编写,保证上下两个<servlet-name></servlet-name>标签一致即可

      <servlet-class></servlet-class>是Servlet对象的完整类名,通过反射机制创建Servlet对象

      <url-pattern></url-pattern>是Servlet对象的访问路径配置:必须以"/"开头,且不包含项目名称,注意同一个Servlet可以被映射到多个URL上

        缺省Servlet:<url-pattern>/</url-pattern>

          缺省Servlet用于处理所有其他Servlet都不处理的访问请求

        在URL中使用通配符*:

          只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾。例如 /abc/* 、 /* 、 *.do 

    7.Servlet对象实例化后,Servlet对象被存储到哪里了

      大多数web容器将Servlet对象以及对应的url-pattern存储到Map集合中了:Map<string,Servlet>

      例如:key         value

         /login      LoginServlet对象引用

            /delete   DeleteServlet对象引用

    8.web服务器启动时解析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

    9.Servlet接口中的这些方法编写什么代码

      1)无参构造方法:不考虑写代码,不常用

      2)init方法:Servlet对象创建时需要初始话一些东西时,在这里编写代码

      3)service方法:必然重新,这里写业务逻辑

      4)destroy方法:Servlet对象销毁时执行的代码,不常用

  • 相关阅读:
    知识小罐头05(tomcat8请求源码分析 上)
    知识小罐头04(idea+maven+部署war包到tomcat 下)
    知识小罐头03(idea+maven+部署war包到tomcat 上)
    带着新人学springboot的应用13(springboot+热部署)
    带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)
    带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)
    带着新人学springboot的应用10(springboot+定时任务+发邮件)
    带着新人学springboot的应用09(springboot+异步任务)
    带着新人学springboot的应用08(springboot+jpa的整合)
    windows最简单的局部截图工具
  • 原文地址:https://www.cnblogs.com/luna-hehe/p/14500218.html
Copyright © 2011-2022 走看看