一、监听器(Listener)概述

  1、概念

  JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件,并自动根据不同情况,在后台调用相应的处理程序。

  通过监听器,可以自动激发一些操作,比如监听在线人数,当增加一个HttpSession时就激发 sessionCreated(HttpSessionEvent)方法,这样就可以给在线人数加1。

  2、监听器类型

  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。

  Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。

     1. 监听三个域对象创建和销毁的事件监听器

     2. 监听域对象中属性的增加和删除的事件监听器

     3. 监听绑定到 HttpSession 域中的某个对象的状态的事件监听器

  

二、监听三个域对象创建和销毁的事件监听器

  1.ServletContext域对象

  编写一个ServletContextListener_test类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁

 package com.yx.servlet.listener;

 import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; /**
* Application Lifecycle Listener implementation class ServletContextListener_test
* @Description:ServletContextListener_test实现了ServletContextListener接口,
* 因此可以对ServletContext对象的创建和销毁两个动作进行监听
*/
@WebListener
public class ServletContextListener_test implements ServletContextListener {
/**
* Default constructor.
*/
public ServletContextListener_test() { } /**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建");
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁");
}
}

  ServletContextEvent的主要方法:ServletContext getServletContext():取得当前的ServletContext对象  

  在web.xml中注册监听器:要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听。

<listener>
<listener-class>com.yx.servlet.listener.ServletContextListener_test</listener-class>
</listener>

  2、HttpSession域对象 

 package com.yx.servlet.listener;

 import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* Application Lifecycle Listener implementation class HttpSeeionListener_test
*
* HttpSession的销毁时机需要在web.xml中进行配置
*/
@WebListener
public class HttpSeeionListener_test implements HttpSessionListener { /**
* Default constructor.
*/
public HttpSeeionListener_test() {
// TODO Auto-generated constructor stub
} /**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent hse) {
System.out.println(hse.getSession()+"创建了");
}
/**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent hse) {
System.out.println("session销毁了");
} }

  HttpSessionEvent的主要方法:HttpSession getSession()

  在web.xml中注册监听器:

  <listener>
<listener-class>com.yx.servlet.listener.HttpSeeionListener_test</listener-class>
</listener>
<!--filter,listener,servlet,servlet-mapping等要在session-config之前配置-->
<!--配置HttpSession的销毁时机,在1分钟后销毁-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>

  3.  ServletRequest域对象 

 public void requestInitialized(ServletRequestEvent sre)  {
System.out.println(sre.getServletRequest()+"创建");
}
/**
* @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
*/
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println(sre.getServletRequest()+"销毁");
}

  ServletRequestEvent实例中的方法:getServletRequest():获取ServletRequest对象;

getServletContext():获取ServletContext对象。 

  <listener>
<listener-class>com.yx.servlet.listener.ServletRequestListener_test</listener-class>
</listener>

三、监听域对象中属性的变更的监听器

  1.ServletContextAttributeListener

  用于监听Web应用属性改变的事件,包括增加、删除、修改属性。监听器类需要实现ServletContextAttributeListener接口。

  ServletContextAttributeListener接口的主要方法:

  (1)void attributeAdded(ServletContextAttributeEvent se):若有对象加入Application的范围,通知正在收听的对象。

  (2)void attributeRemoved(ServletContextAttributeEvent se):若有对象从Application范围移除,通知正在收听的对象。

  (3)void attributeReplaced(ServletContextAttributeEvent se):若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象

  ServletContextAttributeEvent中的主要方法:

    getName():返回属性名称

    getValue():返回属性的值

  2.HttpSessionAttributeListener:监听HttpSession中属性的操作

  该接口的主要方法:

  (1)void attributeAdded(HttpSessionBindingEvent se):监听Http会话中的属性添加

  (2)void attributeRemoved(HttpSessionBindingEvent se):监听Http会话中的属性移除

  (3)void attributeReplaced(HttpSessionBindingEvent se):监听Http会话中的属性更改操作

  3. ServletRequestAttributeListener:用于监听Web应用属性改变的事件,包括增加属性、删除属性、修改属性
  接口方法:
  (1)void attributeAdded(ServletRequestAttributeEvent e):向Request对象添加新属性
  (2)void attributeRemoved(ServletRequestAttributeEvent e):从request对象中删除属性
  (3)void attributeReplaced(ServletRequestAttributeEvent e):替换对象中现有属性值
  ServletRequestAttributeEvent中的主要方法:
    getName():返回Request增加、删除、或替换的属性名称
    getValue():返回Request增加、删除、或替换的属性的值
  注:以上均需要在web.xml中进行配置
四、监听绑定到 HttpSession 域中的某个对象的状态的事件监听器
  1.HttpSessionBindingListener接口

  注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener

  当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出

(即调用HttpSession对象的removeAttribute方法的时候或SessionTime out的时候)时,可以感知自己何时被绑/解绑HttpSession域中,容器分别会自动调用下列两个方法:

  void valueBound(HttpSessionBindingEvent event)

  void valueUnbound(HttpSessionBindingEvent event)

  2.HttpSessionActivationListener接口:监听Http会话的active和passivate状态。接口中定义的回调方法有:
  
