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) //
原文地址:https://www.cnblogs.com/0820LL/p/9904323.html