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

    技术2022-05-11  75

    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方法。

     

    最新回复(0)