          session对象被保存到磁盘时,激发 sessionWillPassivate(HttpSessionEvent)
          session对象被调入内存时,激发 sessionDidActivate(HttpSessionEvent)
  
   Activate与Passivate是用于置换session对象的动作,当Web服务器因为资源利用或负载平衡等原因要将内存中的 session对象暂时储存至硬盘或其它储存器时(通过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加 载到JVM中时所采的动作称之为Activate。sessionDidActivate()方法与 sessionWillPassivate()方法分别于Activeate后与Passivate前被调用。

  参考博文:

  (1)http://www.cnblogs.com/xdp-gacl/p/3961929.html;http://www.cnblogs.com/xdp-gacl/p/3969249.html

  (2)http://www.cnblogs.com/ymf123/p/5017622.html

  (3)http://blog.csdn.net/rongxiang111/article/details/53487381

  (4)http://blog.csdn.net/u011120983/article/details/50468407

  (5)http://blog.csdn.net/xxssyyyyssxx/article/details/50007833

Servlet之监听器(Listener)的更多相关文章

  1. Servlet的监听器Listener

    Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是 随web应用的启动而启动,只初始化一次,随web ...

  2. servlet监听器Listener(理论+例子)

    Listener采用了观察者模式(24种模式之一),Listener是servlet的监听器,他可以监听客户端的请求.服务器端的操作等, 通过监听器,可以自动激发一些操作.比如:监听在线用户数量 当增 ...

  3. java之Servlet监听器Listener

    常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...

  4. Servlet 监听器Listener详解

    转自:http://blog.csdn.net/u012228718/article/details/41730799 一.简介 (一)概述 1.Listener 用于监听 Javaweb程序中的事件 ...

  5. javaweb学习总结(四十七)——监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  6. javaWeb学习总结(11)- 监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  7. javaWeb学习总结(11)- 监听器(Listener)学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其 实就是一个实现特定接口的普 ...

  8. [09] 监听器 Listener

    1.事件 1.1 事件的概念 在Servlet中有一个概念叫做监听,顾名思义,就是监听某种事件是否发生.就如你是一家娱乐媒体公司的老板,你派出狗仔队去跟着某些明星,比如你想了解他们的绯闻,或者活动进展 ...

  9. Servlet的监听器

    Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...

  10. 过滤器Filter与监听器Listener

    过滤器Filter 过滤器也是一种servlet   它也可以对用户的请求进行处理  , 但是他所做的处理,只是一些轻量级的处理.Fileter就好像jsp页面与servlet之间的一道关卡,如果这个 ...

随机推荐

  1. Python爬虫简单介绍

    相关环境: Python3 requests库 BeautifulSoup库 一.requests库简单使用 简单获取一个网页的源代码: import requests sessions = requ ...

  2. C 语言 符合运算符

    复合赋值 5个算术运算符 + - * / % 可以和赋值运算符 = 结合起来形成符合运算符 += -= *= /= %= total += 5 total = total + 5 note:两个运算符 ...

  3. EF core2.1+MySQL报错'Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalParameterBuilder..ctor(Microsoft.EntityFrameworkCore.Storage.IRelationalTypeMapper)

    一.使用.net core 2.0 EF mysql 运行一直报错如下: An unhandled exception occurred while processing the request. M ...

  4. leetcode每日刷题计划-简单篇day12

    Num 125 验证回文串 Valid Palindrome 非常有收货的一道题嘻嘻嘻,本来是考试期间划水挑的题,坑点有点多 第一个是注意对temp1和temp2中途更新的判断 第二个是字符串频繁的作 ...

  5. python-day3集合、文件读写、函数

    @集合运算 s.union(t) s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t 返回一个新的 set 包含 s 和 t 中 ...

  6. zabbix3.0.4 探索主机Discovery自动发现agent主机和zabbix-agent自动注册详细图文教程

    Zabbix 自动发现(Discovery)功能使用 随着监控主机不断增多,有的时候需要添加一批机器,特别是刚用zabbix的运维人员需要将公司的所有服务器添加到zabbix,如果使用传统办法去单个添 ...

  7. 16Linxu_Squid_iSCSI

    使用Squid部署代理缓存服务 yum install squid 标准正向代理: 透明正向代理 反向代理 ACL访问控制 使用iSCSI服务部署网络存储 yum install targetd ta ...

  8. rad 10.2

    最大分辨率跟笔记本走了 笔记本最大分辨率 1388 程序界面是 1980*1080 笔记本打开过程序,就自动变为  1388了,界面全乱了.因为设置的 锚点是 右下.

  9. 基于SpringBoot+Mybatis+AntDesign快速开发平台,Jeecg-Boot 1.1 版本发布

    Jeecg-Boot 1.1 版本发布,初成长稳定版本 导读     平台首页UI升级,精美的首页支持多模式 提供4套代码生成器模板(支持单表.一对多) 集成Excel简易工具类,支持单表.一对多导入 ...

  10. 统计不同渠道的的UV,再合计渠道总计UV

    ( SELECT `统计时间`, `贷款公司名称`, `推广员姓名`, UV FROM ac_statistics WHERE `贷款公司名称` = "金腰袋" AND `统计时间 ...