Listener 监听器
Servlet API提供了一系列的事件和事件监听接口,这里监听的所有事件都继承自 java.util.Event 对象
监听器接口根据作用范围可分为三类:application范围(ServletContext)、session范围(HttpSession)、request范围(ServletRequest)
监听器接口主要在 javax.servlet 和 javax.servlet.http 的包中
javax.servlet.ServletContextListener // 能够相应 ServletContext 声明周期事件。提供了 ServletContext 创建之后和 ServletContext 关闭之前的会被调用的方法。 javax.servlet.ServletContextAttributeListener // 能够相应 ServletContext 范围的属性添加、删除、替换事件
javax.servlet.http.HttpSessionListener // 能够相应 HttpSession 的创建、超时、失效事件 javax.servlet.http.HttpSessionAttributeListener // 能够响应 HttpSession 范围的属性添加、删除、替换事件 javax.servlet.http.HttpSessionActivationListener // 在一个 HttpSession 激活或失效时被调用 javax.servlet.http.HttpSessionBindingListener // javax.servlet.ServletRequestListener // 能够相应一个 ServletRequest 的创建或删除 javax.servlet.ServletRequestAttributeListener // 能够相应 ServletRequest 范围的属性值添加、删除、修改事件 javax.servlet.AsyncListener // 一个用于异步操作的监听器
编写一个监听器,只需要编写一个Java类来实现对应的监听器接口,然后注册该监听器就可以了
一个应用中可以添加多个监听器,它们是同步工作的。
使用部署描述符(web.xml)进行注册
<listener> <listener-class>监听器的全限定名</listener-class> </listener>
使用 WebListener 注解进行注册
@WebListener public class ListenerClass implements Listenerinterface { ... }
ServletContext 监听器 application范围
该类监听器包含两个接口:ServletContextListener、ServletContextAttributeListener
ServletContextListener能够对ServletContext的创建和销毁作出相应。其包含两个方法
default void contextInitialized(ServletContextEvent sce) // 当ServletContext初始化时,容器调用该方法 default void contextDestroyed(ServletContextEvent sce) // 当ServletContext将要销毁时,容器调用该方法
这两个方法都会从容器获取一个ServletContextEvent对象,该对象只有一个方法getServeltContext()方法
public class ServletContextEvent extends java.util.EventObject
package app08a.listener; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class AppListener implements ServletContextListener { // 监听器, @Override public void contextDestroyed(ServletContextEvent sce) { } @Override public void contextInitialized(ServletContextEvent sce) { // 容器会在ServeltContext初始化时调用该方法 ServletContext servletContext = sce.getServletContext(); Map<String, String> countries = new HashMap<>(); countries.put("ca", "Canada"); countries.put("us", "United States"); servletContext.setAttribute("countries", countries); } }
<!-- countries.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>countries</title> </head> <body> We operate in these countries: <ul> <c:forEach items="${countries }" var="country"> <!-- 使用JSTL标签 --> <li>${country.value }</li> </c:forEach> </ul> </body> </html>
当一个 ServletContext 范围的属性被添加、删除、替换时,ServletContextAttributeListener接口的实现类会接受到消息。
该接口有三个方法
default void attributeAdded(ServletContextAttributeEvent scae) // 在一个ServletContext范围属性被添加时被容器调用 default void attributeRemoved(ServletContextAttributeEvent scae) // 在一个ServletContext范围属性被删除时被容器调用 default void attributeReplaced(ServletContextAttributeEvent scae) // 在一个ServletContext范围属性被替换时被容器调用
HttpSession 监听器 session范围
该类监听器有四个接口,都在 javax.servlet.http 包中
HttpSessionListener // 当一个HttpSession 创建或销毁时,容器会通知所有的HttpSessionListener监听器 HttpSessionAttributeListener // 响应 HttpSession 范围属性的添加、删除、替换 HttpSessionActivationListener // 在分布式环境下,会用多个容器来进行负载均衡,有可能需要将session保存起来,在容器间进行传递。 // 例如当一个容器内存不足时,会把很少用到的对象转存到其他容器中,此时容器就会通知所有HttpSessionActionListener接口的实现类。
HttpSessionBindingListener // 当有属性绑定或解绑到HttpSession上时,容器就会调用该监听器。
HttpSessionListener 监听器 该监听器有两个方法
default void sessionCreated(HttpSessionEvent se) // default void sessionDestroyed(HttpSessionEvent se) //
HttpSessionAttributeListener 监听器 该监听器有三个方法
default void attributeAdded(HttpSessionBindingEvent se) // default void attributeRemoved(HttpSessionBindingEvent se) // default void attributeReplaced(HttpSessionBindingEvent se) //
HttpSessionActivationListener 监听器 该监听器有两个方法
default void sessionDidActivate(HttpSessionEvent se) // 当 HttpSession 被转移到其他容器之后,容器调用该方法 default void sessionWillPassivate(HttpSessionEvent se) // 当一个HttpSession 将要失效时,容器会调用该方法。
HttpSessionBindingListener 监听器 该监听器有两个方法
default void valueBound(HttpSessionBindingEvent event) // default void valueUnbound(HttpSessionBindingEvent event) //
ServletRequest 监听器request范围
该类监听器有三个接口
ServletRequestListener // 对ServletRequest的创建和销毁进行响应。容器会通过一个池来存放并重复利用多个ServletRequest,
// ServletRequest的创建是从容器池里被分配出来的时刻开始,而销毁的时刻是放回容器池里的时间。 ServletRequestAttributeListener // 当一个ServletRequest范围的属性被添加、删除、替换时,该监听器会被调用。 AsyncListener //
ServletRequestListener监听器,该监听器有两个方法
default void requestInitialized(ServletRequestEvent sre) // 当一个ServletRequest创建(从容器池里取出)时,容器调用该方法 default void requestDestroyed(ServletRequestEvent sre) // 当ServletRequest销毁(被容器回收)时,容器调用该方法
ServletRequestAttributeListener 监听器,该监听器有三个方法
default void attributeAdded(ServletRequestAttributeEvent srae) // default void attributeRemoved(ServletRequestAttributeEvent srae) // default void attributeReplaced(ServletRequestAttributeEvent srae) //