乐趣区

关于servlet:Servlet的管理机制生命周期和继承关系

Servlet 的管理机制

  • 浏览器每一次拜访服务器都会发送一个信息的申请,每一次发送申请如果是申请操作,那么调用的 Servlet 对象是惟一的。为了保障 Servlet 对象是惟一的,就须要让服务器去治理 Servlet 对象,保障它的唯一性。

治理形式次要有如下两种:(采纳 Tomcat 服务器)

- 立刻加载:当服务器启动时,底层就会依据 web.xml 配置文件找到所有 Servlet 类,并通过反射机制创建对象将对象保留在汇合中,当须要调用 Servlet 对象,就从该汇合中取出来
- 提早加载:当服务器启动时,不会事后创立所有的 Servlet 对象,而是什么时候用到就什么时候创立
  • Tomcat 服务器采纳的是提早加载的形式(这是默认的形式)当 Tomcat 启动的时候,Tomcat 读取了 web.xml 配置文件,首先读取申请的操作名和对应的名字,也就是配置文件中的 url-parttern 和 servlet-name,将这两个名字存入一个键值对的汇合中保存起来。并且还有另一个键值对汇合是用来存储和 servlet-name 对应的 servlet-class,然而这个不是一开始就加载,而是当须要用 Servlet 对象的时候再创立,并将创立之后的对象保留到该汇合中。
  • 咱们能够扭转默认加载的形式,只有在 web.xml 配置文件中,在 <servlet> 下增加一个配置,<load-on-startup> 整数 0 </load-on-startup>
<servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>TestController</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

那么在 Tomcat 启动时,这个 servlet 类就会被创立

Servlet 生命周期

Tomcat 为了更好的治理 servlet 对象的产生和销毁,提供了三个办法标识 Servlet 对象的生命周期,别离是 init(),service()和 destroy();

  • servlet 通过调用 init()办法进行初始化
    因为 servlet 对象是单例的,所以 init() 在 servlet 第一次创立的时候就被调用,之后就不会再被调用
  • servlet 调用 service()来解决客户端发送过去的申请
    每一次服务器收到一个操作申请时,服务器就会产生一个线程并调用 servlet,执行 service()办法
  • servlet 通过调用 destroy()办法中值
    当 servlet 生命周期完结时会调用,会调用一次 destroy() 办法

Servlet 的继承关系

  • HttpServlt 类继承了一个抽象类 GenericServlet
  • GenericServlet 实现了三个接口,别离是 Servlet、ServletConfig 和 Serializable
  • ServletConfig 接口有四个办法

    • String getServletName();
    • ServletContext getServletContext();
    • String getInitParameter(String var1);
    • Enumeration<String> getInitParameterNames();
  • Servlet 接口外面有五个办法

    • void init(ServletConofig var1) throws Exception
    • ServletConfig getServletConfig();
    • void service(ServletRequest var1, ServletResponse var2);
    • void destroy();
    • String getServletInfo();
  • GenericServlet 抽象类(实现了 ServletConfig 和 Servlet 接口,体现出了缺省适配器模式)

    • 将两个接口中的 9 个办法都增加了过去,将其中的 8 个办法都进行了重写,除了 Destroy()
    • 多增加了一个 init()无参数的办法
    • 留下一个办法是没有具体实现的 service 办法
    • 增加了 log()办法
  • HttpServlet 抽象类

    • 存在的目标:
    • 增加了具体的申请形式对应的办法,比方 doGet、doPost
    • HttpServlet 保留了 GenericServlet 抽象类的 Service,本人增加了一个带两个参数 HttpServletRequest 和 HttpServletResponse 的 service 办法,保留的这个 service 最终调用了自带的 service 形式。
    • 本人增加的 service 办法内容先获取申请的形式,最初调用绝对应的办法比方 doGet/doPost 执行

本篇文章到此就完结了,次要也是记录我的一个学习过程,请读者带着批评的角度去浏览,如有谬误还望纠正

退出移动版