java学习总结之监听器(Listener)

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

使用Listener只需要两个步骤:

(1)定义Listener实现类。

(2)通过Annotaion或在web.xml中配置Listener。

常用的Web事件监听器接口有如下几个:
(1)ServletContextListener:用于监听Web应用的启动和关闭。

(2)ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变。

(3)ServletRequestListener:用于监听用户请求。

(4)ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变。

(5)HttpSessionListener:用于监听用户Session的开始和介绍。

(6)HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。

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

package net.yedward.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class GetConnectionListener implements ServletContextListener {

  /**
   * 应用启动时,该方法被调用
   * 
   * @param sce
   */
  @Override
  public void contextInitialized(ServletContextEvent sce) {
    // 获得该应用的ServletContext实例
    ServletContext application = sce.getServletContext();
    // 从web.xml中获得连接数据库的配置信息
    String driver = application.getInitParameter("driver");
    String url = application.getInitParameter("url");
    String user = application.getInitParameter("user");
    String password = application.getInitParameter("password");
    try {
      Class.forName(driver);
      Connection conn = DriverManager.getConnection(url, user, password);
      application.setAttribute("conn", conn);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }

  /**
   * 应用关闭时,该方法被调用
   * 
   * @param sce
   */
  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    ServletContext application = sce.getServletContext();
    Connection conn = (Connection) application.getAttribute("conn");
    // 关闭数据库连接
    if (conn != null) {
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

}

配置Listener只要向Web应用注册Listener实现类即可,无须配置参数之类的东西,为Web应用程序配置Listener也有两种方式:

(1)使用@WebListener修饰Listener实现类即可。

(2)在web.xml文档中使用<listener.../>元素进行配置。

(3)listener-class:指定Listener实现类。

配置上面代码中的监听,只要在web.xml中如如下配置即可:

<listener>
  <!-- 指定Listener实现类 -->
  <listener-class>package net.yedward.test;</listener-class>
</listener>

下面再有一个使用HttpSessionListener的例子:

package net.yedward.test;

import java.util.HashMap;
import java.util.Map;

public class OnlineListener implements HttpSessionListener {

  /**
   * 当用户与服务器之间开始session时触发该方法
   */
  @Override
  public void sessionCreated(HttpSessionEvent sessionEvent) {
    HttpSession session = sessionEvent.getSession();
    ServletContext application = session.getServletContext();
    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 HashMap<String, String>();
      }
      online.put(sessionId, user);
      application.setAttribute("online", online);
    }
  }

  /**
   * 当用户与服务器之间session断开时出发该方法
   */
  @Override
  public void sessionDestroyed(HttpSessionEvent sessionEvent) {
    HttpSession session = sessionEvent.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);
  }
}

本文标题:java学习总结之监听器(Listener)

本文链接:http://yedward.net/?id=331

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章