简介

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的创建、销毁事件以及监听这些域对象中的属性发生修改的事件。

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

相关概念

  事件源:即谁产生的事件
  事件对象:即产生了什么事件
  监听器:监听事件源的动作

监听对象

在Servlet规范中定义了多种类型的监听器(一共8个监听器),它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象。Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

1.域对象的生命周期监听:监听域对象自身的创建和销毁。这个监听器需要实现相应的监听器接口:ServletContextListener、HttpSessionListener、ServletRequestListener。

2.域对象的属性监听:监听域对象中属性的增加和删除。这个监听器需要实现的监听器接口为:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener。

3.感知监听(都与HttpSession域对象有关):

  绑定和解绑:监听绑定到HttpSession域中的某个JavaBean对象的状态的监听器以及解绑。这个监听器需要实现的监听器接口:HttpSessionBindingListener。

  钝化和活化:监听JaveBean对象随HttpSession序列化到硬盘上(正常关闭服务器,session会钝化到硬盘上)以及从硬盘反序列化到内存中。这个监听器需要实现的监听器接口:HttpSessionActiveationListener、Serializable。

示例:

域对象的生命周期监听

监听request的创建和销毁:

public class MyRequestListener implements ServletRequestListener {

    //创建
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("监听新的request对象被创建了...");
}
//销毁
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("监听request对象被销毁了...");
} }

监听session的创建和销毁:

public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent se)  {
// Event 事件: 通过事件对象可以获取被监听对象的引用
HttpSession session = se.getSession();
System.out.println(session.getId() + "对应的session被创建了**** **** ");
} public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session.getId() + "对应的session被销毁了**** **** ");
} }

监听context的创建和销毁:

public class MyServletContextListner implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce)  {
System.out.println("--------------------------- 监听到项目被创建了....");
} public void contextDestroyed(ServletContextEvent sce) {
System.out.println("*********************** 监听到项目被销毁了....");
} }

域对象属性变化监听

以request为例:

public class MyRequestAttrChangeListener implements ServletRequestAttributeListener {

    public void attributeAdded(ServletRequestAttributeEvent srae) {
// 属性 = 属性名 + 属性值
// 1 获取属性名
String name = srae.getName();
// 2 获取属性值:
// 2.1 获取事件源对象, 指request对象
ServletRequest request = srae.getServletRequest();
Object value = request.getAttribute(name); System.out.println("*****request 增加属性: " + name + " = " + value);
} public void attributeReplaced(ServletRequestAttributeEvent srae) {
// 1 获取属性名
String name = srae.getName();
// 2 获取属性值:
// 2.1 获取事件源对象, 指request对象
ServletRequest request = srae.getServletRequest();
Object newValue = request.getAttribute(name);
// 2.2 获取原来的值
Object oldValue = srae.getValue(); System.out.println("***** ***** *****request 修改属性 属性名: " + name);
System.out.println("***** ***** *****request 修改属性 新的属性值: " + newValue);
System.out.println("***** ***** *****request 修改属性 旧的属性值: " + oldValue);
} public void attributeRemoved(ServletRequestAttributeEvent srae) {
// 1 获取属性名
String name = srae.getName(); System.out.println("***** ***** *****request 删除属性 : " + name);
} }

感知监听

绑定和解绑:

public class User1 implements HttpSessionBindingListener {
private int id;
private String name;
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User1 [id=" + id + ", name=" + name + ", age=" + age + "]";
} @Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println(this + "感知自己被放到 session中------------------绑定");
} @Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(this + "感知自己从 session中移除 -----------------解绑");
} }

钝化和活化:

public class User2 implements HttpSessionActivationListener, Serializable {
private String nickname;
private String city; public String getNickname() {
return nickname;
} public void setNickname(String nickname) {
this.nickname = nickname;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Override
public String toString() {
return "User2 [nickname=" + nickname + ", city=" + city + "]";
} @Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(this + "随session活化到内存中 .........");
} @Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(this + "随session钝化到硬盘上..........");
} }

由于idea的运行机制问题(重启tomcat的话,会删除tomcat文件夹内的work文件夹再重新创建(同时也就删除了文件夹内的序列化到硬盘上的SESSIONS.SAR文件)),上面这个示例不能被活化到内存中。

java Web 监听器Listener详解的更多相关文章

  1. java web.xml配置详解(转)

    源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...

  2. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  3. java web之Filter详解

    java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...

  4. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  5. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  6. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  7. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  8. Servlet 监听器Listener详解

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

  9. Java Web开发之详解JSP

    JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面.Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用, ...

随机推荐

  1. Activity步骤

    Android项目结构 src:Java源代码所在的文件夹 gen:自动生成的R.java所在文件夹 Android开发工具包:android.jar res:资源文件夹,包含3种 drawable: ...

  2. VS 2010 转到COFF期间失败。

    可能的原因是framework 版本不匹配,我卸载4.5,装4.0后就解决了

  3. NOIP模拟题 序列

    题目大意 给定长为$n$的序列$A$,定义长为$k$的区间中位数为从小到大排完序后第$\lfloor\frac{k}{2}\rfloor$个数的大小. 每次询问给定$l_1,r_1,l_2,r_2$有 ...

  4. 剑指offer-第五章优化时间和空间效率(最小的k个数)

    题目:输入n个数,输出最小的k个数. 时间复杂度为O(n) 思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition.但是只要找到前K个最 ...

  5. C++输入流和输出流、缓冲区

    一.C++输入流和输出流 输入和输出的概念是相对程序而言的. 键盘输入数据到程序叫标准输入,程序数据输出到显示器叫标准输出,标准输入和标准输出统称为标准I/O,文件的输入和输出叫文件I/O. cout ...

  6. ②HttpURLConnection通过Json参数方式提交Post请求

    之前的文章介绍过通过报文的方式HttpURLConnection提交post请求,今天介绍下通过Json参数的方法提交Post请求,先上代码 public static HttpResponse se ...

  7. Python学习笔记之selenium 定制启动 chrome 的选项

    在自动化中,默认情况下我们打开的就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用.所以使用 selenium 时,我们可能需要对 chrome ...

  8. Delphi下遍历文件夹下所有文件的递归算法

    {------------------------------------------------------------------------------- 过程名:    MakeFileLis ...

  9. Python学习书籍推荐 中英对照

    Learn Python The Hard Way 笨办法学 python A Byte of Python 简明Python教程 初学者 英文版 Learning Python, 3rd Editi ...

  10. RHEL6 64位ASM方式安装oracle 11gR2(二)

    本文转载自:http://vnimos.blog.51cto.com/2014866/1221377 三.安装数据库软件 1 2 3 4 5 6 7 8 # unzip -d /stage/ linu ...