`

Servlet3.1应用生命周期事件 (转载)

 
阅读更多

应用生命周期事件

11.1 介绍

应用事件设施给Web应用开发人员更好地控制ServletContextHttpSessionServletRequest的生命周期,可以更好地代码分解,并在管理Web应用使用的资源上提高了效率。

11.2 事件监听器

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

Servlet事件监听器支持在ServletContextHttpSessionServletRequest状态改变时进行事件通知。Servlet上下文监听器是用来管理应用的资源或JVM级别持有的状态。HTTP会话监听器是用来管理从相同客户端或用户进入web应用的一系列请求关联的状态或资源。Servlet请求监听器是用来管理整个Servlet请求生命周期的状态。异步监听器是用来管理异步事件,例如超时和完成异步处理。

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

11.2.1 事件类型和监听器接口

事件类型和监听器接口用于监控下表所示的:

11-1Servlet上下文事件

事件类型

描述

监听器接口

生命周期

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.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</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应用最后一个请求提供服务。

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

11.6 监听器异常

一个监听器里面的应用代码在运行期间可能会抛出异常。一些监听器通知发生在应用中的另一个组件调用树过程中。这方面的一个例子是一个Servlet设置了会话属性,该会话监听器抛出未处理异常。容器必须允许未处理的异常由描述在10.9节“错误处理”的错误页面机制处理。如果没有为这些异常指定错误页面,容器必须确保返回一个状态码为500的响应。这种情况下,不再有监听器根据事件被调用。

有些异常不会发生在应用中的另一个组件调用栈过程中。这方面的一个例子SessionListener接收通知的会话已经超时并抛出未处理的异常,或者ServletContextListenerServlet上下文初始化通知期间抛出未处理异常,或者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规范(最终版) PDF

    Servlet3.1规范(最终版) JavaTM Servlet 规范 版本 3.1(最终版) Shing Wai Chan Rajiv Mordani [作者] 穆茂强 张开涛 [译者] 2012年6月翻译 2013年7月修订 目录 前言 ............................... 3 ...

    Java™ Servlet 规范.

    2.3 Servlet 生命周期 .......................................................................................................................................16 2.3.1 加载和实例化 .........................

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    jsp servlet 入门学习资料-新手一看就懂

    10.2.2 Session Bean的生命周期 10.3 Entity Bean 10.3.1 Entity Bean的特性 10.3.2 Entity Bean的生命周期 10.4 EJB的开发 10.4.1 Enterprise JavaBeans的实际处理文件 10.4.2 实现EJBObject文件 10.4.3 ...

    Servlet与JSP核心编程第2版

    3.6 servlet的生命周期 3.7 singlethreadmodel接口 3.8 servlet的调试 第4章 客户请求的处理:表单数据 4.1 表单数据的作用 4.2 在servlet中读取表单数据 4.3 示例:读取3个参数 4.4 示例:读取所有...

    J2EE应用开发详解

    141 9.1.2 JSF应用程序配置 142 9.2 一个简单的JSF应用 142 9.2.1 JSF应用程序开发步骤 143 9.2.2 用户登录实例 143 9.3 JSF应用程序架构 147 9.3.1 JSF请求处理生命周期 147 9.3.2 JSF事件驱动模型 148 9.3.3 JSF...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    3.1.6 生命周期事件 128 3.1.7 将监听器绑定到Bean属性 130 3.2 JSF的国际化支持 132 3.2.1 加载国际化资源文件 132 3.2.2 使用国际化消息 134 3.2.3 动态数据国际化 137 3.2.4 让用户选择语言 142 3.3 使用转换器...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    第6章 生命周期(Lifecycle) 43 6.1 概述 43 6.2 Lifecycle接口 43 6.3 LifecycleEvent类 44 6.4 LifecycleListener接口 44 6.5 LifecycleSupport类 44 6.6 应用程序 45 6.6.1 ex06.pyrmont.core.SimpleContext 45 ...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    3.1 jsf请求处理生命周期概述 3.1.1 请求处理生命周期的功能 3.1.2 与其他web技术的区别 3.1.3 服务器端视图的自动管理与同步 3.1.4 请求处理生命周期的各阶段 3.2 观察请求处理生命周期 3.3 与请求处理生命周期有关...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    3.1 jsf请求处理生命周期概述 3.1.1 请求处理生命周期的功能 3.1.2 与其他web技术的区别 3.1.3 服务器端视图的自动管理与同步 3.1.4 请求处理生命周期的各阶段 3.2 观察请求处理生命周期 3.3 与请求处理生命周期有关...

    java个人博客毕业论文

    2.2.4 Servlet 的生命周期 10 2.3 JDBC技术 11 2.3.1 JDBC概述 11 2.3.2 JDBC两层模型和三层模型 12 2.3.3 使用JDBC的优缺点 12 2.4 JSP开发方式 13 3 需求分析 14 3.1 需求分析概述 14 3.2 个人博客系统概述 15 3.3...

    tomcat6、7、8、9, maven3.5

    Tomcat 6.x的用户应该计划在Tomcat 6.x到达生命周期之前进行升级。 Apache Tomcat 5.x 的Apache Tomcat 5.x的是可以从档案下载。 的Apache Tomcat 5.5.X支持相同的Servlet和JSP规范版本的的Apache Tomcat 5.0.x中...

    《深入剖析Tomcat(中文版+英文版)》.rar

    第6章 生命周期 第7章 日志记录器 第8章 载入器 第9章 session管理 第10章 安全性 第11章 standardwrapper 第12章 standardcontext类 第13章 host和engine 第14章 服务器组件和服务组件 第15章 digester库...

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘

    8.1.3 Servlet的生命周期 173 8.1.4 开发、部署一个简单的Servlet 174 8.2 Servlet常用接口及使用 177 8.2.1 Servlet体系 178 8.2.2 Servlet实现相关 179 8.2.3 Servlet请求和响应相关 182 8.2.4 配置相关 186 8.2.5...

    JSP学生学籍管理系统毕业设计论文

    2.3.1 Servlet的生命周期 8 2.3.2 Java Servlet API 9 2.4 Struts技术 11 2.5 WEB技术 13 2.6 JavaScript技术 15 2.7 MySql数据库简介 16 2.8 开发工具 17 第三章 系统的分析与总体设计 18 3.1 系统分析 18 3.1.1...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.7.1 application的生命周期 3.7.2 application中数据的操作 3.7.3 Web应用初始化参数的配置 3.7.4 application对象应用示例 3.8 其他内置对象的应用 3.8.1 应答与请求的page对象 3.8.2 页面上下文的page Context...

Global site tag (gtag.js) - Google Analytics