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

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

1.1、attributeAdded 方法

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

  1. 1 public void attributeAdded(ServletContextAttributeEvent scae)
  2. 2 public void attributeReplaced(HttpSessionBindingEvent hsbe)
  3. 3 public void attributeRmoved(ServletRequestAttributeEvent srae)

1.2、attributeRemoved 方法

  当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应
  各个域属性监听器中的完整语法定义为:

  1. 1 public void attributeRemoved(ServletContextAttributeEvent scae)
  2. 2 public void attributeRemoved (HttpSessionBindingEvent hsbe)
  3. 3 public void attributeRemoved (ServletRequestAttributeEvent srae)

1.3、attributeReplaced 方法

  当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应
  各个域属性监听器中的完整语法定义为:

  1. 1 public void attributeReplaced(ServletContextAttributeEvent scae)
  2. 2 public void attributeReplaced (HttpSessionBindingEvent hsbe)
  3. 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 implements
  16. 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. 1 <listener>
  2. 2 <description>MyServletContextAttributeListener监听器</description>
  3. 3 <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class>
  4. 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 implements
  11. 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. 1 <listener>
  2. 2 <description>MyRequestAndSessionAttributeListener监听器</description>
  3. 3 <listener-class>me.gacl.web.listener.MyRequestAndSessionAttributeListener</listener-class>
  4. 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. private static final long serialVersionUID = 7589841135210272124L;
  31. private String name;
  32.  
  33. @Override
  34. public void sessionWillPassivate(HttpSessionEvent se) {
  35.  
  36. System.out.println(name+"和session一起被序列化(钝化)到硬盘了,session的id是:"+se.getSession().getId());
  37. }
  38.  
  39. @Override
  40. public void sessionDidActivate(HttpSessionEvent se) {
  41. System.out.println(name+"和session一起从硬盘反序列化(活化)回到内存了,session的id是:"+se.getSession().getId());
  42. }
  43.  
  44. public String getName() {
  45. return name;
  46. }
  47.  
  48. public void setName(String name) {
  49. this.name = name;
  50. }
  51.  
  52. public JavaBeanDemo2(String name) {
  53. this.name = name;
  54. }
  55. }

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

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

  

  context.xml文件的内容如下:

  1. 1 <Context>
  2. 2 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
  3. 3 <Store className="org.apache.catalina.session.FileStore" directory="gacl"/>
  4. 4 </Manager>
  5. 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学习总结(11)- 监听器(Listener)学习(2)的更多相关文章

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

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

  2. JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

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

  3. 深入分析JavaWeb Item39 -- 监听器(Listener)学习进阶

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

  4. 监听器(Listener)学习(一)

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

  5. 监听器(Listener)学习(二)在开发中的常见应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用: 统计当前在线人数 自定义Session扫描器 一.统计当前在线人数 在JavaWeb应用开发中,有时候 ...

  6. 监听器(Listener)学习(二)

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

  7. javaweb学习总结(四十五)——监听器(Listener)学习二

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

  8. javaweb学习总结(四十四)——监听器(Listener)学习

    一.监听器介绍 1.1.监听器的概念

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

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

随机推荐

  1. gcc编译参数之m32 m64

    m32指定编译为32位应用程序: make CFLAGS=-m32 m64指定编译为64位应用程序: make CFLAGS=-m64

  2. NestedScrollView嵌套RecycleView 滑动 实现上滑隐藏 下滑显示头部效果

    废了好大的劲才弄好的,记下来 方便以后查看 public class MainActivity extends AppCompatActivity { private RecyclerView mRe ...

  3. 探讨弹性布局Flexible Box

    虽然Flex布局09年就被W3C所提出,但是目前浏览器支持上还不是很好,网上找的一张图片,仅供参考: 我们先从简单讲起.如果仅仅只想实现一个栅格布局,没必要引入一个复杂的框架(如bootstrap), ...

  4. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  5. MongoDB系列:把mongodb作为windows的服务来启动

    1.首先切换到mongodb安装目录下的bin目录,在控制台直接运行以下命令 "C:\Program Files\MongoDB\Server\3.0\bin\mongod.exe" ...

  6. 【转】JDBC学习笔记(3)——复习和练习

    转自:http://www.cnblogs.com/ysw-go/ 复习部分 一.获取数据库连接 1)方式一 1 // 获取数据库连接 2 @Test 3 public void testGetCon ...

  7. 任务十二:学习CSS 3的新特性

    任务目的 学习了解 CSS 3 都有哪些新特性,并选取其中一些进行实战小练习 任务描述 实现 示例图(点击查看) 中的几个例子 实现单双行列不同颜色,且前三行特殊表示的表格 实现正常状态和focus状 ...

  8. [ SharePoint ADFS 开发部署系列 (一)]

    前言 本文完全原创,转载请说明出处,希望对大家有用. 随着企业信息化建设逐渐成熟,基于微软体系的企业内部系统架构在众多企业中得到应用,随之而来的用户统一身份认证(SSO)问题成为企业IT部门急需解决的 ...

  9. html渲染过程

    用户输入url地址,浏览器依据域名寻觅IP地址浏览器向服务器发送http恳求,假如服务器段回来以301之类的重定向,浏览器依据相应头中的location再次发送恳求服务器端承受恳求,处理恳求生成htm ...

  10. 由CODEVS笨小猴1053引发的一些思考

    #include<cstdio> #include<cstring> ]; ]; int check(int n) { ||n==) ; ;m*m<=n;++m) ) ; ...