详解servlet 生命周期(转载)

Servlet 有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由 javax.Servlet.Servlet 接口的init,service 和destroy 方法表达。

1 、加载和实例化

容器负责加载和实例化一个Servlet 。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该Servlet 为客户请求服务的时候。
首 先容器必须先定位Servlet 类,在必要的情况下,容器使用通常的Java 类加载工具加载该Servlet ,可能是从本机文件系统,也可以是从远程文件系统甚至其它的网络服务。容器加载Servlet 类以后,它会实例化该类的一个实例。需要注意的是可能会实例化多个实例,例如一个Servlet 类因为有 不同的初始参数而有多个定义,或者Servlet 实现SingleThreadModel 而导致容器为之生成一个实例池。

2 、初始化

Servlet 加载并实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过程主要是读取永久的配置信息,昂贵资源(例如JDBC 连接) 以及其它仅仅需要执行一次的任务。通过调用它的init 方法并给它传递唯一的一个(每个Servlet 定义一个)ServletConfig 对象完成这个 过程。给它传递的这个配置对象允许Servlet 访问容器的配置信息中的名称-值对(name-value )初始化参数。这个配置对象同时给 Servlet 提供了访问实现了ServletContext 接口的具体对象的方法,该对象描述了Servlet 的运行环境。

2.1 初始化的错误处理
在初始化期间,Servlet 实例可能通过抛出UnavailableException 或者 ServletException 异常表明它不能进行有效服务。如果一个Servlet 抛出一个这样的异常,它将不会被置入有效服务并且应该被容器立即释 放。在此情况下destroy 方法不会被调用因为初始化没有成功完成。在失败的实例被释放后,容器可能在任何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的Servlet 抛出的异常是UnavailableException 并且该异常指出了最小的无效时间,那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例。

2.2 、工具因素
当工具(注:根据笔者的理解,这个工具可能是应用服务器的某些检查工具,通常是验证应用的合法性和完整性)加载和内省 (introspect )一个web 应用时,它可能加载和内省该应用中的类,这个行为将触发那些类的静态初始方法被执行,因此,开发者不能假定只要当 Servlet 的init 方法被调用后它才处于活动容器运行状态(active container runtime )。作为一个例子,这意味着Servlet 不能在它的静态(类)初始化方法被调用时试图建立数据库连接或者连接EJB 容器。

3 、处理请求

在Servlet 被适当地初始化后,容器就可以使用它去处理请求了。每一个请求由ServletRequest 类型的对象代表,而Servlet 使 用ServletResponse 回应该请求。这些对象被作为service 方法的参数传递给Servlet 。在HTTP 请求的情况下,容器必须提供代表 请求和回应的HttpServletRequest 和HttpServletResponse 的具体实现。需要注意的是容器可能会创建一个Servlet 实例并将之放入等待服务的状态,但是这个实例在它的生存期中可能根本没有处理过任何请求。

3.1 、多线程问题
容器可能同时将多个客户端的请求发送给一个实例的service 方法,这也就意味着开发者必须确保编写的Servlet 可以处理并发问题。如果开发者想防止这种缺省的行为,那么他可以让他编写的Servlet 实现SingleThreadModel 。实现这个类可以保证一 次只会有一个线程在执行service 方法并且一次性执行完。容器可以通过将请求排队或者维护一个Servlet 实例池满足这一点。如果Servlet 是 分布式应用的一部分,那么,那么容器可能在该应用分布的每个JVM 中都维护一个实例池。如果开发者使用synchronized 关键字定义service 方法( 或者是doGet 和doPost) ,容器将排队处理请求,这是由底层的java 运行时系统要求的。我们强烈推荐开发者不要同步service 方法或 者HTTPServlet 的诸如doGet 和doPost 这样的服务方法。

3.2 、处理请求中的异常
Servlet 在对请求进行服务的时候有可能抛出ServletException 或者 UnavailableException 异常。ServletException 表明在处理请求的过程中发生了错误容器应该使用合适的方法清除该请求。 UnavailableException 表明Servlet 不能对请求进行处理,可能是暂时的,也可能是永久的。如果 UnavailableException 指明是永久性的,那么容器必须将Servlet 从服务中移除,调用它的destroy 方法并释放它的实例。如果 指明是暂时的,那么容器可以选择在异常信息里面指明的这个暂时无法服务的时间段里面不向它发送任何请求。在这个时间段里面被被拒绝的请求必须使用 SERVICE_UNAVAILABLE (503) 返回状态进行响应并且应该携带稍后重试(Retry-After )的响应头表明不能服务只是暂时的。容器也可以选择不对暂时性和永久性的不可用 进行区分而全部当作永久性的并移除抛出异常的Servlet 。

