深入学习JavaWeb中监听器(Listener)的使用方法
更新时间:2016年09月06日 11:14:34 作者:i10630226
这篇文章主要为大家详细介绍了深入学习JavaWeb中监听器(Listener)的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一、监听域对象中属性的变更的监听器
域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
1.1、attributeAdded 方法
当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
各个域属性监听器中的完整语法定义为:
public void attributeAdded(ServletContextAttributeEvent scae) public void attributeReplaced(HttpSessionBindingEvent hsbe) public void attributeRmoved(ServletRequestAttributeEvent srae)
1.2、attributeRemoved 方法
当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应
各个域属性监听器中的完整语法定义为:
public void attributeRemoved(ServletContextAttributeEvent scae) public void attributeRemoved (HttpSessionBindingEvent hsbe) public void attributeRemoved (ServletRequestAttributeEvent srae)
1.3、attributeReplaced 方法
当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应
各个域属性监听器中的完整语法定义为:
public void attributeReplaced(ServletContextAttributeEvent scae) public void attributeReplaced (HttpSessionBindingEvent hsbe) public void attributeReplaced (ServletRequestAttributeEvent srae)
1.4、ServletContextAttributeListener监听器范例:
编写ServletContextAttributeListener监听器监听ServletContext域对象的属性值变化情况,代码如下:
package me.gacl.web.listener; import java.text.MessageFormat; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; /** * @ClassName: MyServletContextAttributeListener * @Description: ServletContext域对象中属性的变更的事件监听器 * @author: 孤傲苍狼 * @date: 2014-9-11 下午10:53:04 * */ public class MyServletContextAttributeListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent scab) { String str =MessageFormat.format( "ServletContext域对象中添加了属性:{0},属性值是:{1}" ,scab.getName() ,scab.getValue()); System.out.println(str); } @Override public void attributeRemoved(ServletContextAttributeEvent scab) { String str =MessageFormat.format( "ServletContext域对象中删除属性:{0},属性值是:{1}" ,scab.getName() ,scab.getValue()); System.out.println(str); } @Override public void attributeReplaced(ServletContextAttributeEvent scab) { String str =MessageFormat.format( "ServletContext域对象中替换了属性:{0}的值" ,scab.getName()); System.out.println(str); } }
在web.xml文件中注册监听器
<listener> <description>MyServletContextAttributeListener监听器</description> <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class> </listener>
编写ServletContextAttributeListenerTest.jsp测试页面
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>ServletContextAttributeListener监听器测试</title> </head> <body> <% //往application域对象中添加属性 application.setAttribute("name", "孤傲苍狼"); //替换application域对象中name属性的值 application.setAttribute("name", "gacl"); //移除application域对象中name属性 application.removeAttribute("name"); %> </body> </html>
运行结果如下:
从运行结果中可以看到,ServletContextListener监听器成功监听到了ServletContext域对象(application)中的属性值的变化情况。
1.5、ServletRequestAttributeListener和HttpSessionAttributeListener监听器范例:
编写监听器监听HttpSession和HttpServletRequest域对象的属性值变化情况,代码如下:
package me.gacl.web.listener; import java.text.MessageFormat; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class MyRequestAndSessionAttributeListener implements HttpSessionAttributeListener, ServletRequestAttributeListener { @Override public void attributeAdded(ServletRequestAttributeEvent srae) { String str =MessageFormat.format( "ServletRequest域对象中添加了属性:{0},属性值是:{1}" ,srae.getName() ,srae.getValue()); System.out.println(str); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { String str =MessageFormat.format( "ServletRequest域对象中删除属性:{0},属性值是:{1}" ,srae.getName() ,srae.getValue()); System.out.println(str); } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { String str =MessageFormat.format( "ServletRequest域对象中替换了属性:{0}的值" ,srae.getName()); System.out.println(str); } @Override public void attributeAdded(HttpSessionBindingEvent se) { String str =MessageFormat.format( "HttpSession域对象中添加了属性:{0},属性值是:{1}" ,se.getName() ,se.getValue()); System.out.println(str); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { String str =MessageFormat.format( "HttpSession域对象中删除属性:{0},属性值是:{1}" ,se.getName() ,se.getValue()); System.out.println(str); } @Override public void attributeReplaced(HttpSessionBindingEvent se) { String str =MessageFormat.format( "HttpSession域对象中替换了属性:{0}的值" ,se.getName()); System.out.println(str); } }
在web.xml文件中注册监听器