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

  域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。

   这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件, 同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。

1.1、attributeAdded 方法

  当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象

  各个域属性监听器中的完整语法定义为:

1 public void attributeAdded(ServletContextAttributeEvent scae)

2 public void attributeReplaced(HttpSessionBindingEvent hsbe)

3 public void attributeRmoved(ServletRequestAttributeEvent srae)

1.2、attributeRemoved 方法

  当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应

  各个域属性监听器中的完整语法定义为:

1 public void attributeRemoved(ServletContextAttributeEvent scae)

2 public void attributeRemoved (HttpSessionBindingEvent hsbe)

3 public void attributeRemoved (ServletRequestAttributeEvent srae)

1.3、attributeReplaced 方法

  当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应

  各个域属性监听器中的完整语法定义为:

1 public void attributeReplaced(ServletContextAttributeEvent scae)

2 public void attributeReplaced (HttpSessionBindingEvent hsbe)

3 public void attributeReplaced (ServletRequestAttributeEvent srae)

1.4、ServletContextAttributeListener监听器范例:

  编写ServletContextAttributeListener监听器监听ServletContext域对象的属性值变化情况,代码如下:

1 package me.gacl.web.listener;

2

3 import java.text.MessageFormat;

4

5 import javax.servlet.ServletContextAttributeEvent;

6 import javax.servlet.ServletContextAttributeListener;

7

8 /** 9 * @ClassName: MyServletContextAttributeListener

10 * @Description: ServletContext域对象中属性的变更的事件监听器

11 * @author: 孤傲苍狼

12 * @date: 2014-9-11 下午10:53:04

13 *

14 */

15 public class MyServletContextAttributeListener implements16 ServletContextAttributeListener {

17

18 @Override

19 public void attributeAdded(ServletContextAttributeEvent scab) {

20 String str =MessageFormat.format(

21 "ServletContext域对象中添加了属性:{0},属性值是:{1}"

22 ,scab.getName()

23 ,scab.getValue());

24 System.out.println(str);

25 }

26

27 @Override

28 public void attributeRemoved(ServletContextAttributeEvent scab) {

29 String str =MessageFormat.format(

30 "ServletContext域对象中删除属性:{0},属性值是:{1}"

31 ,scab.getName()

32 ,scab.getValue());

33 System.out.println(str);

34 }

35

36 @Override

37 public void attributeReplaced(ServletContextAttributeEvent scab) {

38 String str =MessageFormat.format(

39 "ServletContext域对象中替换了属性:{0}的值"

40 ,scab.getName());

41 System.out.println(str);

42 }

43 }

  在web.xml文件中注册监听器

1 <listener>2 <description>MyServletContextAttributeListener监听器</description>3 <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class>4 </listener>

  编写ServletContextAttributeListenerTest.jsp测试页面

1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML> 3 <html> 4 <head> 5 <title>ServletContextAttributeListener监听器测试</title> 6 </head> 7

8 <body> 9 <%10 //往application域对象中添加属性

11 application.setAttribute("name", "孤傲苍狼");

12 //替换application域对象中name属性的值

13 application.setAttribute("name", "gacl");

14 //移除application域对象中name属性

15 application.removeAttribute("name");

16 %>17 </body>18 </html>

运行结果如下:

  

  从运行结果中可以看到,ServletContextListener监听器成功监听到了ServletContext域对象(application)中的属性值的变化情况。

1.5、ServletRequestAttributeListener和HttpSessionAttributeListener监听器范例:

  编写监听器监听HttpSession和HttpServletRequest域对象的属性值变化情况,代码如下:

1 package me.gacl.web.listener;

2

3 import java.text.MessageFormat;

4

5 import javax.servlet.ServletRequestAttributeEvent;

6 import javax.servlet.ServletRequestAttributeListener;

7 import javax.servlet.http.HttpSessionAttributeListener;

8 import javax.servlet.http.HttpSessionBindingEvent;

9

