1、Servlet的继承关系

假如现有我们自定义的一个Servlet,继承HttpServlet,那么实际上它的继承链如下图:
 
可以看到,核心的部分在于:
  • 两个顶级接口
    • Servlet
    • ServletConfig
  • 接口的实现类
    • GenericServlet
  • 基于HTTP协议的实现类
    • HttpServlet

我们剥离一下,把不需要看的去掉,再把方法显示一下,可清晰知道Servlet的整体继承关系如下:


 其中重点摘录部分进行说明:

  • ServletConfig  Servlet的配置信息,常用来在Servlet初始化时进行信息传递
    • getServletContext()  获取Servlet运行的上下文环境对象,可以获取对应信息(如Servlet路径),存取容量级的变量
    • getInitParameter(String name)  获取初始化参数(web.xml中配置的init-param)

  • GenericServlet  一般的Servlet,实现了Servlet和ServletConfig接口
    • init(ServletConfig config)  初始化方法,方法中调用了init()
    • init()  初始化方法,方法体为空,主要用于自定义Servlet的覆盖
    • service(ServletRequest request, ServletResponse response)  抽象方法service,要求继承类实现
    • destory()  Servlet销毁前要执行的方法

  • HttpServlet  基于HTTP协议的实现类
    • service(ServletRequest request, ServletResponse response) 实现了GenericServlet的抽象方法,调用了service(HttpServletRequest, HttpServletResponse)
    • service(HttpServletRequest request, HttpServletResponse response)  根据请求的不同调用了doGet或doPost方法
    • doGet()  处理GET方式的请求
    • doPost()  处理POST方式的请求

其中稍微提一下,在GenericServlet中有个init(ServletConfig config)方法,调用了init()方法,但是init()方法体却为空,为什么?

public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
4
 
1
public void init(ServletConfig config) throws ServletException { 
2
    this.config = config;
3
    this.init();
4
}
public void init() throws ServletException {

}
x
 
1
public void init() throws ServletException {
2

3
}

首先,为了方便能够在其他地方也能直接使用ServletConfig对象,而不仅仅局限在init(ServletConfig config)方法中,所以创建一个私有的成员变量config,在init(ServletConfig config)方法中就将其赋值给config,这样一来,GenericServlet和其子类都可以调用其getServletConfig()方法来获取ServletConfig对象了。

之所以有空的init(),实际上就是为了后续的扩展和重写,有需要的情况下去覆盖init()而不是去覆盖init(ServletConfig config),因为后者一旦覆盖,就无法通过上述的方法在其他地方便捷地调用getServletConfig方法获取ServletConfig对象了。

实际上,Servlet继承关系文字描述起来反而复杂,结合继承图和源码查看,能更加清晰明了,这里进行了大概的阐述,更多细节的话需要查看源码或者API了,此处不再详细展开。

2、Servlet的生命周期

Servlet之间的启动是有先后顺序的,这可以在web.xml中通过<load-on-startup>标签进行设定,参数为数字,表示了启动的顺序。启动顺序的默认值是0:
  • load-on-startup --> 0:Servlet被访问时才进行实例化
  • load-on-startup --> other:在容器启动时进行Servlet实例化

即是说,默认不配置该参数的情况下,Servlet只有再被访问时才会实例化;配置了参数以后,根据参数按顺序在容器启动时就将Servlet实例化。

然后,Servlet的生命周期,其实说来也简单:
  • 容器在加载Servlet的时候,会执行其init()方法
  • 当接收请求的时候,会调用service(ServletReqeust request, ServletResponse response)方法,继而调用doGet或doPost方法
  • 在服务器关闭之前,会调用Servlet的destory()方法

即:
  • init()
  • doGet() / doPost()
  • destory()

实际上,完整一点来说:
  • 初始化
    • 构造方法
    • init(ServletConfig config)
    • init()
  • 提供服务
    • service(ServletRequest request, ServletResponse response)
    • doGet() / doPost()
  • 销毁
    • destory()

(写得有点啰嗦...)

 
最后简单总结下要点:
  • Servlet只初始化一次,它是单例的,只有一个实例,通过多线程访问。即Servlet是多线程单实例的
  • 实例化过程中,先调用构造方法,再调用init方法,所以初始化操作可以覆盖写到init方法中
  • 请求方式不同会调用doGet()或doPost()方法
  • 根据实际情况在Servlet销毁前调用其destroy()方法
 

