servlet2.3规范之十——应用生命周期事件

10 应用生命周期事件

10.1 简介

规范2.3中新增了对应用级事件的支持。应用事件工具使得web应用开发人员在与ServletContextHttpSession对象交互时有了更大的控制权,代码更清晰,提高了管理web应用使用资源的效率。

 

10.2 事件监听器

应用事件监听器是一些实现了一个或多个servlet事件监听器接口的类。在web应用发布时实例化,并注册到web容器中,由开发人员提供给WAR

 

Servlet事件监听器支持ServletContextHttpSession对象状态变化的事件通知。Servlet上下文监听器用来管理应用VM级所持有的资源或状态。HTTP会话监听器用来管理web应用中同一个客户端或用户发出的一系列请求相关的状态或资源。

 

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

 

10.2.1 事件类型和监听器接口

事件类型和用于监听的监听器接口如10-1中所示。

 

10-1 事件和监听器接口

事件类型

描述

接听器接口

ServletContext事件

生命周期

servlet上下文刚被创建,可以处理第一个请求,或者servlet上下文要被关闭

javax.servlet.ServletContextListener

属性变更

Servlet上下文的属性被添加,删除或者替换

javax.servlet.ServletContextAttributesListener

HttpSession事件

生命周期

HttpSession被创建,失效或超时

javax.servlet.http.HttpSessionListener

属性变更

HttpSession属性被添加,删除或者替换

javax.servlet.HttpSessionAttributesListener

关于API细节,参见第14章和第15API参考。

 

10.2.2 监听器使用示例

用一个简单的web应用说明事件的使用,它包括一些使用了数据库的servlet。开发人员提供提供了一个servlet上下文监听器来管理数据库连接。

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

2. 应用中的servletweb应用活动期间必要时访问连接。

3. web服务器关闭时,或者应用从web服务器中清除,通知监听器类,并关闭数据库连接。

 

10.3 监听器类配置

10.3.1 提供监听器类

Web应用的开发人员提供servlet API中一个或多至4个监听器类的实现。每一个监听器类必须有一个无参的公共构造函数。监听器类被打包至WAR中,可以位于WEB-INF/classes目录中,也可以位于WEBINF/lib目录下的JAR中。

 

10.3.2 部署声明

监听器类web应用部署描述符中使用listener元素声明,按调用的顺序列出类名。

 

10.3.3 监听器注册

在处理应用的第一个请求之前,web容器创建每一个监听器类的实例,并注册为事件通知。Web容器根据监听器实例实现的接口,以及部署描述符中的顺序进行注册。在web应用执行时,以注册的顺序调用监听器。

 

10.3.4 关闭通知

当应用关闭时,按声明的相反顺序通知监听器,先通知会话监听器,后通知上下文监听器。会话失效通知会话监听器必须优先于应用关闭时通知上下文监听器。

 

10.4 部署描述符示例

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

假定com.acme.MyConnectionManagercom.acme.MyLoggingModule都实现了javax.servlet.ServletContextListenercom.acme.MyLoggingModule还实现了javax.servlet.HttpSessionListener,并且开发人员想让com.acme.MyConnectionManagercom.acme.MyLoggingModule之前得到上下文生命周期事件的通知。那么该应用的部署描述符为:

<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>

 

10.5 监听器实例与线程

要求容器在开始执行应用的第一个请求之前完成对web应用监听器类的实例化。容器必须维持每一个监听器实例的引用,直到web应用处理完最后一个请求。

 

ServletContextHttpSession对象的属性变更可能同时发生。不要求容器对属性监听器类的结果通知进行同步。维护状态的监听器类负责数据的完整性,并且应当显式处理该情况。

 

10.6 分布式容器

在分布式web容器中,HttpSession实例只作用于处理会话请求的特定VM中,ServletContext对象作用于web容器的VM中。不要求分布式容器将servlet上下文事件或HttpSession事件传递给其他VM。每一个VM的每一个部署描述符对应一个监听器类实例。

 

10.7 会话事件

监听器类给开发人员提供了一种跟踪web应用内会话的方式。知道一个会话是否因为超时,或者因为应用内的web组件调用invalidate方法而失效,这是很有用的。区别在于是间接使用监听器和还是直接使用HTTPSession API方法。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值