当Web 应用在Web 容器中运行时, Web 应用内部会不断地发生各种事件: 如Web 应用被启动、
Web 应用被停止,用户session 开始、用户session 结束、用户请求到达等, 通常来说,这些Web 事件
对开发者是透明的。

实际上, Servlet API 提供了大量监昕器来监昕 Web 应用的内部事件, 从而允许当 Web 内部事件发生时回调事件监昕器内的方法。

使用 Listener 只需要两个步骤。

  1、定义 Listener 实现类。
  2、通过注解或在 web.xml 文件中配置 Listerner。

1、实现Listener类

与 AWT 事件编程完全相似, 监听不同引向事件的监昕器也不相同。 常用的 Web 事件监昕器接门有如下几个。

》ServletContextListener:用于监昕 Web 应用的启动和关闭。
》ServletContextAttributeListener:用于监昕 ServletContext 范围( application )内属性的改变。

》ServletRequestListener:用于监昕用户请求。
》ServletRequestAttributeListener:用于监听 ServletRequest 范围 (request )内属性的改变。
》HttpSessionListener:用于监昕用户 session 的开始和结束。
》HttpSessionAttributeListener:用于监昕 HttpSession 范围 (session )内属性的改变。

下面先以 ServletContextListener 为例来介绍 Listener 的开发和使用, ServletContextListener 用于监听

Web 应用的启动和关闭。 该 Listener 类必须实现 ServletContextListener 接口, 该接口包含如下两个方法。
》contextlnitialized(ServletContextEvent see): 启动 Web 应用时, 系统调用 Listener 的该方法。

》contextDestroyed(ServletContextEvent see): 关闭 Web 应用时, 系统调用 Listener 的该方法。
通过上面的介绍不难看出, ServletContextListener 的作用有点类似于 load-on-startup Servlet,都可川于在 Web 应用启动时-, 回调方法来启动某些后台程序, 这些后台程序负责为系统运行提供支持。

package listener;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; @WebListener
public class GetConnListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext application = sce.getServletContext();
Connection conn = (Connection) application.getAttribute("conn");
if(conn != null) { try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} }
} @Override
public void contextInitialized(ServletContextEvent sce) {
try { ServletContext application = sce.getServletContext();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hello?serverTimezone=UTC&useSSL=false", "root", "lidian1234");
application.setAttribute("conn", conn);
System.out.println("数据库连接成功"); } catch (Exception e) {
e.printStackTrace();
} } }

上面的程序中粗体字代码重写了 ServletContextListener 的 contextlnitialized()、 contextDestroyed()方法, 这两个方法分别在应用启动、 关闭时被触发。 上面 ServletContextListener 的两个方法分别实现获取数据库连接、 关闭数据库连接的功能, 这些功能都是为整个 Web 应用提供服务的。
程序中, contextlnitialized()方法中粗体字代码用于获取配置参数, 细心的读者可能已经发现 ServletContextListener 获取的是 Web 应用的配置参数, 而不是像 Serviet 和 Filter 获取本身的配置参数。这是因为配置 Listener 时十分简单, 只要简单地指定 Listener 实现类即可, 不能配置初始化参数。

2、配置Listener

配置 Listener 只要向 Web 应用注册 Listener 实现类即可,无须配置参数之类的东西,因此十分简单。 为 Web 应用配置 Listener 也有两种方式。

》使用@WebListener 修饰 Listener 实现类即可。
》在 web.xml 文档中使用<listener.. ./>元素进行配置。
使用@WebListener 时通常无须指定任何属性, 只要使用该注解修饰 Listener 实现类即可向 Web应用注册该监听器。

在 web.xml 中使用<listener.. ./>元素进行配置时只要配置如下子元素即可。

》 listener-class:指定 Listener 实现类。

<!-- 指定listener的实现类 -->
<listener>
<listener-class>listener.GetConnListener</listener-class>
</listener>

3、使用ServletContextAttributeListener

Serv letContextA ttri buteListener 用于监昕ServletContext (application )范围内属性的变化, 实现该按
口的监昕器需要实现如下三个方法。
>>attributeAdded(ServletContextAttributeEvent event): 当程序把一个属性存入application 范围时触发该方法。
>>attributeRemoved(ServletContextAttributeEvent event): 当程序把一个属性从application 范围删除时触发该方法。
>>attributeReplaced(ServletContextAttributeEvent event): 当程序替换application 范围内的属性时将触发该方法。
下面是一个监听ServletContext范围内属性改变的Listener 。

package listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener{ @Override
public void attributeAdded(ServletContextAttributeEvent scab) {
ServletContext application = scab.getServletContext();
String name = scab.getName();
Object value = scab.getValue();
System.out.println(application+"范围内添加了name:"+name+",value:"+value); } @Override
public void attributeRemoved(ServletContextAttributeEvent scab) {
ServletContext application = scab.getServletContext();
String name = scab.getName();
Object value = scab.getValue();
System.out.println(application+"范围内的name:"+name+",value:"+value+"被删除了"); } @Override
public void attributeReplaced(ServletContextAttributeEvent scab) {
ServletContext application = scab.getServletContext();
String name = scab.getName();
Object value = scab.getValue();
System.out.println(application+"范围内的name:"+name+",value:"+value+"被更改了"); } }

上面的 ServletContextAttributeListener 使用了@WebListener 注解修饰,这就是向 Web 应用中注册了
该 Listener,该 Listener 实现了 attributeAdded、 attributeRemoved、 attributeReplaced 方法,因此当 application
范围内的属性被添加、 删除、 替换时, 这些对应的监昕器方法将会被触发。

