Servlet的Listener的使用

原创
2014/03/03 21:26
阅读数 727

    当Web应用在Web容器中运行时,Web应用内部会不断地发生各种事件,如Web应用被启动,Web应用被停止,用户的Session开始与结束,用户请求到达等,通常来说,这些Web事件对用户是透明的。实际上,ServletAPI提供了大量监听器来监听Web应用的内部事件,从而允许当Web内部事件发生的时候回调事件监听器内的方法。

    使用监听器有两个步骤:1). 定义Listener实现类  2). 通过Annotation或在web.xml文件中配置该Listener

1. 实现Listener类

  与AWT编程完全相似,监听不同Web事件的监听器也不相同。常用的Web事件监听器接口有如下几个:

  • ServletContextListener:用于监听Web应用的启动和关闭

  • ServletContextAttributeListener:用于监听ServletContext范围(Application)内属性的改变

  • ServletRequestListener:用于监听用户请求

  • ServletRequestAttributeListener:用于监听ServletRequest范围(Request)内属性的改变

  • HttpSessionListener:用于监听用户Session的开始和结束

  • HttpSessionAttributeListener:用于监听HttpSession范围(Session)内属性的改变

  下面以Servlet为例介绍Listener的开发和使用。

  ServletContextListener接口定义了如下两个方法:

  • cotextInitialized(ServletContextEvent sce):启动Web应用时,系统会调用Listener的该方法

  • contextDestroyed(ServletContextEvent sce):关闭Web应用时,系统会调用Listener的该方法

  下面将创建一个获取数据库连接的Listener,该Listener会在应用启动时获取数据库连接,并将取到的数据库连接设置成Application范围内的属性,下面是该Listener的代码:

@WebListener  //使用Annotation的方式配置此Listener
public class GetConnectionListener implements ServletContextListener {
  public void contextInitialized(ServletContextEvent sce) { //应用启动时,将调用这个方法
    try {
      ServletContext application = sce.getServletContext();
      //获取的是Web应用的配置参数,而不是像Servlet和Filter获取本身的配置参数。
      //这是因为配置Listener十分简单,只需要简单地指定Listener实现类即可,不能配置初始化参数。
      String driverClassName = appplication.getInitParameter("driverClassName");
      String url = application.getInitParameter("connURL");
      String username = application.getInitParameter("username");
      String password = application.getInitParameter("password");
      Class.forName(driver);
      Connection connection = DriverManager.getConnection(url, username, password);
      application.setAttribute("conection", connection);
    } catch (Exception e) {
      System.out.println("获取数据库连接异常:" + e.getMessage());
    }
  }
  public void contextDestroyed(ServletContextEvent sce) { //应用关闭时,将调用这个方法
    ServletContext application = sce.getServletContext();
    Connection connection = (Connection)application.getAttribute("connection");
    if (connection != null && connection.isOpen()) {
      try {
        connection.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

2. 配置Listener

  配置Listener只需要向Web应用注册Listener实现类即可,为Web应用配置Listener也有两种方式: 1). 使用@WebListener修饰Listener的实现类即可  2). 在web.xml文档中使用<listener>标签进行注册

  使用@WebListener时通常无需指定任何属性,在web.xml中注册Listener也只需要配置<listener-class>元素即可,以下是一个在web.xml文件中配置此Listener的片段:

<listener>
  <listener-class>com.abc.GetConnectionListener</listener-class>
</listener>

 3. 其他几个Listener的简单介绍

  • ServletContextAttributeListener:用于监听ServletContext(Application)范围内属性的变化,实现该接口的监听器需要实现以下方法:   

    attributeAdded(ServletContextAttributeEvent event):当程序把一个属性存入Application范围时触发该方法

    attributeRemoved(ServletContextAttributeEvent event):当程序把一个属性从Application范围删除时触发该方法

    attributeReplaced(ServletContextAttributeEvent event):当程序替换一个Application范围属性时触发该方法

  • ServletRequestListener:用于监听用户请求,实现该接口的监听器需要实现以下方法:

    requestInitialized(ServletRequestEvent event):用户请求到底、被初始化时触发该方法

    requestDestroyed(ServletRequestEvent event):用户请求结束、被销毁时触发该方法

  • ServletRequestAttributeListener,用于监听ServletRequest范围(Request)内属性的改变,接口中定义的方法和ServletContextAttributeListener类此,此处不赘述。


展开阅读全文
打赏
0
7 收藏
分享
加载中
更多评论
打赏
0 评论
7 收藏
0
分享
返回顶部
顶部