应用生命周期事件
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>
<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方法。
相关推荐
Servlet3.1规范是Java服务器端编程的重要里程碑,它在原有的Servlet技术基础上进行了多项改进和扩展,极大地提升了Web应用的性能和开发效率。这个规范主要关注于Servlet、过滤器(Filter)和监听器(Listener)的...
8. **生命周期管理**:Servlet 3.1规范允许在Servlet实例的生命周期中执行自定义代码,比如在初始化和销毁时调用回调方法,这样开发者可以更好地控制资源的分配和释放。 9. **URL路径匹配**:Servlet 3.1引入了路径...
每个Servlet容器负责其管理的Servlet实例,这包括创建和销毁Servlet实例,以及调用其生命周期方法。 在Servlet 3.1规范中,提出了很多新的特性和改进,比如支持异步处理请求、更加丰富的注解支持和会话管理的增强等...
Maven有三个主要的生命周期阶段:compile、test和package。在Servlet3.1项目中,这些阶段可以帮助开发者完成源代码的编译、测试和打包成WAR文件。例如,使用命令`mvn compile`会编译源代码,`mvn test`执行单元测试...
9. 生命周期管理:Servlet3.1允许通过注解定义初始化参数,同时提供了更精确的生命周期控制,比如`@PreDestroy`注解用于标记在Servlet销毁前需要调用的方法。 10. 增强的监听器:规范增加了更多的监听器类型,如`...
它详细描述了servlet技术规范的各个方面,包括对servlets的定义、生命周期、事件监听、安全性、异步处理等。Servlet3.1规范被包含在JavaEE7平台中,而Servlet3.0规范则被包含在JavaEE6平台中。这些规范的官方网站...
10. **生命周期回调**:通过`@PostConstruct`和`@PreDestroy`注解,可以在Servlet、过滤器或监听器的生命周期中指定初始化和销毁时执行的方法。 总的来说,Java Servlet 3.1规范极大地提升了Java Web开发的灵活性、...
7. **预定义的生命周期事件**:Servlet 3.1引入了更多的预定义生命周期事件,例如`@PreDestroy`,允许在Servlet实例销毁前执行清理工作。 8. **初始化参数**:Servlet 3.1允许在类级别定义初始化参数,这使得多个...
9. **生命周期管理**:通过注解,开发者可以控制Servlet、过滤器和监听器的生命周期,如`@PostConstruct`和`@PreDestroy`。 10. **URL重写**:Servlet3.1引入了URL重写机制,使得在不改变URL的情况下,可以改变请求...
Servlet3.1规范是Java Web开发中的一个重要里程碑,它在Servlet3.0的基础上引入了许多增强功能,提高了Web应用的性能和可扩展性。这个中文最终版的文档为开发者提供了全面的指南,帮助他们理解并利用这些新特性进行...
Servlet3.1规范是Java Web开发中的一个重要里程碑,它...通过阅读`Servlet3.1规则[英文版].pdf`和`Servlet3.1规范[翻译版].pdf`,开发者可以深入了解这些新特性和API的使用方法,提升Java Web应用的开发质量和效率。
Servlet容器还管理servlet的生命周期,包括初始化、服务、销毁等阶段。它必须支持HTTP/1.0和HTTP/1.1协议,同时,HTTPS的支持是可选的。容器可能依据HTTP/1.1规范进行缓存操作,甚至直接对请求作出响应,而无需...
总之,《Servlet3.1规范》是Java Web开发的重要指南,它定义了Servlet API的最新标准,促进了高效、灵活的Web应用程序的开发。无论是服务器供应商、工具提供商还是高级开发者,都应该熟悉并掌握这一规范,以确保其...
Servlet3.1规范(最终版) JavaTM Servlet 规范 版本 3.1(最终版) Shing Wai Chan Rajiv Mordani [作者] 穆茂强 张开涛 [译者] 2012年6月翻译 2013年7月修订 目录 前言 ............................... 3 ...
9. **生命周期管理**:Servlet 3.1允许更细粒度的控制Servlet的初始化和销毁,比如通过@AsyncSupported注解控制异步处理,@WebInitParam注解设置初始化参数。 10. **多部分请求处理**:API提供...
Servlet 容器负责管理 Servlet 的生命周期。Servlet 容器是一个 Web 服务器扩展,用于提供 Servlet 的运行环境。当 Web 容器启动时,它负责加载 Servlet 类并创建其实例。容器还会对 Servlet 进行初始化,之后才能...
9. **Servlet生命周期管理**: Servlet3.1规范允许在部署时动态注册Servlet和Filter,使得在运行时调整应用程序的结构成为可能。 10. **Multipart解析**: `javax.servlet.http.Part`接口使得处理上传的多部分...
Servlet3.1是Java Servlet API的一个重要版本,它在Servlet3.0的基础上进行了进一步的增强和优化,提供了更高效、更灵活的Web应用程序开发能力。Maven是一个强大的项目管理工具,能够帮助开发者管理项目的构建、依赖...
3. **Servlet容器**:Servlet-4.1.34.jar与Servlet容器如Tomcat、Jetty等配合工作,容器负责管理Servlet的生命周期,处理请求/响应的上下文,并提供多线程环境。 4. **HTTP协议支持**:Servlet API提供了...