当Web应用的web容器中运行时,web应用内部会不断地发生各种事件:如Web应用被启动、Web应用被停止,用户session开始、用户session结束、用户请求到达等,通常来说,这些web事件对开发者是透明的。今天笔者将向大家介绍几个常见的Listener类。
(1). ServletContextListener:用于监听Web应用的启动和关闭
(2). ServletContextAttrbuteListener:用于监听ServletContext范围(application)内属性的改变
(3). ServletRequestListener:用于监听用户请求
(4). ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变
(5). HttpSessionListener:用于监听用户session的开始和结束
(6). HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变
同时,使用listener有两种方法,读者可以根据实际情况自己选择:
(1). 使用@Weblistener修饰listener实现类
(2). 在web.xml文档中使用<listener…>元素进行配置。如:
<listener>
<listener-class>com.linjw.GetConnlistener</listener-class>
</listener>
ServletContextListener主要是web应用的启动和关闭,所以当web启动时,调用的是contextInitialized()的方法,当web关闭时,则调用contextDestroyed()的方法。
@WebListener public class GetConnListener implements ServletContextListener { // 应该启动时,该方法被调用。 public void contextInitialized(ServletContextEvent sce) { try { // 取得该应用的ServletContext实例 ServletContext application = sce.getServletContext(); // 从配置参数中获取驱动 String driver = application.getInitParameter("driver"); // 从配置参数中获取数据库url String url = application.getInitParameter("url"); // 从配置参数中获取用户名 String user = application.getInitParameter("user"); // 从配置参数中获取密码 String pass = application.getInitParameter("pass"); // 注册驱动 Class.forName(driver); // 获取数据库连接 Connection conn = DriverManager.getConnection(url , user , pass); // 将数据库连接设置成application范围内的属性 application.setAttribute("conn" , conn); } catch (Exception ex) { System.out.println("Listener中获取数据库连接出现异常" + ex.getMessage()); } } // 应该关闭时,该方法被调用。 public void contextDestroyed(ServletContextEvent sce) { // 取得该应用的ServletContext实例 ServletContext application = sce.getServletContext(); Connection conn = (Connection)application.getAttribute("conn"); // 关闭数据库连接 if (conn != null) { try { conn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
ServletContextAttributeListener用于监听ServletContext(application)范围属性的变化,实现该方法接口的监听器需要以下的三个方法:
(1). attributeAdded(ServletContextAttributeEventevent):当程序把一个属性放入application范围时触发该方法
(2). attributeRemoved(ServletContextAttributeEventevent):当程序把一个属性从application范围删除时触发该方法。
(3). attributeReplaced(ServletContextAttributeEventevent):当程序替换application范围内的属性时将触发该方法。
@WebListener public class MyServletContextAttributeListener implements ServletContextAttributeListener { // 当程序向application范围添加属性时触发该方法 public void attributeAdded(ServletContextAttributeEvent event) { ServletContext application = event.getServletContext(); // 获取添加的属性名和属性值 String name = event.getName(); Object value = event.getValue(); System.out.println(application + "范围内添加了名为" + name + ",值为" + value + "的属性!"); } // 当程序从application范围删除属性时触发该方法 public void attributeRemoved(ServletContextAttributeEvent event) { ServletContext application = event.getServletContext(); // 获取被删除的属性名和属性值 String name = event.getName(); Object value = event.getValue(); System.out.println(application + "范围内名为" + name + ",值为" + value + "的属性被删除了!"); } // 当application范围的属性被替换时触发该方法 public void attributeReplaced(ServletContextAttributeEvent event) { ServletContext application = event.getServletContext(); // 获取被替换的属性名和属性值 String name = event.getName(); Object value = event.getValue(); System.out.println(application + "范围内名为" + name + ",值为" + value + "的属性被替换了!"); } }
ServletRequestListener用于监听用户请求的到达,实现该接口的监听需要实现如下两个方法:
(1). requestInitialized(ServletRequestEventsre):用户请求到达、被初始化时触发该方法
(2). requestDestroyed(ServletRequestEventsre):用户请求结束、被销毁时触发该方法
ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,实现该接口要实现attribute Added()、attributeRemoved()、attributeReplaced()三个方法。
@WebListener public class RequestListener implements ServletRequestListener , ServletRequestAttributeListener { // 当用户请求到达、被初始化时触发该方法 public void requestInitialized(ServletRequestEvent sre) { HttpServletRequest request = (HttpServletRequest)sre.getServletRequest(); System.out.println("----发向" + request.getRequestURI() + "请求被初始化----"); } // 当用户请求结束、被销毁时触发该方法 public void requestDestroyed(ServletRequestEvent sre) { HttpServletRequest request = (HttpServletRequest)sre.getServletRequest(); System.out.println("----发向" + request.getRequestURI() + "请求被销毁----"); } // 当程序向request范围添加属性时触发该方法 public void attributeAdded(ServletRequestAttributeEvent event) { ServletRequest request = event.getServletRequest(); // 获取添加的属性名和属性值 String name = event.getName(); Object value = event.getValue(); System.out.println(request + "范围内添加了名为" + name + ",值为" + value + "的属性!"); } // 当程序从request范围删除属性时触发该方法 public void attributeRemoved(ServletRequestAttributeEvent event) { ServletRequest request = event.getServletRequest(); // 获取被删除的属性名和属性值 String name = event.getName(); Object value = event.getValue(); System.out.println(request + "范围内名为" + name + ",值为" + value + "的属性被删除了!"); } // 当request范围的属性被替换时触发该方法 public void attributeReplaced(ServletRequestAttributeEvent event) { ServletRequest request = event.getServletRequest(); // 获取被替换的属性名和属性值 String name = event.getName(); Object value = event.getValue(); System.out.println(request + "范围内名为" + name + ",值为" + value + "的属性被替换了!"); } }
HttpSessionListener用于用户监听session的创建和销毁,实现该接口的监听器需要实现如下方法:
(1). sessionCreate(HttpSessionEventse):用户与服务器的会话开始、创建时触发该方法
(2). sessionDestroyed(HttpSessionEventse):用与服务器的会话断开、销毁时触发该方法
HttpSessionAttributeListener则用于监听HttpSession(session)范围内属性的变化,实现监听器需要实现方法有:attributeAdded()、attributeRemoved()、attributeReplaced()三个方法。
@WebListener public class OnlineListener implements HttpSessionListener { // 当用户与服务器之间开始session时触发该方法 public void sessionCreated(HttpSessionEvent se) { HttpSession session = se.getSession(); ServletContext application = session.getServletContext(); // 获取session ID String sessionId = session.getId(); // 如果是一次新的会话 if (session.isNew()) { String user = (String)session.getAttribute("user"); // 未登录用户当游客处理 user = (user == null) ? "游客" : user; Map<String , String> online = (Map<String , String>) application.getAttribute("online"); if (online == null) { online = new Hashtable<String , String>(); } // 将用户在线信息放入Map中 online.put(sessionId , user); application.setAttribute("online" , online); } } // 当用户与服务器之间session断开时触发该方法 public void sessionDestroyed(HttpSessionEvent se) { HttpSession session = se.getSession(); ServletContext application = session.getServletContext(); String sessionId = session.getId(); Map<String , String> online = (Map<String , String>) application.getAttribute("online"); if (online != null) { // 删除该用户的在线信息 online.remove(sessionId); } application.setAttribute("online" , online); } }
以上介绍的只是我们常见的监听类,其实在框架Strtuts2中有着比JSP更强大的监听器。但是我们对于JSP的监听的了解有助于我们学习struts2,同时也可对JSP的核心用法有更深入得知。