使用Listener只需要两个步骤:
- 定义Listener实现类。
- 通过Annotation或在web.xml文件中配置Listener
实现Listener类
监听不同Web事件的监听器不相同,常用的Web事件监听器接口有如下几个:
- ServletContextListener:用于监听Web应用的启动和关闭。
- ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变。
- ServletRequestListener:用于监听用户请求。
- ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变。
- HttpSessionListener:用于监听用户session的开始和结束。
- HttpSessionAttributeListener:用于监听HttpSesssion范围(session)内属性的改变。
以ServletContextListener为例,要实现这个接口,需要实现两个方法:
- contextInitialized(ServletCOntextEvent sce):启动web应用时,系统调用Listener的该方法。
- contextDestroyed(ServletContextEvent sce):关闭web应用时,系统调用Listener的该方法。
ServletContextListener的作用有点类似于load-on-startup Servlet,都可用于在Web应用启动时,回调方法来启动某些后台程序,这些后台程序负责为系统运行提供支持。
例:创建一个Listener,用于在启动时获取数据库连接,设置到application中,关闭应用时,关闭连接。
@WebListener public class GetConnListener implements ServletContextListener{ //应用启动是,该方法被调用 public void contextInitialized(ServletContextEvent sce){ try{ //取得应用的ServletContext实例 ServletContext application = sce.getServletContext(); //从配置参数中获取数据库信息 String driver = application.getInitParameter("driver"); 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(Excetpion e){ e.printStackTrace(); } } //应用关闭时,该方法被调用 public void contextDestroyed(ServletContextEvent sce){ //取得该应用的ServletContext实例 ServletContext application = sce.getServletContext(); Connection conn = (Connection)application.getAttribute("conn"); //关闭数据库连接 if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } }
配置Listener
配置Listener只要向Web应用注册Listener实现类即可,无需配置参数之类的东西。为Web应用配置Listener有两种方式:
- 使用@WebListener修饰Listener实现类。
- 在web.xml文档中使用<listener.../>元素进行配置。
使用@WebListener时通常无需指定任何属性,只要使用该Annotation修饰Listener实现类即可向Web应用注册该监听器。
在web.xml中使用<listener.../>元素进行配置时只要配置其实现类即可,如:
<listener> <!-- 指定Listener的实现类 --> <listener-class>luxl.GetGonnListener</listener-class> </listener>
使用ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext(application)范围内属性的变化,实现该接口的监听器需要实现三个方法:
- attributeAdded(ServletCOntextAttributeEvent event);当程序把一个属性存入application范围时出发该方法。
- attributeRemoved(ServletContextAttributeEvent event);当程序把一个属性从application范围删除时出发该方法。
- attributeReplaced(ServletContextAttributeEvent event);当程序替换application范围内的属性时将出发该方法。
使用ServletRequestListener和ServletRequestAttributeListener
ServletRequestListener用于监听用户请求的到达,实现该接口的监听器需要实现如下两个方法:
- requestInitialized(ServletRequestEvent sre);用户请求到底、被初始化是出发该方法。
- requestDestroyed(ServletRequestEvent sre); 用户请求结束、被销毁时触发该方法。
ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,实现该接口的监听器需要实现attributeAdded、attributeRemoved、attributeReplaced三个方法。
应用程序完全可以采用一个监听器来监听多个事件,只要让该监听器实现类同时实现多个监听器接口即可,不如同时实现ServletRequestListener、ServletRequesetAttributeListener。
使用HttpSessionListener和HttpSessionAttributeListener与使用ServletRequestListener和ServletRequestAttributeListener非常相似。
HttpSessionListener用于监听用户session的创建和销毁,实现该接口的监听器需要实现:
- sessionCreate(HttpSessionEvent se);用户与服务器的会话开始、创建时触发该方法。
- sessionDestroyed(HttpSessionEvent se);用户与服务器的会话断开、销毁时触发该方法。