3.3 线程安全
开发者应该注意容器实现的请求和响应对象(注:即容器实现的HttpServletRequest 和 HttpServletResponese )没有被保证是线程安全的,这就意味着他们只能在请求处理线程的范围内被使用,这些对象不能被其它执行线程所引用,因为引用的行为是不确定的。

4 、服务结束

容器没有被要求将一个加载的Servlet 保存多长时间,因此一个Servlet 实例可能只在容器中存活了几毫秒,当然也可能是其它更长的任意时间 (但是肯定会短于容器的生存期)当容器决定将之移除时(原因可能是保存内存资源或者自己被关闭),那么它必须允许Servlet 释放它正在使用的任何资源 并保存任何永久状态(这个过程通过调用destroy 方法达到)。容器在能够调用destroy 方法前,它必须允许那些正在service 方法中执行的线 程执行完或者在服务器定义的一段时间内执行(这个时间段在容器调用destroy 之前)。一旦destroy 方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该Servlet ,它必须创建新的实例。destroy 方法完成后,容器必须释放Servlet 实例以便它能够被垃圾回收。

上面的是转载,下面加了点个人总结:从servlet中的方法执行顺序来看servlet的生命周期:

第一步:实例化:执行构造函数;

第二步:初始化:执行init();

第三步:处理请求:执行service();

第四步:结束生命:执行destroy();

详解servlet生命周期相关推荐

  1. 实例化vue发生了什么?(详解vue生命周期)

    实例化vue发生了什么?(详解vue生命周期) 本文将对vue的生命周期进行详细的讲解,让你了解一个vue实例的诞生都经历了什么~ 我在Github上建立了一个存放vue笔记的仓库,以后会陆续更新一些 ...

  2. Vue实例详解与生命周期

    Vue实例详解与生命周期 http://www.jianshu.com/p/b5858f1e6e76 Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理. ...

  3. 详解spring生命周期的扩展点

    详解spring生命周期的扩展点,加速你追赶高手的脚步 详解spring生命周期的扩展点

  4. vue 监控元素宽度_Vue入门系列之Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  5. 微信小程序02【配置详解、生命周期-app对象使用、页面跳转详解】

    学习地址:https://www.bilibili.com/video/BV1sx411z77P 笔记01:https://blog.csdn.net/weixin_44949135/article/ ...

  6. 05Vue.js快速入门-Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  7. 详解vue生命周期(重点!!)

    首先,每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期.首先看一张图吧~这是官方文档上的图片相信大家一定都会很熟悉:   可以看出在vue--整个的生命周期中会有很多 ...

  8. vue 声明周期函数_【Vue】详解Vue生命周期

    Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之 ...

  9. 【Vue】详解Vue生命周期

    Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之 ...

最新文章

  1. 《AngularJS深度剖析与最佳实践》一第1章 从实战开始
  2. MySQL数据库应用第3章操作数据库
  3. html action不起作用,Html.ActionLink做为按钮或图像,而不是连接
  4. DSP2812程序执行过程
  5. Git本地仓库与远程仓库关联
  6. 汽车电子专业知识篇(四)-一文详解无人驾驶中的各种感知传感器
  7. java学习笔记20(Arraylist复习,Collection接口方法,迭代器,增强型for循环)
  8. spi四种工作模式时序图_还没学会SPI总线协议?干货都在这里
  9. 从一个表查询数据插入另一个表
  10. 华为的JAVA面试题及答案(部分)
  11. 2017.10.24 上升序列 思考记录
  12. VC实现将程序最小化到托盘
  13. 开源日志系统比较:scribe,chukwa,kafka,flume
  14. 谈表单的设计 (一) 合理对表单进行布局
  15. 线性时变系统状态方程的解
  16. linux 4k 桌面壁纸,10个值得珍藏的4K高清壁纸网站推荐
  17. 华硕ac68u最佳设置_【华硕RT-AC68U路由器使用总结】频段|设置|信号_摘要频道_什么值得买...
  18. symbian android,Symbian^3对比
  19. 制定标准的重要性和意义_标准的重要性
  20. 通过简单的演示理解TCP/IP网络

热门文章

  1. 智能设备时代的个人生命安全
  2. turtle实现一团乱麻和甜甜圈
  3. 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
  4. android 父控件的背景_android控件的属性
  5. Hive自定义分区器流程
  6. 电子证据是计算机系统,电子证据的分类
  7. Ceph部署(二)RGW搭建
  8. 1.16 利用Multisim 研究图P1.4所示电路在R的阻值变化时二极管的直流电压和交流电流的变化,并总结仿真结果。
  9. C练题笔记之:Leetcode-654. 最大二叉树
  10. 规则引擎代码可视化编辑全梳理