Servlet规范之应用生命周期事件_会话时间监听抛出异常-程序员宅基地

技术标签: JAVA  java  servlet  

Application Lifecycle Events

文章是对 JSR-000340 JavaTM Servlet 3.1 Final Release的Java Servlet规范的翻译,尚未校准


介绍

应用事件设施为Web应用开发者提供了对 ServletContext HttpSession以及 ServletRequest生命周期的更好的控制,允许更好的代码因子,并提高管理Web应用所使用资源的效率。

Event Listeners

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

Servlet事件监听器支持对 ServletContextHttpSessionServletRequest对象的状态变化进行事件通知。Servlet上下文监听器被用来管理资源或应用程序在JVM层面上的状态。HTTP会话监听器用于管理与同一客户或用户向Web应用程序发出的一系列请求相关的状态或资源。Servlet请求监听器用于管理Servlet请求的整个生命周期的状态。异步监听器用于管理异步事件,如超时和异步处理的完成。

可能有多个监听器类来监听每个事件类型,开发者可以指定容器为每个事件类型调用监听器Bean的顺序。

Event Types and Listener Interfaces

事件类型和用于监测它们的监听器接口显示在以下表格中。

TABLE 11-1 Servlet Context Events

Event Type Description Listener Interface
Lifecycle 上下文刚刚被创建,可以为其第一个请求提供服务,或者Servlet上下文即将被关闭。 javax.servlet.ServletContextListener
Changes to attributes 在servlet上下文上的属性已被添加、删除或替换。 javax.servlet.ServletContextAttributeListener

TABLE 11-2 HTTP Session Events

Event Type Description Listener Interface
Lifecycle 一个HttpSession已经被创建、失效或超时。 javax.servlet.http.HttpSessionListener
Changes to attributes 在一个HttpSession上,属性被添加、删除或替换。 javax.servlet.httpHttpSessionAttributeListener
Changes to id HttpSession的id已经被改变。 javax.servlet.httpHttpSessionIdListener
Session migration HttpSession已经被激活或钝化。 javax.servlet.httpHttpSessionActivationListener
Object binding 对象已被绑定到HttpSession或从HttpSession解绑。 javax.servlet.httpHttpSessionBindingListener

TABLE 11-3 Servlet Request Events

Event Type Description Listener Interface
Lifecycle 一个servlet请求已经开始被Web组件处理。 javax.servlet.ServletRequestListener
Changes to attributes 在ServletRequest上添加、删除或替换了属性。 javax.servlet.ServletRequestAttributeListener
Async events 超时、连接终止或异步处理的完成。 javax.servlet.AsyncListener

For details of the API, refer to the API reference.

An Example of Listener Use

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

  1. 当应用程序启动时,监听器类被通知。应用程序登录到数据库,并在servlet上下文中存储连接。
  2. 应用程序中的Servlet在Web应用程序的活动中根据需要访问该连接。
  3. 当Web服务器关闭时,或者应用程序从Web服务器上删除时,监听器类被通知,数据库连接被关闭。

Listener Class Configuration

提供监听器类

Web应用程序的开发者提供了监听器类,实现了javax.servletAPI中的一个或多个监听器接口。每个监听器类必须有一个公共构造函数,不需要任何参数。监听器类被打包到WAR中,可以在WEB-INF/classes归档条目下,也可以在WEB-INF/lib目录下的JAR中。

部署声明

监听器类在Web应用程序部署描述符中使用listener元素进行声明。它们按类的名称列出,并按其被调用的顺序排列。与其他监听器不同,AsyncListener 类型的监听器只能以编程方式注册(使用ServletRequest)。

监听器注册

Web 容器为每个监听器类创建一个实例,并在处理应用程序的第一个请求之前将其注册为事件通知。Web容器根据它们实现的接口和它们在部署描述符中出现的顺序来注册监听器实例。在Web应用执行过程中,给定事件的监听器大多按照它们的注册顺序被调用,但也有一些例外。例如,HttpSessionListener.destory是以相反的顺序调用的。详见第8.2.3节,“从web.xml、web-fragment.xml和注解中组装描述符”。

关闭时通知

在应用程序关闭时,监听器将按照与它们的声明相反的顺序被通知,对会话监听器的通知在对上下文监听器的通知之前。会话监听器必须在上下文监听器收到应用程序关闭的通知之前被通知会话无效的情况。

部署描述符示例

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

假设com.acme.MyConnectionManagercom.acme.MyLoggingModule都实现了javax.servlet.ServletContextListener,并且com.acme.MyLoggingModule额外实现了javax.servlet.http.HttpSessionListener。另外,开发者希望com.acme.MyConnectionManagercom.acme.MyLoggingModule之前得到servlet上下文生命周期事件的通知。下面是这个应用程序的部署描述符。

<web-app>
	<display-name>MyListeningApplication</display-name>
	<listener>
		<listener-class>com.acme.MyConnectionManager</listenerclass>
	</listener>
	<listener>
		<listener-class>com.acme.MyLoggingModule</listener-class>
	</listener>
	<servlet>
	<display-name>RegistrationServlet</display-name>
...etc
	</servlet>
</web-app>

监听器实例和线程

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

ServletContextHttpSession对象的属性变化可能同时发生。容器不需要将产生的通知同步到属性监听器类。维护状态的监听器类对数据的完整性负责,应该明确地处理这种情况。

监听器异常

监听器内的应用程序代码可能会在操作过程中抛出一个异常。一些监听器的通知发生在应用程序中另一个组件的调用树下。这方面的一个例子是设置会话属性的 servlet,其中会话监听器会抛出一个未处理的异常。容器必须允许未处理的异常由第 10.9 节 "错误处理 "中描述的错误页机制来处理。如果没有为这些异常指定错误页,那么容器必须确保以状态 500 发送一个响应。在这种情况下,该事件下没有更多的监听器被调用。

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

开发人员希望在监听器产生异常后进行正常的处理,必须在通知方法中处理他们自己的异常。

分布式容器

在分布式Web容器中,HttpSession实例的范围是服务会话请求的特定JVM,而ServletContext对象的范围是Web容器的JVM。分布式容器不需要将servlet context事件或HttpSession事件传播给其他JVM。监听器类实例的范围是每个JVM的部署描述符声明一个。

会话事件

监听器类为开发者提供了一种在Web应用程序中跟踪会话的方法。在跟踪会话时,了解会话是否因为容器超时而变得无效,还是因为应用程序中的Web组件调用了 invalidate方法,通常是很有用的。可以使用监听器和 HttpSessionAPI方法间接地确定这种区别。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43820556/article/details/127854427

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法