首页 > 其他分享 >Servlet3.1规范翻译 - 应用生命周期事件

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

时间:2022-11-30 13:38:47浏览次数:50  
标签:Web 翻译 生命周期 应用 servlet Servlet3.1 事件 监听器 Servlet


应用生命周期事件

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上下文生命周期事件的通知。下面是这个应用的部署描述符:

<web-app>  
<display-name>MyListeningApplication</display-name>
<listener>
<listener-class>com.acme.MyConnectionManager</listener-class>
</listener>
<listener>
<listener-class>com.acme.MyLoggingModule</listener-class>
</listener>
<servlet>
<display-name>RegistrationServlet</display-name>
...etc
</servlet>
</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方法。

 

 

标签:Web,翻译,生命周期,应用,servlet,Servlet3.1,事件,监听器,Servlet
From: https://blog.51cto.com/toutiao/5898765

相关文章

  • Servlet3.1规范翻译 - Web应用
    ​​https://github.com/javahongxi​​本文转载自kaitao.hongxi.orgWeb应用一个Web应用是由许多servlet、HTML页面、类和其他资源组成的集合,这些资源组成了一个运行在Web......
  • Servlet3.1规范翻译 - Servlet Context
    ​​https://github.com/javahongxi​​本文转载自kaitao.hongxi.org4.1ServletContext接口介绍ServletContext(Servlet上下文)接口定义了servlet运行在的Web应用的视图。容......
  • servlet3.1规范翻译 - 会话(session)
    ​​https://github.com/javahongxi​​查看servlet-api.jar就可以知道Servlet规范大概包含哪些内容,下面翻译下规范中的“会话”,即HttpSession。第7章会话超文本传输协议(HT......
  • Servlet3.1规范翻译 - 注解和可插拔性
    ​​https://github.com/javahongxi​​本文转载自kaitao.hongxi.org注解和可插拔性本章讨论Servlet3.0规范定义的注解和使web应用内使用的框架和库能够可插拔的增强。8.1......
  • 线程的生命周期
    线程的状态线程的状态:也就是线程从生到死的过程,以及中间经历的各种状态及状态转换。理解线程的状态有利于提升并发编程的理解能力。Java线程的状态Java总共定义了6种状态6......
  • 个人翻译Introduction to Linear Algebra, 5th Edition 9.2节(仅用于交流学习,非盈利)
    本书的翻译仅为交流学习!才疏学浅,不当的地方还望指正。请勿于其它用途!PDF文件 链接一:   https://pan.baidu.com/s/1a3L_TIETS7onC38F2qE_OQ提取码:teh5 链接二:htt......
  • MapReduce经典论文翻译(中英对照)
    MapReduce:SimplifiedDataProcessingonLargeClusters(MapReduce:简化大型集群下的数据处理)转:谷歌MapReduce经典论文翻译(中英对照)-小熊餐馆-博客园(cnblogs.c......
  • python-爬取有道翻译功能
    fromselenium.webdriverimportChrome,ChromeOptionsfromselenium.webdriver.common.byimportByimporttimeoption=ChromeOptions()option.add_argument("-......
  • 面向机器学习的特征工程翻译版
    前些日子推荐了一个仓库,是知名开源apachecn组织翻译的《面向机器学习的特征工程》英文版,可以说是特征工程的宝典,值得推荐。仓库说明知名开源apachecn组织翻译了《面向机器学......
  • Gradle系列学习:Gradle的简介、常用命令和生命周期Gradle总结-生命周期
    一Gradle简介1.1graldeGradle是一个项目构建工具,它可以按照一定的规则把一堆目录和文件关联起来,自动化地构建从而形成一个项目。AndroidStudio的build就是通过Gradle来实......