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

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

  域对象中属性的变更的事件监听器就是用来监听 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项目开发中用得是比较多,因此必须掌握这门技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel_DATEDIF函数计算工龄、计算年假

基本语法 DATEDIF(开始日期&#xff0c;结束日期&#xff0c;unit) 基本用法&#xff1a; 实战&#xff1a; 1、计算工龄&#xff1a; 2、计算年假 转载于:https://www.cnblogs.com/wodexk/p/10799890.html

Cordova - 彻底搞定IOS编译!

操作系统&#xff1a;OSX10.14 XCode&#xff1a;10.1 Cordova&#xff1a;8.1.2 假设已经配置好了Cordova开发环境&#xff0c;Apple ID你也有&#xff0c;XCode也可以正常工作了&#xff0c;那么就可以继续看这篇文章了&#xff01; 如果你没有看我这篇文章&#xff0c;那么你…

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

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

vue无缝滚动的插件开发填坑分享

写插件的初衷 1.项目经常需要无缝滚动效果&#xff0c;当时写jq的时候用用msClass这个老插件&#xff0c;相对不上很好用。2.后来转向vue在vue-awesome没有找到好的无缝滚动插件&#xff0c;除了配置swiper可以实现但是相对来说太重了&#xff0c;于是自己造了个轮子。 3.在这分…

PHP常用的自定义函数

PHP常用的自定义函数 目录 php常用自定义函数类下载php 设置字符编码为utf-8路径格式化(替换双斜线为单斜线)转码打印输出api返回信息字符串截取 方法一:方法二:数组 字符串 对象 json格式的字符串互转强制类型转换php序列化serialize与返回序列化unserialeze创建日志文件获取i…

春第十周作业

作业&#xff1a; 这个作业属于那个课程C语言程序设计II这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3162我在这个课程的目标是阅读并学习这个作业在那个具体方面帮助我实现目标知道了我们以后工作所需的是雇主所需的参…

第六次作业(C语言)

心得体会 该题主要涉及知识点有&#xff1a;1、函数的定义&#xff1b;2、函数的调用&#xff08;即prime函数的调用&#xff09;&#xff1b;3、素数的判断&#xff1b;4、大小排序。 看到题时我首先想到了嵌套循环&#xff0c;可是仔细一看题目要求的是用prime函数的调用&…

ProtocolHandler继承体系

转载于:https://www.cnblogs.com/GooPolaris/p/10815072.html

高频ES6

var promise new Promise((resolve, reject)> {if (操作成功) {resolve (value)}else{reject(error)} }) promise.than(function (value) {/*成功*/}, function(value) {/*失败*/}) Promise是异步编程的一种解决方案, 比传统的解决方案--回调函数和事件更加强大.由社区最早…

NodeJS+Express+MongoDB - 张果 - 博客园

目录 一、MongoDB 1.1、安装MongoDB 1.1.1、配置运行环境1.1.2、运行MongoDB1.2、数据库操作 1.2.1、创建数据库与查看数据库1.2.2、删除数据库1.2.3、插入数据1.2.4、查询数据1.2.5、修改1.2.6、删除二、NodeJS访问MongoDB 2.1、安装MongoDB访问驱动2.2、添加数据2.3、修改数…

一个好用的浏览器暗色浏览插件 Dark Reader

转载于:https://www.cnblogs.com/tyong/p/9973363.html

实验 4 [bx]和 loop 的使用

实验结论 实验1&#xff1a;综合使用 loop,[bx]&#xff0c;编写完整汇编程序&#xff0c;实现向内存 b800:07b8 开始的连续 16 个字单元重复填充字数据 0403H。 1.源代码及实验结果 运行结果&#xff1a;屏幕中央出现一排红色的心❤。 2.将源代码程序中字数据 0403H→修改为 0…

linux开发工具之gcc

首先gcc编译链接的一个实例如下所示&#xff1a; 接下来看一下gcc的常见选项&#xff1a; gcc的使用示例&#xff1a; 转载于:https://www.cnblogs.com/wsw-seu/p/10826124.html

音频基本概念

音频基本概念 声音的本质 音调&#xff1a;频率 音量&#xff1a;振幅 音色&#xff1a;与材质有关&#xff0c;谐波&#xff08;不规则的正玄波&#xff09; 屏幕快照 2018-12-04 下午1.53.40.png采样-量化-编码 采样大小&#xff1a; 一个采样用多少bit存放&#xff0c;目前常…

How to use external classes and PHP files in Laravel Controller?

By: Povilas KoropLaravel is an MVC framework with its own folder structure, but sometimes we want to use something external which doesn’t follow the same structure. Let’s review two different scenarios – when we have external class and when it’s just a…

Vue 从入门到进阶之路(十四)

之前的文章我们对 vue 的基础用法已经有了很直观的认识&#xff0c;本章我们来看一下 vue 中的生命周期函数。 上图为 Vue官方为我们提供的完整的生命周期函数的流程图&#xff0c;下面的案例我们只是走了部分情况流程&#xff0c;但所有的生命周期函数都涉及到了。 1 <!DOC…

css 清除浮动float 嗒嘀嗒滴 ----20181120

手动给父元素添加高度通过clear清除内部和外部浮动给父元素添加overfloat属性并结合zoom:1使用给父元素添加浮动        常用方法&#xff1a; ①给兄弟元素添加clear属性&#xff1a;添加一个class为clear&#xff1a;both&#xff0c; ②添加伪类&#xff1a;.clearf…

微软最爽命令行工具发布!

最近微软发布了命令行工具Windows Terminal&#xff0c;简直要让我们爽翻天 长期以来&#xff0c;Linux和Mac下的命令行工具自成一派&#xff0c;Windows却是另一套命令系统。这就比较恶心了&#xff0c;这也是很多开发者不选择Windows系统的原因。 但是现在完全不一样了&#…

vue项目中 axios请求拦截器与取消pending请求功能 - 年少、 - 博客园

在开发vue项目中&#xff0c;请求是不可缺少的&#xff0c;在发送请求时常常需要统一处理一些请求头参数等设置与响应事件&#xff0c;这时利用请求拦截器再好不过。 这里以axios请求为例 实现了设置统一请求头添加token, 其中token在登录时被存入了localStorage中。 同时拦…

gitbook 入门教程之解决windows热加载失败问题

破镜如何贴花黄 gitbook 在 Windows 系统无法热加载,总是报错! gitbook 是一款文档编写利器,可以方便地 markdown 输出成美观优雅的 html ,gitbook serve 启动服务器后,原来相貌平平的 markdown 丑小鸭摇身一变就成了倾国倾城的 html 绝色佳人. 如果源文件发生更改,Windows 却无…