事件
监听器提供了
ServletContext、HttpSession 和 ServletRequest 对象生命周期的回掉事件。
事件监听器类需要实现
接口,用于接收这些对象状态发生改变时所发出的通知。
每个监听器都可以通过 @WebListener、或 web.xml、 或 ServletContext.addListener 方法来进行注册。
同一个事件,可能注册了多个监听器进行监听,容器会按照监听器的顺序依次调用监听器的方法。但是在应用程序关闭的时候,监听器会反序调用。
实现 ServletContextListener 用于监听 servlet 上下文的初始化和销毁:
class="java" name="code">@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/