4、使用 ServletRequestlistener 和 ServletRequestAttributelistener

ServletRequestListener 用于监昕用户请求的到达, 实现该接口的监昕器需要实现如下两个方法。
>> requestlnitialized(ServletRequestEvent sre): 用户请求到达、被初始化时触发该方法。
>> requestDestroyed(ServletRequestEvent sre): 用户请求结束、被销毁时触发该方法。
ServletRequestAttributeListener 则用于监昕ServletRequest (request )范围内属性的变化, 实现该接
口的监听器需要实现attributeAdded()、attributeRemoved()、attributeReplaced()三个方法。由此可见,
ServletRequestAttributeListener 与ServletContextAttributeListener 的作用相似, 都用于监昕属性的改变,
只是ServI etRequestA ttri buteListener 监昕request 范围内属性的改变, 而ServletContextAttributeListener
监听的是application范围内属性的改变。

5、使用HttpSessionListener和HttpSessionAttributelistener

HttpSessionListener 用于监昕用户session 的创建和销毁, 实现该接口的监昕器需要实现如下两个
方法。
》sessionCreated(HttpSessionEvent se): 用户与服务器的会话开始、创建时触发该方法。
》sessionDestroyed(HttpSessionEvent se): 用户与服务器的会话断开、销毁日才触发该方法。
HttpSessionAttributeListener 则用于监昕HttpSession (session )范围内属性的变化, 实现该接口的;监听器

需要实现attributeAdded()、attributeRemoved()、attributeReplaced()三个方法。由此可见,
HttpSessionAttributeListener 与ServletContextAttributeListener 的作用相似, 都用于监昕属性的改变,
是HttpSessionAttributeListener 监昕session 范围内属性的改变,而ServletContextAttributeListener 监昕的
是application 范围内属性的改变。
实现HttpSessionListener 接口的监昕器可以监昕每个用户会话的开始和断开, 因此应用可以通过该
监昕器监昕系统的在线用户。

listener介绍的更多相关文章

  1. Listener 介绍

    当 web 应用在 web 容器中运行时,web 应用内部会不断地发生各种事件:如 web 应用启动.web 应用停止,用户 session 开始.用户 session 结束.用户请求到达等. 实际上 ...

  2. Servlet的Listener介绍

    当Web应用在Web容器中运行时,Web应用内部会不断地发生各种事件:如Web应用被启动.Web应用被停止.用户session开始.用户session结束等.通常这些Web操作对开发者是透明的.但Se ...

  3. Quartz.net 3.x使用总结(一)——入门介绍

    1.Quartz.net简介 Quartz.NET是一个强大.开源.轻量级的任务调度框架.任务调度在我们的开发中经常遇到,如说:每天晚上三点让程序或网站执行某些代码,或者每隔5秒种执行一个方法等.Wi ...

  4. javaweb(4)之Listener&Filter

    监听器 (Listener) 介绍 监听器用于监听 web 应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器 ...

  5. 初学Listener

    一. Listener 介绍 Servlet API提供了大量监听器来监听web应用的的内部事件,从而允许当web内部事件发生时回调事件监听器内的方法. 使用listener分为两步 定义LIsten ...

  6. java web工程web.xml介绍

    转载自:http://blog.csdn.net/believejava/article/details/43229361 Web.xml详解: 1.web.xml加载过程(步骤) 首先简单讲一下,w ...

  7. Web.xml详解(转)

    这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论. ---题记 一.            Web.xml详解: (一)  web.xml加载过程(步骤) 首 ...

  8. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  9. JSP/Servlet基础语法

    相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...

随机推荐

  1. eval()和JSON.parse()的区别

    我们将一个josn字符串解析为对象的时可以使用两种方法: 假设有一个json字符串: '{ "student" : [ {}, {}, {} ] }' 然后解析为对象: 1.eva ...

  2. 【python 3】 函数 进阶

    函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...

  3. 【python 3】 文件操作

    文件操作 一: 只读.读写 # 示例: 1 f = open("E:\人员名单.txt" , encoding="utf-8" , mode="r&q ...

  4. T2027 蜈蚣

    传送门 思路: 设 f[ i ][ j ] 为第 i 节,切到第 j 段的最大恶心值. 枚举 左端点 j ,右端点 i ,段数 k →  转移: f [ i ][ k ] = max ( f [ i ...

  5. julia .文档

    https://docs.julialang.org/en/v1/manual/getting-started/

  6. 括号生成(Java实现)

    题目: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n =3,生成结果为: [ "((()))", "(()( ...

  7. 《SQL 基础教程》第六章:函数、谓词、CASE 表达式

    函数是 SQL 中的一部分.在 SQL 中,除了普通的函数之外,还有特殊的函数(谓词和 CASE 表达式)用于各种情况. 函数 函数的种类有: 算术函数 字符串函数 日期函数 转换函数(用于转换数据类 ...

  8. React文档(十八)最佳性能

    在内部,React使用好几种聪明的技巧去最小化更新UI所需要的DOM操作.对于很多应用来说,使用React会使得构建用户界面非常之快而且不需要做太多专门的性能优化.虽然如此,还是有一些方法可以让你为R ...

  9. 【js】【图片显示】js控制html页面显示图片方式

    js控制html页面显示图片方式,只需要引入“jquery-1.11.2.min.js” js: /* 引用 <script src="jquery-1.11.2.min.js&quo ...

  10. 数模美赛准备——我的第一个LaTex文档

    软件下载地址:清华大学镜像网站(点击下载) https://mirrors.tuna.tsinghua.edu.cn/ctex/legacy/2.9/ 上述网站页面 根据个人需求下载不同的版本安装完成 ...