监听器Listener
方便自己查询,嫌低级的勿喷。。。。
监听器主要功能是负责监听Web的各种操作,当相关事件触发后将产生事件,并对此事件进行处理。
一.对application监听
对application监听实际上就是对ServletContext监听,主要使用ServletContextListener和ServletContextAttributeListener两个接口:
1.上下文状态监听:ServletContextListener接口
javax.servlet.ServletContextListener接口定义的方法如下:
No | 方法 | 描述 |
1 | public void contextInitialized(ServletContextEvent sce) | 容器启动时触发 |
2 | public void contextDestroyed(ServletContextEvent sce) | 容器销毁时触发 |
在上下文状态监听操作中,一旦触发了ServletContextListener接口中定义的事件后,可以通过ServletContextEvent获取一个ServletContext对象的实例(application对象):
No | 方法 | 描述 |
1 | public ServletContext getServletContext() | 取得ServletContext对象 |
package org.lxh.listenerdemo ; import javax.servlet.* ; public class ServletContextListenerDemo implements ServletContextListener { public void contextInitialized(ServletContextEvent event){ System.out.println("** 容器初始化 --> " + event.getServletContext().getContextPath()) ; } public void contextDestroyed(ServletContextEvent event){ System.out.println("** 容器销毁 --> " + event.getServletContext().getContextPath()) ; try{ Thread.sleep(300) ; }catch(Exception e){} } }
配置web.xml文件
<listener> <listener-class> org.lxh.listenerdemo.ServletContextListenerDemo </listener-class> </listener>
2.上下文属性监听:ServletContextAttributeListener接口
javax.servlet.ServletContextAttributeListener接口定义的方法如下:
No | 方法 | 描述 |
1 | public void attributeAdded(ServletContextAttributeEvent scab) | 增加属性时触发 |
2 | public void attributeRemoved(ServletContextAttributeEvent scab) | 删除属性时触发 |
3 | public void attributeReplaced(ServletContextAttributeEvent scab) | 替换属性(重复设置)时触发 |
在上下文属性监听中,一旦触发了ServletContextAttributeListener接口中定义的事件后,可以通过ServletContextAttributeEvent获取到下面的方法:
No | 方法 | 描述 |
1 | public String getName() | 取得设置的属性名称 |
2 | public Object getValue() | 取得设置的属性内容 |
package org.lxh.listenerdemo ; import javax.servlet.* ; public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent scab){ System.out.println("** 增加属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ; } public void attributeRemoved(ServletContextAttributeEvent scab){ System.out.println("** 删除属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ; } public void attributeReplaced(ServletContextAttributeEvent scab){ System.out.println("** 替换属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ; } }
配置web.xml文件
<listener> <listener-class> org.lxh.listenerdemo.ServletContextAttributeListenerDemo </listener-class> </listener>
二.对session监听
1.session状态监听:HttpSessionListener接口
javax.servlet.http.HttpSessionListener接口定义的方法如下:
No | 方法 | 描述 |
1 | public void sessionCreated(HttpSessionEvent se) | session创建时调用 |
2 | public void sessionDestroyed(HttpSessionEvent se) | session销毁时调用 |
当session创建或者销毁后,可以通过HttpSessionEvent获取对应的session:
No | 方法 | 描述 |
1 | public HttpSession getSession() | 获取当前session |
package org.lxh.listenerdemo ; import javax.servlet.http.* ; public class HttpSessionListenerDemo implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se){ System.out.println("** SESSION创建,SESSION ID = " +se.getSession().getId() ) ; } public void sessionDestroyed(HttpSessionEvent se){ System.out.println("** SESSION销毁,SESSION ID = " +se.getSession().getId() ) ; } }
配置web文件同上。
2.session属性监听:HttpSessionAttributeListener接口
javax.servlet.http.HttpSessionAttributeListener接口定义的方法如下:
No | 方法 | 描述 |
1 | public void attributeAdded(HttpSessionBindingEvent se) | 增加属性时触发 |
2 | public void attributeRemoved(HttpSessionBindingEvent se) | 删除属性时触发 |
3 | public void attributeReplaced(HttpSessionBindingEvent se) | 替换属性时触发 |
当进行属性操作时,可以通过HttpSessionBindingEvent接口获取session相关的信息:
No | 方法 | 描述 |
1 | public HttpSession getSession() | 取得当前的session |
2 | public String getName() | 取得属性的名称 |
3 | public Object getValue() | 取得属性的内容 |
package org.lxh.listenerdemo ; import javax.servlet.http.* ; public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent se){ System.out.println(se.getSession().getId() + ",增加属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ; } public void attributeRemoved(HttpSessionBindingEvent se){ System.out.println(se.getSession().getId() + ",删除属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ; } public void attributeReplaced(HttpSessionBindingEvent se){ System.out.println(se.getSession().getId() + ",替换属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ; } }
配置web文件同上。
3.session属性监听:HttpSessionBindingListener接口
上面的session监听接口都是需要在web.xml文件里配置后才能起作用,但是在Web中也提供一个javax.servlet.http.HttpSessionBindingListener接口,通过此接口实现的监听程序可以不用配置而直接使用:
No | 方法 | 描述 |
1 | public void valueBound(HttpSessionBindingEvent event) | 绑定对象到session时触发 |
2 | public void valueUnbound(HttpSessionBindingEvent event) | 从session中移除对象时触发 |
package org.lxh.listenerdemo ; import javax.servlet.http.* ; public class LoginUser implements HttpSessionBindingListener { private String name ;//保存登陆用户姓名 public LoginUser(String name){ this.setName(name) ; } public void valueBound(HttpSessionBindingEvent event){ System.out.println("** 在session中保存LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ; } public void valueUnbound(HttpSessionBindingEvent event){ System.out.println("** 从session中移出LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ; } public String getName(){ return this.name ; } public void setName(String name){ this.name = name ; } }
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="org.lxh.listenerdemo.*"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% LoginUser user = new LoginUser("MLDN") ; session.setAttribute("info",user) ; // 直接保存LoginUser对象
session.removeAttribute("info") ; // 直接保存LoginUser对象 %> </body> </html>
首先实例化一个LoginUser对象(注意用户名同session的用户名一致),然后将此对象保存在session属性范围内,这样监听器就会自动调用valueBound()操作进行处理。直接从session中删除info属性,监听器会自动调用valueUnbound()操作进行处理。
三.对request监听
1.请求状态监听:ServletRequestListener接口
javax.servlet.ServletRequestListener接口定义方法如下:
No | 方法 | 描述 |
1 | public void requestInitialized(ServletRequestEvent sre) | 请求开始时调用 |
2 | public void requestDestroyed(ServletRequestEvent sre) | 请求结束时调用 |
ServletRequestListener接口一旦监听到事件后,通过ServletRequestEvent接口获取request对象和application对象:
No | 方法 | 描述 |
1 | public ServletRequest getServletRequest() | 取得ServletRequest对象 |
2 | public ServletContext getServletContext() | 取得ServletContext对象 |
package org.lxh.listenerdemo ; import javax.servlet.* ; public class ServletRequestListenerDemo implements ServletRequestListener { public void requestInitialized(ServletRequestEvent sre){ System.out.println("** request初始化。http://" + sre.getServletRequest().getRemoteAddr() + sre.getServletContext().getContextPath()) ; } public void requestDestroyed(ServletRequestEvent sre){ System.out.println("** request销毁。http://" + sre.getServletRequest().getRemoteAddr() + sre.getServletContext().getContextPath()) ; } }
配置文件同上。
2.request属性监听:ServletRequestAttributeListener接口
javax.servlet.ServletRequestAttributeListener接口定义的方法如下:
No | 方法 | 描述 |
1 | public void attributeAdded(ServletRequestAttributeEvent srae) | 属性增加时调用 |
2 | public void attributeReplaced(ServletRequestAttributeEvent srae) | 属性替换时调用 |
3 | public void attributeRemoved(ServletRequestAttributeEvent srae) | 属性删除时调用 |
当request属性操作时通过ServletRequestAttributeEvent接口获取对应属性的名称和内容:
No | 方法 | 描述 |
1 |
public String getName() |
取得设置的属性名称 |
2 | public Object getValue() | 取得设置的属性内容 |
package org.lxh.listenerdemo ; import javax.servlet.* ; public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener { public void attributeAdded(ServletRequestAttributeEvent srae){ System.out.println("** 增加request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ; } public void attributeRemoved(ServletRequestAttributeEvent srae){ System.out.println("** 删除request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ; } public void attributeReplaced(ServletRequestAttributeEvent srae){ System.out.println("** 替换request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ; } }
配置文件同上。