文章是对 JSR-000340 JavaTM Servlet 3.1 Final Release的Java Servlet规范的翻译,尚未校准
应用事件设施为Web应用开发者提供了对 ServletContext
和 HttpSession
以及 ServletRequest
生命周期的更好的控制,允许更好的代码因子,并提高管理Web应用所使用资源的效率。
应用程序事件监听器是实现一个或多个Servlet事件监听器接口的类。在部署Web应用程序时,它们被实例化并在Web容器中注册。它们是由WAR中的开发者提供的。
Servlet事件监听器支持对 ServletContext
、HttpSession
和 ServletRequest
对象的状态变化进行事件通知。Servlet上下文监听器被用来管理资源或应用程序在JVM层面上的状态。HTTP会话监听器用于管理与同一客户或用户向Web应用程序发出的一系列请求相关的状态或资源。Servlet请求监听器用于管理Servlet请求的整个生命周期的状态。异步监听器用于管理异步事件,如超时和异步处理的完成。
可能有多个监听器类来监听每个事件类型,开发者可以指定容器为每个事件类型调用监听器Bean的顺序。
事件类型和用于监测它们的监听器接口显示在以下表格中。
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.
为了说明事件的使用方案,考虑一个简单的Web应用程序,其中包含一些使用数据库的Servlet。开发者提供了一个用于管理数据库连接的servlet上下文监听器类。
Web应用程序的开发者提供了监听器类,实现了javax.servlet
API中的一个或多个监听器接口。每个监听器类必须有一个公共构造函数,不需要任何参数。监听器类被打包到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.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</listenerclass>
</listener>
<listener>
<listener-class>com.acme.MyLoggingModule</listener-class>
</listener>
<servlet>
<display-name>RegistrationServlet</display-name>
...etc
</servlet>
</web-app>
容器需要在开始执行进入应用程序的第一个请求之前,完成Web应用程序中的监听器类的实例化。容器必须保持对每个监听器实例的引用,直到Web应用程序的最后一个请求得到服务。
ServletContext
和HttpSession
对象的属性变化可能同时发生。容器不需要将产生的通知同步到属性监听器类。维护状态的监听器类对数据的完整性负责,应该明确地处理这种情况。
监听器内的应用程序代码可能会在操作过程中抛出一个异常。一些监听器的通知发生在应用程序中另一个组件的调用树下。这方面的一个例子是设置会话属性的 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
方法,通常是很有用的。可以使用监听器和 HttpSession
API方法间接地确定这种区别。
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland