[Servlet扫盲]---(3)Servlet生命周期

声明:

Author:赵志乾

Date:2017-12-31

Declaration:All Right Reserved!!!


1、生命周期

    Servlet容器会负责桥接客户端和Servlet之间的交互,同时也会管理Servlet的生命周期。规范中明确规定生命周期包含加载、实例化、初始化、处理请求和结束服务,其主要是借助于javax.servlet.Servlet接口中的init、service和destroy方法。目前实现Servlet接口的抽象类包括GenericServlet和HttpServlet,当开发人员设计自己的Servlet类时,必须直接或间接地继承两个抽象类中的某一个。

2、加载和实例化

    在Servlet的生命周期中,容器会负责Servlet的加载和实例化。且加载和实例化过程可能会发生在两个时刻:其一就是容器启动时完成加载和实例化;其二就是将该过程延迟到有请求需要处理时才进行。容器主要通过普通的java类加载机制完成Servlet的加载,因此当容器启动后,其必须能够定位出所需要的Servlet类。

    注:容器使用java类加载机制完成Servlet的加载,即可以从本地文件系统、远程文件系统或其他网络服务进行加载。当完成加载后,容器便可对相关类进行实例化。

3、初始化

    Servlet的初始化过程发生于实例化和处理请求之间,主要用于执行一些一次性的动作、初始化一些代价高的资源以及读取配置信息。容器会通过调用实例上的init方法来完成初始化(注:init方法有一个ServletConfig参数用于传入配置信息),但初始化过程未必成功。当初始化过程抛出异常时,容器必须要保证会释放对应的Servlet实例,并于一段时间后在重新实例化的对象上再次调用init方法来完成初始化。

4、处理请求

    完成初始化的Servlet实例,便可以处理容器路由来的请求。容器会负责把客户端发来的请求封装到ServletRequst对象中,而将响应封装在ServletResponse对象中,并把ServletRequest和ServletResponse作为参数传递给实例的service方法。(service方法中完成请求的处理过程,点击查看)在HTTP场景下,容器所提供的请求和响应类型分别为:HttpServletRequest和HttpServletResponse。

5、终止服务

    一个Servlet实例可能在容器中存在几秒、几天甚至几年,这要取决于实际的需求。当容器决定要移除某个Servlet实例时,会通过调用实例上的destroy方法来释放实例所占用的资源并保存实例的持久化状态。当Servlet实例被销毁后,容器便不能再将请求路由到实例上(因为该实例已经不存在了)。如果容器确实需要再次使用已销毁的Servlet实例功能,便会重新实例化一个新的Servlet实例去处理请求,即进入到另一个Servlet实例的生命周期管理中。



参考资料:Servlet3.1规范







猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/78941263