所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生情况时,立即调用相应的方法进行处理。
Servlet 监听器的分类
按监听的对象划分
1.用于监听应用程序环境对象(ServletContext)的事件监听器
2.用于监听用户会话对象(HttpSession)的事件监听器
3.用于监听请求消息对象(ServletRequest)的事件监听器
按监听的事件类项划分
1.用于监听域对象自身的创建和销毁的事件监听器
2.用于监听域对象中的属性的增加和删除的事件监听器
3.用于监听绑定到HttpSession域中的某个对象的状态的事件监听器
编写 Servlet 监听器
1)要实现监听对象对应的接口
2)监听器创建以后要在web.xml中注册
3)servlet事件监听器的注册和调用过程都是由web容器自动完成
4)监听器是线程不安全的
监听域对象的创建和销毁
对象创建和销毁的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。
1 、ServletContext 域
* 创建:是在 Web 服务器启动并加载某个 Web 应用程序时创建相应的ServletContext 对象,
* 销毁:是在 Web 服务器关闭或卸载时为每个 Web 应用程序销毁相应的ServletContext 对象。
java文件中的实现
/** * 用于监听 ServletContextListener 对象的创建和销毁的事件监听器 */ public class MyServletContextListener implements ServletContextListener { /** * 当ServletContext对象创建时,调用该方法 */ public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext 被创建了"); //所有对象共享的 ServletContext sc=sce.getServletContext(); Map<String,String> map=new HashMap<String,String>(); map.put("yxkong", "鱼翔空"); sc.setAttribute("map", map); } /** * 当ServletContext对象销毁时,调用该方法 */ public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContextEvent 对象销毁了"); } }
web.xml文件中的配置
<!-- 注册监听器 --> <listener> <listener-class>com.yxkong.listener.MyServletContextListener</listener-class> </listener>
2 、HttpSession域
* 创建:是在浏览器开始与服务器会话时创建,
* 销毁:是在调用HttpSession.invalidate();超过了Sessiond的最大有效时间间隔,服务器进程被停止的时候。
/** * HttpSessionListener:用于监听session对象的创建和销毁 */ public class MyHttpSessionListener implements HttpSessionListener { /** * 当session对象创建时,调用该方法 */ public void sessionCreated(HttpSessionEvent se) { System.out.println("session 对象被创建了"); HttpSession sessison=se.getSession(); System.out.println("sessison "+sessison); ServletContext sc=sessison.getServletContext(); Map<String,String> map=(Map<String,String>)sc.getAttribute("map"); System.out.println(map.get("yxkong")); } /** * 当session对象销毁时,调用该方法 */ public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session 对象被销毁时"); } }
<!-- 注册监听器 --> <listener> <listener-class>com.yxkong.listener.MyHttpSessionListener</listener-class> </listener>
3 、ServletRequest 域
* 创建:每次请求开始时创建,
* 销毁: 每次访问结束后销毁
/** * 用于监听ServletRequestListener对象的创建和销毁的监听器 */ public class MyServletRequestListener implements ServletRequestListener { /** * 当request对象创建时,调用该方法 */ public void requestInitialized(ServletRequestEvent sre) { System.out.println("HttpServletRequest对象创建"); //获取ServletContext对象 ServletContext sc=sre.getServletContext(); //获取HttpServletRequest对象 HttpServletRequest request=(HttpServletRequest)sre.getServletRequest(); HttpSession session=request.getSession(); ServletContext sc1=session.getServletContext(); Map<String,String> map=(Map<String,String>)sc.getAttribute("map"); System.out.println("MyServletRequestListener "+map.get("yxkong")); } /** * 当request对象销往时,调用该方法 */ public void requestDestroyed(ServletRequestEvent sre) { System.out.println("HttpServletRequest被销毁时"); } }
<!-- 注册监听器 --> <listener> <listener-class>com.yxkong.listener.MyServletRequestListener</listener-class> </listener>
域对象中属性的变更的事件监听器(不需要往xml中注册)
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener
各个域属性监听器中的完整语法定义为:
public void attributeAdded(ServletContextAttributeEvent scae)
public void attributeReplaced(HttpSessionAttributeEvent hsbe)
public void attributeRmoved(ServletRequestAttributeEvent srae)
/** * 往session中增加属性 替换属性 删除属性时,调用该监听器 */ public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener { /** * 当session中增加属性时,调用该方法 */ public void attributeAdded(HttpSessionBindingEvent se) { System.out.println("MyHttpSessionAttributeListener attributeAdded"); String name=se.getName(); Object value=se.getValue(); System.out.println(name + "----------" + value); } /** * 当session中替换属性时,调用该方法,获取的值是被替换的值 */ public void attributeReplaced(HttpSessionBindingEvent se) { System.out.println("MyHttpSessionAttributeListener attributeReplaced"); String name=se.getName(); Object value=se.getValue(); System.out.println(name + "----------" + value); } /** * 当session中删除属性时,调用该方法,获取的值是删除的值 */ public void attributeRemoved(HttpSessionBindingEvent se) { System.out.println("MyHttpSessionAttributeListener attributeRemoved"); String name=se.getName(); Object value=se.getValue(); System.out.println(name + "----------" + value); } }
监听javaBean在session中的状态
保存在 Session 域中的对象可以有多种状态:绑定到 Session 中;从 Session 域中解除绑定;随 Session 对象持久化到一个存储设备中;随 Session 对象从一个存储设备中恢复
Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的这些状态:
HttpSessionBindingListener接口
HttpSessionActivationListener接口 ,
注:实现这两个接口的类不需要 web.xml 文件中进行注册
public class User implements HttpSessionBindingListener,HttpSessionActivationListener,java.io.Serializable { private String name; private String value; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } //对象被绑定到 HttpSession 对象中时 public void valueBound(HttpSessionBindingEvent event) { System.out.println("valueBound "+this); String name=event.getName(); User user=(User)event.getValue(); if(user!=null){ System.out.println("valueBound "+name +"------"+user.getName()); } } //对象从 HttpSession 对象中解除绑定时 public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("valueUnbound "); String name=event.getName(); User user=(User)event.getValue(); if(user!=null){ System.out.println("valueUnbound "+name +"------"+user.getName()); } } //当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后 public void sessionDidActivate(HttpSessionEvent se) { System.out.println("活化 对象随session从存储设备上恢复"); } //当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前 public void sessionWillPassivate(HttpSessionEvent se) { System.out.println("钝化 对象随session持久化到存储设备中"); } }
文章评论