转载

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执行

本篇文章到此就结束了,主要也是记录我的一个学习过程,请读者带着批判的角度去阅读,如有错误还望纠正

原文  https://segmentfault.com/a/1190000023278584
正文到此结束
Loading...