10 public class MyRequestAndSessionAttributeListener implements11 HttpSessionAttributeListener, ServletRequestAttributeListener {

12

13 @Override

14 public void attributeAdded(ServletRequestAttributeEvent srae) {

15 String str =MessageFormat.format(

16 "ServletRequest域对象中添加了属性:{0},属性值是:{1}"

17 ,srae.getName()

18 ,srae.getValue());

19 System.out.println(str);

20 }

21

22 @Override

23 public void attributeRemoved(ServletRequestAttributeEvent srae) {

24 String str =MessageFormat.format(

25 "ServletRequest域对象中删除属性:{0},属性值是:{1}"

26 ,srae.getName()

27 ,srae.getValue());

28 System.out.println(str);

29 }

30

31 @Override

32 public void attributeReplaced(ServletRequestAttributeEvent srae) {

33 String str =MessageFormat.format(

34 "ServletRequest域对象中替换了属性:{0}的值"

35 ,srae.getName());

36 System.out.println(str);

37 }

38

39 @Override

40 public void attributeAdded(HttpSessionBindingEvent se) {

41 String str =MessageFormat.format(

42 "HttpSession域对象中添加了属性:{0},属性值是:{1}"

43 ,se.getName()

44 ,se.getValue());

45 System.out.println(str);

46 }

47

48 @Override

49 public void attributeRemoved(HttpSessionBindingEvent se) {

50 String str =MessageFormat.format(

51 "HttpSession域对象中删除属性:{0},属性值是:{1}"

52 ,se.getName()

53 ,se.getValue());

54 System.out.println(str);

55 }

56

57 @Override

58 public void attributeReplaced(HttpSessionBindingEvent se) {

59 String str =MessageFormat.format(

60 "HttpSession域对象中替换了属性:{0}的值"

61 ,se.getName());

62 System.out.println(str);

63 }

64 }

  在web.xml文件中注册监听器

1 <listener>2 <description>MyRequestAndSessionAttributeListener监听器</description>3 <listener-class>me.gacl.web.listener.MyRequestAndSessionAttributeListener</listener-class>4 </listener>

  编写RequestAndSessionAttributeListenerTest.jsp测试页面

1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML> 3 <html> 4 <head> 5 <title>RequestAndSessionAttributeListener监听器测试</title> 6 </head> 7

8 <body> 9 <%10 //往session域对象中添加属性

11 session.setAttribute("aa", "bb");

12 //替换session域对象中aa属性的值

13 session.setAttribute("aa", "xx");

14 //移除session域对象中aa属性

15 session.removeAttribute("aa");

16

17 //往request域对象中添加属性

18 request.setAttribute("aa", "bb");

19 //替换request域对象中aa属性的值

20 request.setAttribute("aa", "xx");

21 //移除request域对象中aa属性

22 request.removeAttribute("aa");

23 %>24 </body>25 </html>

  运行结果如下:

  

  从运行结果中可以看到,HttpSessionAttributeListener监听器和ServletRequestAttributeListener成功监听到了HttpSession域对象和HttpServletRequest域对象的属性值变化情况。

二、感知Session绑定的事件监听器

  保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object))到 Session中;从 Session域中解除(session.removeAttribute("bean"))绑定;随Session对象持久化到一个存储设备中;随 Session对象从一个存储设备中恢复

  Servlet 规范中定义了两 个特殊的监听器接口"HttpSessionBindingListener和HttpSessionActivationListener"来帮助 JavaBean 对象了解自己在Session域中的这些状态: ,实现这两个接口的类不需要 web.xml 文件中进行注册。

2.1、HttpSessionBindingListener接口

  实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件

  当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法

  当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法

范例:

1 package me.gacl.domain;

2

3 import javax.servlet.http.HttpSessionBindingEvent;

4 import javax.servlet.http.HttpSessionBindingListener;

5

6 /** 7 * @ClassName: JavaBeanDemo1

8 * @Description:

9 * 实现了HttpSessionBindingListener接口的 JavaBean对象可以感知自己被绑定到 Session中和从Session中删除的事件

10 当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法

11 当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法

12

13 * @author: 孤傲苍狼

14 * @date: 2014-9-11 下午11:14:54

15 *

16 */

17 public class JavaBeanDemo1 implements HttpSessionBindingListener {

18

19 private String name;

20

21 @Override

22 public void valueBound(HttpSessionBindingEvent event) {

23 System.out.println(name+"被加到session中了");

24 }

25

26 @Override

27 public void valueUnbound(HttpSessionBindingEvent event) {

28 System.out.println(name+"被session踢出来了");

29 }

30

31 public String getName() {

32 return name;

33 }

34

35 public void setName(String name) {

36 this.name = name;

37 }

38

39 public JavaBeanDemo1(String name) {

40 this.name = name;

41 }

42 }

  上述的JavaBeanDemo1这个javabean实现了HttpSessionBindingListener接口,那么这个JavaBean对象可以感知自己被绑定到Session中和从Session中删除的这两个操作,测试代码如下:

