欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Java EE 7] 事件监听器

程序员文章站 2022-04-26 08:37:26
...
事件监听器提供了 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 将会在应用程序启动的时候调用:

public class MyInitializer implements ServletContainerInitializer {
  public void onStartup(Set<Class<?>> clazz, ServletContext context) {
    context.addListener("org.example.MyContextListener");
  }
}


文章来源:http://www.aptusource.org/2014/04/java-ee-7-event-listener/