日期:2014-05-18  浏览次数:20657 次

[Java EE 7] 事件监听器
事件监听器提供了 ServletContext、HttpSession 和 ServletRequest  对象生命周期的回掉事件。

事件监听器类需要实现接口,用于接收这些对象状态发生改变时所发出的通知。

每个监听器都可以通过 @WebListener、或 web.xml、 或 ServletContext.addListener 方法来进行注册。

同一个事件,可能注册了多个监听器进行监听,容器会按照监听器的顺序依次调用监听器的方法。但是在应用程序关闭的时候,监听器会反序调用。

实现 ServletContextListener 用于监听 servlet 上下文的初始化和销毁:

@WebListener
public class MyContextListener implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent sce) {
    ServletContext context = sce.getServletContext();
    //. . .
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    //. . .
  }
}


实现 ServletContextAttributeListener 用于监听 servlet 上下文中属性的改变:

public class MyServletContextAttributeListener 
             implements ServletContextAttributeListener {

  @Override
  public void attributeAdded(ServletContextAttributeEvent event) {
    //. . . event.getName();
    //. . . event.getValue();
  }

  @Override
  public void attributeRemoved(ServletContextAttributeEvent event) {
    //. . .
  }

@Override
  public void attributeReplaced(ServletContextAttributeEvent event) {
    //. . .
  }

}


实现 HttpSessionListener 用于监听 session 的创建和销毁:

@WebListener
public class MySessionListener implements HttpSessionListener {

  @Override
  public void sessionCreated(HttpSessionEvent hse) {
    HttpSession session = hse.getSession();
    //. . .
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent hse) {
    //. . .
  }
}


实现 HttpSessionActivationListener 用于监听 session 激活与失活:

public class MyHttpSessionActivationListener 
             implements HttpSessionActivationListener {

  @Override
  public void sessionWillPassivate(HttpSessionEvent hse) {
    // ... hse.getSession();
  }

@Override
  public void sessionDidActivate(HttpSessionEvent hse) {
    // ...
  }    
}


实现 HttpSessionAttributeListener 用于监听 session 中属性的改变:

public class MyHttpSessionAttributeListener 
             implements HttpSessionAttributeListener {

  @Override
  public void attributeAdded(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession();
    //. . . event.getName();
    //. . . event.getValue();
  }

  @Override
  public void attributeRemoved(HttpSessionBindingEvent event) {
    //. . .
  }

  @Override
  public void attributeReplaced(HttpSessionBindingEvent event) {
    //. . .
  }    
}


实现 HttpSessionBindingListener 用于监听对象绑定到 session,或对象从 session 解除:

public class MyHttpSessionBindingListener 
             implements HttpSessionBindingListener {

  @Override
  public void valueBound(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession();
    //. . . event.getName();
    //. . . event.getValue();
  }

  @Override
  public void valueUnbound(HttpSessionBindingEvent event) {
    //. . .
  }    
}


实现 ServletRequestListener 用于监听 request 对象的创建和销毁:

@WebListener
public class MyRequestListener implements ServletRequestListener {
  @Override
  public void requestDestroyed(ServletRequestEvent sre) {
    ServletRequest request = sre.getServletRequest();
    //. . .
  }

  @Override
  public void requestInitialized(ServletRequestEvent sre) {
    //. . .
  }
}


实现 ServletRequestAttributeListener 用于监听 request 对象上属性的改变。

还有 AsyncListener 用于监听异步事件,比如操作完成、操作超时、操作错误等。

除了用 @WebListener 和 web.xml 定义监听器之外,也可以调用 ServletContext.addListener 方法在代码中定义监听器。可以在 ServletContainerInitializer.onStartup 或 ServletContextListener.contextInitialized 方法中做添加监听器的操作。

ServletContainerInitializer.onStartup 将会在应用程序启动的时候调用: