监听器概念
指专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的行动。
Web监听器是Servlet规范中定义的一种特殊类。
Web监听器可以监听客户端的请求和服务端的操作,可监听三大对象application(ServletContext)、session(HttpSession)、request(ServletRequest)的创建、销毁以及监听域对象的属性发生修改的事件,并可在发生前后做一些相应的处理。
Web监听器的用途:统计在线人数和访问量、系统启动时加载初始化信息、跟Spring结合。
启动顺序:按照web.xml文件中注册的顺序。
优先级:监听器>过滤器>Servlet
在web.xml中注册:
<listener> <listener-class>com.seu.sun.TestServletContextListener</listener-class> </listener>
ServletContextListener
对ServletContext对象监听,主要用途:定时器、全局属性对象。
public class TestServletContextListener implements ServletContextListener{ @Override //ServletContext创建时调用 public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("contextInitialized"); //可以设置全局属性 //servletContextEvent.getServletContext();获得ServletContext对象 //在web.xml中<context-param>标签中定义的全局变量 String s = servletContextEvent.getServletContext().getInitParameter("initParam"); System.out.println(s); } @Override //ServletContext销毁时调用 public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("contextDestroyed"); } }
HttpSessionListener
主要用途:统计在线人数、记录访问日志。
public class TestHttpSessionListener implements HttpSessionListener { private int userNumber; @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { httpSessionEvent.getSession();//获得session对象 userNumber++; //每次登陆产生会话,记录在线人数 httpSessionEvent.getSession().getServletContext().setAttribute("userNumber",userNumber); System.out.println("sessionCreated"); System.out.println(new Date()); } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("sessionDestroyed"); System.out.println(new Date()); } }
ServletRequestListener
主要用途:读取参数、记录访问历史
public class TestServletRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("requestDestroyed"); try { servletRequestEvent.getServletRequest().setCharacterEncoding("UTF8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String a = servletRequestEvent.getServletRequest().getParameter("a"); System.out.println(a); } @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { System.out.println("requestInitialized"); } }
域对象中属性增加和删除的事件监听器
三个对象分别实现下面三个接口:
ServletContextAttributeListener
HTTPSessionAttributeListener
ServletRequestAttributeListener
每个接口的实现需要实现三个方法:
attributeAdded
attributeRemoved
attributeReplaced
如:
public class TestServletContextAttributeListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {} @Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {} @Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {} }
绑定到HttpSession域中的对象状态的事件监听器
HttpSession中对象状态:
绑定——》解除绑定,set,remove属性
绑定监听实现HttpSessionBindingListener接口
钝化——》活化,session钝化机制,将不常用的Session序列化到磁盘上,使用时再反序列化。
Session钝化机制由SessionManager管理
钝化活化监听实现HttpSessionActivationListener接口
这两个监听器不需要在web.xml中注册,将对应的对象实现对应的接口,则该对象被绑定、解绑、钝化、活化时将被监听。
public class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable { private String username; private String password; public void valueBound(HttpSessionBindingEvent httpsessionbindingevent) { System.out.println("valueBound:" + httpsessionbindingevent.getName()); } public void valueUnbound(HttpSessionBindingEvent httpsessionbindingevent) { System.out.println("valueUnbound:" + httpsessionbindingevent.getName()); } public void sessionWillPassivate(HttpSessionEvent httpsessionevent) { System.out.println("sessionWillPassivate:" + httpsessionevent.getSource()); } public void sessionDidActivate(HttpSessionEvent httpsessionevent) { System.out.println("sessionDidActivate:" + httpsessionevent.getSource()); } }
Servlet3.0下监听器用法,注解
@WebListener,该注解用于将类声明为监听器,被该注解标注的类必须实现一个监听器的接口,免去在web.xml中注册。注解方法无法定义顺序(web.xml中按照注册顺序)
慕课学习笔记:https://www.imooc.com/learn/271