2019独角兽企业重金招聘Python工程师标准>>>

https://github.com/javahongxi

本文转载自kaitao.toutiao.im

应用生命周期事件

11.1 介绍

应用事件设施给Web应用开发人员更好地控制ServletContext、HttpSession和ServletRequest的生命周期,可以更好地代码分解,并在管理Web应用使用的资源上提高了效率。

11.2 事件监听器

应用事件监听器是实现一个或多个Servlet事件监听器接口的类。它们是在部署Web应用时,实例化并注册到Web容器中。它们由开发人员在WAR包中提供。

Servlet事件监听器支持在ServletContext、HttpSession和ServletRequest状态改变时进行事件通知。Servlet上下文监听器是用来管理应用的资源或JVM级别持有的状态。HTTP会话监听器是用来管理从相同客户端或用户进入web应用的一系列请求关联的状态或资源。Servlet请求监听器是用来管理整个Servlet请求生命周期的状态。异步监听器是用来管理异步事件,例如超时和完成异步处理。

可以有多个监听器类监听每一个事件类型,且开发人员可以为每一个事件类型指定容器调用监听器bean的顺序。

11.2.1 事件类型和监听器接口

事件类型和监听器接口用于监控下表所示的:

表 11-1  Servlet上下文事件

事件类型

描述

监听器接口

生命周期

Servlet上下文刚刚创建

并可用于服务它的第一个请求,

或者Servlet上下文即将关闭

javax.servlet.

ServletContextListener

更改属性

在Servlet上下文的属性已添加、删除、或替换。

javax.servlet.

ServletContextAttributeListener

 

表 11-2  HTTP会话事件

事件类型

描述

监听器接口

生命周期

会话已创建、销毁或超时。

javax.servlet.http.

HttpSessionListener

更改属性

已经在HttpSession上添加、移除、或替换属性。

javax.servlet.http.

HttpSessionAttributeListener

会话迁移

HttpSession已被激活或钝化。

javax.servlet.http.

HttpSessionActivationListener

对象绑定

对象已经从HttpSession绑定或解除绑定

javax.servlet.http.

HttpSessionBindingListener

表 11-3  Servlet请求事件

事件类型

描述

监听器接口

生命周期

一个servlet请求已经开始由Web组件处理。

javax.servlet.

ServletRequestListener

更改属性

已经在ServletRequest上添加、移除、或替换属性。

javax.servlet.

ServletRequestAttributeListener

异步事件

超时、连接终止或完成异步处理

javax.servlet.AsyncListener

11.2.2 监听器使用的一个例子

为了说明事件使用方案,考虑一个包含一些使用数据库的Servlet的简单Web应用。开发人员提供了一个Servlet上下文监听器类用于管理数据库连接。

1. 当应用启动时,监听器类得到通知。应用登录到数据库,并在servlet上下文中存储连接。

2. 应用中的Servlet根据需要,在Web应用的活动期间访问连接。

3. 当Web服务器关闭时,或应用从Web服务器移除时,监听器类得到通知且关闭数据库连接。

11.3 监听器类配置

11.3.1 提供监听器类

Web应用的开发人员提供实现了一个或多个在javax.servlet API中的监听器接口的监听器类。每一个监听器类必须有一个无参构造器。监听器类打包到WAR包中,或者在WEB-INF/classes归档项下,或者在WEB-INF/lib目录的一个JAR内部。

11.3.2 部署声明

监听器类在Web应用部署描述符中使用listener元素声明。它们根据类名列出的顺序就是它们被调用的顺序。与其他监听器不同,AsyncListener类型的监听器可能仅通过编程式注册(使用一个ServletRequest)。

11.3.3 监听器注册

Web容器创建每一个监听器类的一个实例,并在应用处理第一个请求之前为事件通知注册它。Web容器根据他们实现的接口注册监听器实例,且按照它们出现在部署描述符中的顺序。在Web应用执行期间,监听器按照它们注册的顺序被调用。

11.3.4 关闭时通知

在应用关闭时,监听器以它们声明时相反的顺序得到通知,且通知会话监听器在通知上下文监听器之前。通知会话监听器session失效必须在通知上下文监听器关闭之前。

11.4 部署描述符示例

以下示例是注册两个Servlet上下文生命周期监听器和一个HttpSession监听器的部署语法。

假设com.acme.MyConnectionManager和com.acme.MyLoggingModule两个都实现了javax.servlet.ServletContextListener,且com.acme.MyLoggingModule又实现了javax.servlet.http.HttpSessionListener。此外,开发人员希望com.acme.MyConnectionManager在com.acme.MyLoggingModule得到Servlet上下文生命周期事件的通知。下面是这个应用的部署描述符:

Java代码  
  1. <web-app>
  2. <display-name>MyListeningApplication</display-name>
  3. <listener>
  4. <listener-class>com.acme.MyConnectionManager</listener-class>
  5. </listener>
  6. <listener>
  7. <listener-class>com.acme.MyLoggingModule</listener-class>
  8. </listener>
  9. <servlet>
  10. <display-name>RegistrationServlet</display-name>
  11. ...etc
  12. </servlet>
  13. </web-app>

11.5 监听器实例和线程

容器需要在开始执行进入应用的第一个请求之前完成Web应用中的监听器类的实例化。容器必须保持到每一个监听器的引用直到为Web应用最后一个请求提供服务。

ServletContext和HttpSession对象的属性改变可能会同时发生。不要求容器同步到属性监听器类产生的通知。维护状态的监听器类负责数据的完整性且应明确处理这种情况。

11.6 监听器异常