1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%@page import=" me.gacl.domain.JavaBeanDemo1"%> 3 <!DOCTYPE HTML> 4 <html> 5 <head> 6 <title></title> 7 </head> 8

9 <body>10 <%

11 //将javabean对象绑定到Session中

12 session.setAttribute("bean",new JavaBeanDemo1("孤傲苍狼"));

13 //从Session中删除javabean对象

14 session.removeAttribute("bean");

15 %>16 </body>17 </html>

  运行结果如下:

  

2.2、HttpSessionActivationListener接口

  实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件

  当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)之前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被序列化(钝化)到硬盘中.

  当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中

范例:

1 package me.gacl.domain;

2

3 import java.io.Serializable;

4

5 import javax.servlet.http.HttpSessionActivationListener;

6 import javax.servlet.http.HttpSessionEvent;

7

8 /** 9 * @ClassName: JavaBeanDemo2

10 * @Description:

11 实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件

12 活化:javabean对象和Session一起被反序列化(活化)到内存中。

13 钝化:javabean对象存在Session中,当服务器把session序列化到硬盘上时,如果Session中的javabean对象实现了Serializable接口

14 那么服务器会把session中的javabean对象一起序列化到硬盘上,javabean对象和Session一起被序列化到硬盘中的这个操作称之为钝化

15 如果Session中的javabean对象没有实现Serializable接口,那么服务器会先把Session中没有实现Serializable接口的javabean对象移除

16 然后再把Session序列化(钝化)到硬盘中

17 当绑定到 HttpSession对象中的javabean对象将要随 HttpSession对象被钝化之前,

18 web服务器调用该javabean对象对象的 void sessionWillPassivate(HttpSessionEvent event)方法

19 这样javabean对象就可以知道自己将要和 HttpSession对象一起被序列化(钝化)到硬盘中

20 当绑定到HttpSession对象中的javabean对象将要随 HttpSession对象被活化之后,

21 web服务器调用该javabean对象的 void sessionDidActive(HttpSessionEvent event)方法

22 这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中

23 * @author: 孤傲苍狼

24 * @date: 2014-9-11 下午11:22:35

25 *

26 */

27 public class JavaBeanDemo2 implements HttpSessionActivationListener,

28 Serializable {

29

30

31 private static final long serialVersionUID = 7589841135210272124L;

32 private String name;

33

34 @Override

35 public void sessionWillPassivate(HttpSessionEvent se) {

36

37 System.out.println(name+"和session一起被序列化(钝化)到硬盘了,session的id是:"+se.getSession().getId());

38 }

39

40 @Override

41 public void sessionDidActivate(HttpSessionEvent se) {

42 System.out.println(name+"和session一起从硬盘反序列化(活化)回到内存了,session的id是:"+se.getSession().getId());

43 }

44

45 public String getName() {

46 return name;

47 }

48

49 public void setName(String name) {

50 this.name = name;

51 }

52

53 public JavaBeanDemo2(String name) {

54 this.name = name;

55 }

56 }

  为了观察绑定到HttpSession对象中的javabean对象随HttpSession对象一起被钝化到硬盘上和从硬盘上重新活化回到内存中的的过程,我们需要借助tomcat服务器帮助我们完成HttpSession对象的钝化和活化过程,具体做法如下:

  在WebRoot\META-INF文件夹下创建一个context.xml文件,如下所示:

  

  context.xml文件的内容如下:

1 <Context>2 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">3 <Store className="org.apache.catalina.session.FileStore" directory="gacl"/>4 </Manager>5 </Context>

  在context.xml文件文件中配置了1分钟之后就将HttpSession对象钝化到本地硬盘的一个gacl文件夹中

  jsp测试代码如下:

1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%@page import="me.gacl.domain.JavaBeanDemo2"%> 3 <!DOCTYPE HTML> 4 <html> 5 <head> 6 <title></title> 7 </head> 8

9 <body>10 一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}

11 <hr/>12 <%

13 session.setAttribute("bean",new JavaBeanDemo2("孤傲苍狼"));

