Servlet生命周期是最常见一个面试题了,binsk至少被问到过3次啦,对于如此热门的面试话题,我们今天就来彻底研究下,以免再配到此类问题不能顺畅回答。

servlet是个啥玩意呢?先简单介绍下,servlet是server + applet的缩写,即服务器小程序。在狭义的定义中,servlet是java web应用的web容器初始化时自动生成的一个单例对象。

1 概览

图中所示,tomcat容器是包含一层一层的子容器,一个服务启动相当于一个Engine容器,每个虚拟主机表示一个Host,每个Host的上下文(文件目录等)信息包含在Context中,一个context即一个web应用,每个context中有用包含着多个Servlet,每个servlet是由Wrapper容器调用。Wrapper最典型的实现为StandardWrapper实现了ServletConfig接口。

2 领域模型

servlet所有的类都包括在servlet-api.jar中只要web容器依赖了api,就可以通过继承HttpServlet创建相应的Servlet。

由上图可见新建一个自定义的customServlet需要继承HttpServlet, HttpServlet又继承了GenericServlet,这个通用Servlet是一个抽象类,其中封装了很多钩子方法给子类调用。它实现了Servlet,ServletConfig这两个接口,这两个接口定义了Servlet api主要功能,ServletConfig包括getServiletContext, servletContext是所有Servlet可共享读取的上下文。 而getInitParameter则是读取当前Servlet的初始化参数。Servlet接口中定义了Servlet的标准方法init, service, destory,其中HttpServlet根据method和header执行service方法,包括了get,post,header等方法。

3 生命周期

Servlet生命周期主要为init->serivce->destroy,其中init方法只加载一次,destroy方法只在停止servlet服务时调用,另外停止web服务时也会调用。

4 监听器

Servlet监听器是Servlet容器提供用户接口的经典利器。主要包含三种:ServletContextListener, 对Servlet上下文(配置信息等)监听,HttpSessionListener对HttpSession监听。ServletRequestListener对Request请求监听。spring框架的根据scope也分成了各种监听器,但都是基于servlet进行扩展的。其实servlet对监听器分了两大类:

event:
ServletContextAttributeListener//添加/删除全局属性
ServletRequestAttributeListener//请求属性添加和修改
ServletRequestListener//请求初始化和销毁触发
HttpSessionIdListener//servlet3.1加入session id改变
HttpSessionAttributeListener/添加/删除属性

life sycle:
ServletContextListener //servlet context初始化(全局监听,容器启动等)和销毁
HttpSessionListener//http serssion创建和销毁

servlet监听器的原理是web容器初始化时通过EvnetListener的子类的预加载,放入缓存 applicationEventListenersList中,当调用相关方法时,再通过notifyXXX从缓存中拿出Listenter,通过instanceof判断是否存在当前事件的监听器,存在则触发相应的事件(调用模板方法,Listener设计模式是典型的模板方法)。