最近在很多面试题都要求将述servlet的生命周期,或者有一些与生命周期及原理有关的问题,简单的总结一下:
Servlet 生命周期
- 应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同状态和不同行为——这就是对象的生命周期。
- Servlet 对象是 Servlet 容器创建的,生命周期方法都是由容器调用的。这一点和我们之前所编写的代码有很大不同。在今后的学习中我们会看到,越来越多的对象交给容器或框架来创建,越来越多的方法由容器或框架来调用,开发人员要尽可能多的将精力放在业务逻辑的实现上。
- Servlet 生命周期的主要过程 ①Servlet 对象的创建 默认情况下,Servlet 容器第一次收到 HTTP 请求时创建对应 Servlet 对象。容器之所以能做到这一点是由于我们在注册 Servlet 时提供了全类名,容器使用反射技术创建了 Servlet 的对象。②Servlet 对象初始化●Servlet 容器创建 Servlet 对象之后,会调用 init(ServletConfig config)方法,对其进行初始化。在 javax.servlet.Servlet 接口中, public void init(ServletConfig config)方法要求容器将 ServletConfig 的实例对象传入,这也是我们获取 ServletConfig 的实例对象的根本方法。
●为了简化开发,GenericServlet 抽象类中实现了 init(ServletConfig config)方法,将 init(ServletConfig config)方法获取到的 ServletConfig 对象赋值给了成员变量ServletConfig config,目的是使其它方法可以共享这个对象。这时有一个问题:如果子类重写了这个 init(ServletConfig config)方法,有可能会导致成员变量 config对象赋值失败。所以 GenericServlet 抽象类另外提供了一个无参的 public void init()方法,并在 init(ServletConfig config)方法中调用,作为子类进行初始化操作时重写使用。而这个无参的 init()方法之所以没有设计成抽象方法,是为了避免子类继承时强制实现这个方法带来的麻烦,使用者可以根据需要选择是否要覆盖这个方法。
③处理请求
●在 javax.servlet.Servlet 接 口 中 , 定 义 了 service(ServletRequest req, ServletResponse res)方法处理 HTTP 请求,同时要求容器将 ServletRequest 对象和
ServletResponse 对象传入。
●在 HttpServlet 抽象类中,service(ServletRequest req, ServletResponse res)方法将 ServletRequest 对象和 ServletResponse 对象强转为了 HttpServletRequest、
HttpServletResponse 子类对象,这样更适合于 HTTP 请求的处理,所以在 doGet()和 doPost()方法中使用的就是 HttpServletRequest、HttpServletResponse 的实现类对象了。
④Servlet 对象销毁
●Web 应用卸载或服务器停止执行时会销毁 Servlet 对象,而销毁之前为了执行一些诸如释放缓存、关闭连接、保存数据等操作,所以设计了 public void destroy()方法。