一个监听器里面的应用代码在运行期间可能会抛出异常。一些监听器通知发生在应用中的另一个组件调用树过程中。这方面的一个例子是一个Servlet设置了会话属性,该会话监听器抛出未处理异常。容器必须允许未处理的异常由描述在10.9节“错误处理”的错误页面机制处理。如果没有为这些异常指定错误页面,容器必须确保返回一个状态码为500的响应。这种情况下,不再有监听器根据事件被调用。

有些异常不会发生在应用中的另一个组件调用栈过程中。这方面的一个例子SessionListener接收通知的会话已经超时并抛出未处理的异常,或者ServletContextListener在Servlet上下文初始化通知期间抛出未处理异常,或者ServletRequestListener在初始化或销毁请求对象的通知期间抛出未处理异常。这种情况下,开发人员没有机会处理这种异常。容器可以以HTTP状态码500来响应所有后续的到Web应用的请求,表示应用出错了。

开发人员希望发生在监听器产生一个异常且在通知方法里面必须处理它们自己的异常之后的正常处理。

11.7 分布式容器

在分布式Web容器中,HttpSession实例被限到特定的JVM服务会话请求,且ServletContext对象被限定到Web容器所在的JVM。分布式容器不需要传播Servlet上下文事件或HttpSession事件到其他JVM。监听器类实例被限定到每个JVM的每个部署描述符声明一个。

11.8 会话事件

监听器类提供给开发人员一种跟踪Web应用内会话的方式。它通常是有用的,在跟踪会话知道一个会话是否变为失效,因为容器超时会话,或因为应用内的一个Web组件调用了invalidate方法。该区别可能会间接地决定使用监听器和HttpSession API方法。

转载于:https://my.oschina.net/javahongxi/blog/1555908

Servlet3.1规范翻译 - 应用生命周期事件相关推荐

  1. alert 返回页面 刷新_详解 HTML 页面原生的生命周期事件

    DOMContentLoaded,load,beforeunload,unload HTML 页面的生命周期包含三个重要事件: DOMContentLoaded -- 浏览器已完全加载 HTML,并构 ...

  2. react生命周期_React生命周期事件

    react生命周期 React class components can have hooks for several lifecycle events. React类组件可以具有多个生命周期事件的挂 ...

  3. 使用 Apache OpenJPA 开发 EJB 3.0 应用,第 6 部分: 处理实体生命周期事件的回调

    企业应用开发过程中,经常会存在这样的需求:当企业应用中的某些数据被增加.删除.修改时,引发一些特定的动作,完成企业应用中的一些特别的要求,比如企业应用中要完成数据操作日志.处理数据之间的某种关系.或者 ...

  4. servlet3.1规范翻译:第13章 安全

    servlet3.1规范翻译:第13章 安全 2013-02-21 16:55 1563人阅读 评论(0) 收藏 举报  分类: servlet3.1规范翻译(17)  目录(?)[+] 第13章 安 ...

  5. apache Ignite 节点生命周期事件例子

    例子代码位置 https://github.com/lilihongjava/ignite_examples/tree/main/ignite-02 节点生命周期事件介绍 生命周期事件可以在节点生命周 ...

  6. 不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛

    学习方法之少废话:吹牛.装逼.叫大哥.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBa ...

  7. 详解ASP.NET页面生命周期事件

    下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load(); 5. Hand ...

  8. 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子

    首先要做一个诚挚的道歉,作为大四狗,因为升学的事情,断更两个月,所以要感谢各位仁慈的读者没有脱粉(好像也就50个粉丝).这一节,我们延续上一节制作的页面,来讨论声明周期钩子的事情. 以我的经验来看,多 ...

  9. servlet3.1规范翻译:前言

    应朋友之邀(博客地址:http://jinnianshilongnian.iteye.com/),一起翻译servlet3.1规范,本人不才,英语水平有限,勉强而为之.翻译过程中有很多地方把握不准确, ...

最新文章

  1. 【数据库】兴唐第二十八节课零散知识点汇总
  2. socket PF_INET AF_INET 区别
  3. 0122 - EOS 编程学习日志(1)
  4. 记一次被DDoS敲诈的历程
  5. bios文件查看工具_何必花钱升级显卡!AMD鸡血BIOS杀到
  6. Unity3D Shader入门指南(二)
  7. 华润置地php面试题_从一流到顶流|2020华润置地与沈阳一起美好
  8. LeetCode 1391. 检查网格中是否存在有效路径(BFS)
  9. 高级语言的编译过程和解释过程_进来了解一下C语言真正的编译过程看你掌握了吗?...
  10. 利用python求解节点介数和边介数
  11. RAX,eax,ax,ah,al 关系
  12. [转载] NumPy 基本操作(ndarray通用函数 / 常用函数)
  13. netfilter源码学习
  14. HTG评论Kobo Aura HD:不是Kindle,那还行
  15. 推荐一款开源的电子书格式转换工具
  16. 麻省理工学院——人工智能公开课06
  17. php session fixation,聊聊session fixation attacks
  18. 关于环信客服的集成与使用
  19. python 新闻标题分类_NLPCC2017(中文)新闻标题分类示例代码以及数据描述
  20. 解决Win7无法登陆OneDrive并报错0x8004de40问题(亲测解决)

热门文章

  1. 批处理start命令学习
  2. VC++ 访问数据库实例详解图解
  3. Python+selenium用法 上
  4. 数据结构1_java---单链表的操作,约瑟夫问题
  5. win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)...
  6. Java语言程序设计(基础篇) 第十章 面向对象思考
  7. 在O(N)时间内求解 正数数组中 两个数相加的 最大值
  8. RunTime 入门
  9. 谈谈CListCtrl如何调整行高
  10. java--遍历自定义数组