[03] Servlet继承关系和生命周期的更多相关文章

  1. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  2. JavaWeb之 Servlet执行过程 与 生命周期

    Servlet的概念 什么是Servlet呢? Java中有一个叫Servlet的接口,如果一个普通的类实现了这个接口,这个类就是一个Servlet.Servlet下有一个实现类叫HttpServle ...

  3. JavaEE Servlet 核心方法及生命周期

    做JavaWeb开发,免不了要和Servlet打交道.Servlet是Sun(Oracle)官方定义的一个Web开发规范,所有Servlet开发都必须遵守.自己以前也没有从头做过Web开发,所以这方面 ...

  4. [转]JavaWeb之 Servlet执行过程 与 生命周期

    https://www.cnblogs.com/vmax-tam/p/4122105.html Servlet的概念 什么是Servlet呢? Java中有一个叫Servlet的接口,如果一个普通的类 ...

  5. 【servlet】Servlet的API和生命周期]

    创建时间:6.15 一.Servlet的API(生命周期) (1)Servlet接口中的方法 1)init(ServletConfig config) 何时执行:servlet对象创建的时候执行 Se ...

  6. Servlet运行原理以及生命周期

    一.Servlet生命周期: Servlet加载.实例化.初始化.服务.销毁. 1.初始化init(): 当服务启动时,Servlet被装入tomcat或者其他服务器容器时执行(服务器容器从启动到停止 ...

  7. Servlet执行流程和生命周期【慕课网搬】

    Servlet执行流程(GET方式为例) 首先用户客户端浏览器发出Get方式(点击超链接方式)向浏览器发出请求. 服务器接收到客户端点击超链接,接收到GET请求之后,服务器到WEB.xml中<s ...

  8. servlet入门学习之生命周期

    一. 什么是Servlet Servlet是用Java语言编写的服务器端小程序,驻留在web服务器中,并在其中运行,扩展了web服务器的动态处理功能. 用java语言编写的java类 在web容器中运 ...

  9. 什么是Servlet,Servlet的作用,生命周期,如何创建、配置Servlet

    什么是Servlet,作用是? servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要.servlet由se ...

随机推荐

  1. C#写入文件的几种方式

    1. FileStream.Write string filePath = Directory.GetCurrentDirectory() + "\\" + Process.Get ...

  2. 【Centos7 GRUB】修改开机等待时间

    centos7与之前版本不同,在/boot/grub/下没有 grub.conf文件,但在/etc/grub2/grub.cfg可找到帮助信息 [root@za default]# cat /boot ...

  3. Springboot系列文章

    一.springboot简介1.前世今生 在boot没有出现之前,基于spring的开发,常常需要配置大量的xml文件.工程狮们苦不堪言,渐渐厌倦了配置文件的复制黏贴.spring家族因为这件事,也经 ...

  4. spring boot整合Thymeleaf的那些坑(spring boot 学习笔记之四)

    这里简单记录一下Thymeleaf配置和使用的步骤 1.修改pom文件,添加依赖 <dependency> <groupId>org.springframework.boot& ...

  5. php 自己封装的一些函数

    手机归属地函数 function get_mobile_area($phone){ $sms = array('province'=>'', 'supplier'=>''); //初始化变 ...

  6. Ext.data.Store添加动态参数

    多条件查询页面的参数都是动态的,并且我们通常还会有默认加载页面.此时,动态添加参数非常重要,其中baseparam是解决问题的关键. @ 将查询条件定义为一个全局变量 var param_01 = & ...

  7. jQuery选中下拉列表,输出值

    jQuery部分: $("#form1 select").change(function () { var s=[]; $("#form1 select :selecte ...

  8. TC358775XBG:MIPI DSI转双路LVDS芯片简介

    TC358775XBG是一颗MIPI DSI转双路LVDS芯片,通信方式:IIC/MIPI command mode,分辨率1920*1200,封装形式:BGA64.

  9. 云计算的三种服务模式IaaS、PaaS和SaaS的差别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt363 云服务"现在已经快成了一个家喻户晓的词了.如果你不知道Paa ...

  10. 8.中断按键驱动程序之poll机制

    本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢.之前的测试程序是这样: ) { read(fd, &key_val, ); printf(" ...