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方法(或者是doGetdoPost),容器将排队处理请求,这是由底层的java运行时系统要求的。我们强烈推荐开发者不要同步service方法或者HTTPServlet的诸如doGet和doPost这样的服务方法。
3.2、处理请求中的异常

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

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

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

转载于:https://www.cnblogs.com/phoebus0501/archive/2010/12/21/1913250.html

Servlet规范定义的Servlet 生命周期相关推荐

  1. servlet规范定义的Servlet生命周期

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

  2. Servlet的执行原理与生命周期

    先从 Servlet 容器说起:大家最为熟悉的 Servlet 容器就是 Tomcat ,Servlet 容器是如何管理 Servlet 的? 先看一下 Tomcat 的容器模型: 从上图可以看出 T ...

  3. JavaWeb第一讲 Servlet的工作原理及生命周期

    Servlet的工作原理及生命周期 (一)Tomcat容器模型 Servlet的运行离不开Tomcat,那我们先弄清楚Tomcat的容器模型. 由上图可以看出,在Tomcat下有一个Container ...

  4. servlet,session对象的生命周期

    谈到javaweb首先想到的就是servlet,说道servlet就会想到servlet的生命周期 那么servlet到底是什么时候出生,什么时候死亡叻 说道他的生命周期 就绕不过servlet的三个 ...

  5. javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)

    1.关于系统架构 1.1系统架构包括 C/S架构: Client/Server(客户端/服务器) 例如电脑上安装的各种软件,qq等,需要安装特定的软件 优点: 速度快(软件中数据大部分在客户端中,少量 ...

  6. python变量生命周期_python 变量定义及变量生命周期

    第一部分 最近在写Python的时候发现一个好玩的现象,就是在if else重定义的变量,没有声明全局,在外部也可以使用, 这里涉及到一个python变量生命周期的问题. python能够改变变量作用 ...

  7. 软件测试基础知识(二)------------等价类划分法、边界值分析法、场景法、错误推测法、bug定义/类型/优先级/生命周期/跟踪管理

    等价类划分法 是把程序的输入域划分成若干个子集合(等价类),然后从每个子集合(等价类)中选取少数具有代表性的数据作为测试的输入数据. 在该子集合中,所有的输入数据对于揭露软件中的错误都是等效的.--- ...

  8. Spring第一天 IOC 控制反转JavaBean规范 Bean的作用域 生命周期 依赖注入

    Spring:是软件框架,是软件半成品,包含了很多组件. 核心组件:ioc容器 IOC控制反转: 由代码自己控制对象的创建,称为:主动控制(自己new对象,自己炒番茄炒蛋) 有一个组件容器管理对象,应 ...

  9. java之Servlet的生命周期

    Servlet运行在Servlet容器中,其生命周期由容器来管理.Servlet的生命周期通过javax.servlet.Servlet接口中的init().service()和destroy()方法 ...

最新文章

  1. 人脸识别技术及其应用领域
  2. DNN(DotNetNuke)研究资源
  3. Retrofit2 源码解析之动态代理
  4. SQL Server 2008如何进行数据库同步?
  5. leetcode算法题--删除排序链表中的重复元素 II
  6. 更新鸿蒙系统运行评价,全球首批!升级使用鸿蒙OS真实反馈评价出炉:差评/好评都很真实...
  7. 雷,大学教科书竟然使用番茄花园盗版系统
  8. python一行代码迷宫_通过Python代码实现走迷宫的方法
  9. 挑战安卓会死?华为鸿蒙正为国产操作系统杀出一条路 | 涛滔不绝
  10. 探索将scratch3移植到树莓派
  11. linux检测摄像头驱动程序,linux usb 摄像头测试软件
  12. fedora14命令行界面自动root权限登录
  13. 视频录制软件哪个好,推荐几款简单实用的视频课件录制软件
  14. X310系列USRP使用LAN口MATLAB控制方法
  15. HDU 5855 二分搜索+最大流
  16. tr命令解析_学习笔记
  17. 网络急速诊断,快速测试网络速度
  18. 删库跑路、“投毒”、改协议,开源有哪几大红线千万不能踩?
  19. mysql汉字插不进去_Mysql下插入汉字失败
  20. DFS and BFS

热门文章

  1. 长篇小说《世界上最幸福的人》获得好评
  2. 从身体扮演到身份确认:谈谈EMI的人体自拍作品
  3. rmmod 提示 No such file or directory
  4. Linux-Android启动之Init进程前传
  5. Linux 内核源代码的目录结构
  6. 鸿蒙之下5怎么跳城池,鸿蒙之空间道尊
  7. mysql reflush pri_Mysql Flush privileges命令的功能与使用
  8. mysql 8核16g参数优化_问个 MySql 优化问题, 16G, 8 核服务器??
  9. 基于CNN的性别、年龄识别及Demo实现
  10. JavaScript----BOM(浏览器对象模型)