六、 Java Listener
1. Java Listener 简介
* Java Listener 1. Java Listener(即:Java 监听器):用于监听 ServletRequest、HttpSession、ServletContext 作用域对象的创建、销毁、及其属性修改变化 2. 在 Web 项目中可以有多个 Java 监听器 3. 应用场景: a.统计在线人数 b.统计页面访问量 c.服务器加载时数据初始化 * Listener 的使用 1. 在 web.xml 中配置监听器: <listener> <listener-class>com.ncdx.listener.MyListener</listener-class> </listener> 2. 创建 Java 类,根据需求实现相应的接口: 1)ServletRequestListener 接口 //声明了 ServletRequest 作用域对象的创建、销毁的监听方法 2)ServletRequestAttributeListener 接口 //声明了 ServletRequest 作用域对象中属性的添加、修改、删除的监听方法 3)HttpSessionListener 接口 //声明了 HttpSession 作用域对象的创建、销毁的监听方法 4)HttpSessionAttributeListener 接口 //声明了 HttpSession 作用域对象中属性的添加、修改、删除的监听方法 5)ServletContextListener 接口 //声明了 ServletContext 作用域对象的创建、销毁的监听方法 6)ServletContextAttributeListener 接口 //声明了 ServletContext 作用域对象中属性的添加、修改、删除的监听方法 3. 重写相应的监听方法
import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MyListener implements ServletRequestListener,ServletRequestAttributeListener, HttpSessionListener,HttpSessionAttributeListener, ServletContextListener,ServletContextAttributeListener{ @Override//监听request对象销毁 public void requestDestroyed(ServletRequestEvent sre) { } @Override//监听request对象创建 public void requestInitialized(ServletRequestEvent sre) { } @Override//监听request作用域数据的添加 public void attributeAdded(ServletRequestAttributeEvent srae) { } @Override//监听request作用域数据的删除 public void attributeRemoved(ServletRequestAttributeEvent srae) { } @Override//监听request作用域数据的修改 public void attributeReplaced(ServletRequestAttributeEvent srae) { } /*.....................................................................*/ @Override//监听session对象的创建 public void sessionCreated(HttpSessionEvent se) { } @Override//监听session对象的销毁 public void sessionDestroyed(HttpSessionEvent se) { } @Override//监听session作用域数据的添加 public void attributeAdded(HttpSessionBindingEvent se) { } @Override//监听session作用域数据的删除 public void attributeRemoved(HttpSessionBindingEvent se) { } @Override//监听session作用域数据的更改 public void attributeReplaced(HttpSessionBindingEvent se) { } /*.........................................................................*/ @Override//监听application对象销毁 public void contextDestroyed(ServletContextEvent sce) { } @Override//监听application对象创建 public void contextInitialized(ServletContextEvent sce) { } @Override//监听application作用域数据的添加 public void attributeAdded(ServletContextAttributeEvent scae) { } @Override//监听application作用域数据的删除 public void attributeRemoved(ServletContextAttributeEvent scae) { } @Override//监听application作用域数据的更改 public void attributeReplaced(ServletContextAttributeEvent scae) { } }
Listener
2. Java 监听器的实例
/** * 模拟统计在线人数 */ public class MyListener implements ServletRequestListener,ServletRequestAttributeListener, HttpSessionListener,HttpSessionAttributeListener, ServletContextListener,ServletContextAttributeListener{ @Override public void contextInitialized(ServletContextEvent sce) {//在ServletContext对象中存储变量用来统计在线人数 //获取ServletContext ServletContext sc = sce.getServletContext(); //在ServletContext对象中存储变量并初始化 sc.setAttribute("count", 0); } @Override public void sessionCreated(HttpSessionEvent se) {//session被创建时人数自增 //获取SerevletContext对象 ServletContext sc = se.getSession().getServletContext(); //获取在线人数的变量 int count = (int)sc.getAttribute("count"); //存储 sc.setAttribute("count", ++count); //显示在线人数 System.out.println("目前在线人数:" + se.getSession().getServletContext().getAttribute("count")); } @Override public void sessionDestroyed(HttpSessionEvent se) {//session被销毁时人数自减 //获取SerevletContext对象 ServletContext sc = se.getSession().getServletContext(); //获取在线统计人数的变量 int count = (int)sc.getAttribute("count"); //存储 sc.setAttribute("count", --count); //显示在线人数 System.out.println("目前在线人数:" + se.getSession().getServletContext().getAttribute("count")); } }