14 %>15 </body>16 </html>

  访问这个jsp页面,服务器就会马上创建一个HttpSession对象,然后将实现了HttpSessionActivationListener接口的JavaBean对象绑定到session对象中,这个jsp页面在等待1分钟之后没有人再次访问,那么服务器就会自动将这个HttpSession对象钝化(序列化)到硬盘上,

  

  我们可以在tomcat服务器的work\Catalina\localhost\JavaWeb_Listener_20140908\gacl文件夹下找到序列化到本地存储的session,如下图所示:

  

  当再次访问这个Jsp页面时,服务器又会自动将已经钝化(序列化)到硬盘上HttpSession对象重新活化(反序列化)回到内存中。运行结果如下:

  

  JavaWeb开发技术中的监听器技术的内容就这么多了,在平时的工作中,监听器技术在JavaWeb项目开发中用得是比较多,因此必须掌握这门技术。

javaweb学习总结(四十五)——监听器(Listener)学习二相关推荐

  1. JavaScript学习(四十五)—练习题

    JavaScript学习(四十五)-练习题 习题1 习题2:

  2. 深度学习(四十)——深度强化学习(3)Deep Q-learning Network(2), DQN进化史

    Deep Q-learning Network(续) Nature DQN DQN最早发表于NIPS 2013,该版本的DQN,也被称为NIPS DQN.NIPS DQN除了提出DQN的基本概念之外, ...

  3. JavaWeb学习 (二十六)————监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  4. 深度学习(四十五)——Stack GAN, GAN Ensemble, Pix2Pix, CycleGAN

    Stack GAN 论文: <StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversar ...

  5. 深度学习(四十五)条件对抗网络

  6. 云e办学习笔记(十五)Redis学习以及相关部署

    前言 本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录.云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7T ...

  7. 深度学习(四十八)InfoGAN学习笔记

  8. JavaScript学习(六十五)—数组知识点总结

    JavaScript学习(六十五)-数组 学习内容 一.什么是数组 二.数组的分类 三.数组的创建方式 四.数组元素 五.数组的操作 六.数组元素遍历的四种方法 七.随机数为数组赋值 八.数组的比较 ...

  9. 动手深度学习笔记(四十五)8.1. 序列模型

    动手深度学习笔记(四十五)8.1. 序列模型 8.1. 序列模型 8.1.1. 统计工具 8.1.1.1. 自回归模型 8.1.1.2. 马尔可夫模型 8.1.1.3. 因果关系 8.1.2. 训练 ...

最新文章

  1. 10个你必须知道的jQueryMobile代码片段(转)
  2. 网络地址和广播地址的作用
  3. AWK增强的文本处理shell特征--AWK完全手册
  4. javascript中创建对象的几种方式
  5. elementui table 不显示表头_不懂就问 || 单晶XRD第二期课后答疑出炉啦!!
  6. Luogu P4709 信息传递 (群论、生成函数、多项式指数函数)
  7. PHP面试题:写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())
  8. python 字典字符串转字典——urllib.request.Request发送get,post请求,发送json参数
  9. 返回变量内容的错误示例和正确返回的4种方法
  10. spi四种工作模式时序图_还没学会SPI总线协议?干货都在这里
  11. 图解TCP 的重传、滑动窗口、流量控制和拥塞控制机制
  12. 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
  13. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
  14. LeetCode81. 搜索旋转排序数组 II(二分查找)
  15. (转)Singleton 单例模式(懒汉方式和饿汉方式)
  16. padavan支持惠普打印服务器,【完美解决】openwrt共享hp1020打印机,HP/惠普打印机_好文分享_优购 - 荐优,购适...
  17. u盘制作双系统启动盘及在移动硬盘上安装Linux操作系统
  18. android svg 编辑器,Android svg 格式使用小结
  19. halcon21.11安装教程详解
  20. Word 去除页眉横线

热门文章

  1. python带通滤波_python中的fft带通滤波器
  2. mysql编写函数 求1 n 偶数之和,编写求1 2 3 - n的函数.在main函数中调用该函数
  3. hi3798mv300是什么手机_华为海思电视芯片hi3798mv300 硬件参数如何?
  4. python网页保存为图片_使用Python保存网页上的图片或者保存页面为截图
  5. Ogre共享骨骼与两种骨骼驱动方法
  6. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战
  7. Java Language Changes for Java SE 9
  8. Cache的一些总结
  9. 显示/隐藏Mac系统中所有的隐藏文件
  10. SQL——快速定位相关的外键表