Lisenter

Listener监听器的介绍

  1. Listener 监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是:Servlet程序、 Listener监听器、 Filter过滤器
  2. Listener 是 JavaEE 的规范,就是接口
  3. 监听器的作用是,监听某种变化 ( 一般就是对象创建 / 销毁 , 属性变化 ), 触发对应方法完成 相应的任务
  4. JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener

生命周期

监听器(Listener)在JavaWeb应用程序中起到监听和处理事件的作用。监听器的生命周期与Web应用程序的生命周期密切相关。

  • ServletContextListener:ServletContextListener会在Web应用程序启动时起作用,并在Web应用程序关闭时销毁。具体来说,当Web容器启动时会触发contextInitialized()方法,开发者可以在这个方法中进行一些初始化操作;当Web容器关闭时会触发contextDestroyed()方法,开发者可以在这个方法中进行一些资源释放、清理操作。
  • ServletRequestListener:ServletRequestListener会在每次客户端请求到达服务器时起作用,并在服务器响应完成后销毁。具体来说,当客户端发送请求到达服务器时会触发requestInitialized()方法,开发者可以在这个方法中获取和处理请求相关的信息;当服务器响应完成后会触requestDestroyed()方法,开发者可以在这个方法中进行一些善后操作。
  • HttpSessionListener:HttpSessionListener会在每次HttpSession创建和销毁时起作用。具体来说,当用户访问Web应用程序时,如果尚未创建HttpSession,会触发sessionCreated()方法,在这个方法中可以进行一些会话管理的操作;当HttpSession被销毁时,会触发sessionDestroyed()方法,在这个方法中可以进行一些会话清理的操作。

注意:监听器是通过在web.xml配置文件中声明来启用的。开发者需要在web.xml文件中添加相应的监听器声明,告诉Web容器要监听哪些事件,并指定相应的监听器类。

常见的监听器

  • ServletContextListener:监听ServletContext对象的创建和销毁事件,当Web应用程序启动和关闭时触发。
  • ServletRequestListener:监听ServletRequest对象的创建和销毁事件,在每次客户端请求到达服务器时触发。
  • HttpSessionListener:监听HttpSession对象的创建和销毁事件,当用户与Web应用程序建立和关闭会话时触发。
  • ServletContextAttributeListener:监听ServletContext中属性的添加、修改和删除事件。
  • ServletRequestAttributeListener:监听ServletRequest中属性的添加、修改和删除事件。
  • HttpSessionAttributeListener:监听HttpSession中属性的添加、修改和删除事件。
  • HttpSessionActivationListener:监听HttpSession对象的钝化(passivation)和活化(activation)事件,与分布式会话(Distributed Session)有关。
  • ServletRequestListener:监听ServletContext对象的创建和销毁事件,以及请求的开始和完成。
  • ServletContextListener:监听ServletContext对象的创建和销毁事件,与Web应用程序的启动和关闭有关。

举例

ServletContextListener

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
public class MyServletContextListener implements ServletContextListener {
 
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 应用程序启动时执行的初始化操作
        System.out.println("应用程序已启动");
        // 加载配置文件、初始化数据库连接池等
        // ...
    }
 
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 应用程序关闭时执行的清理操作
        System.out.println("应用程序即将关闭");
        // 关闭数据库连接池、释放资源等
        // ...
    }
}
<listener>
    <listener-class>com.example.MyServletContextListener</listener-class>
</listener>

ServletContextAttributeListener

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
 
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
 
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        // 当ServletContext属性被添加时执行的操作
        String attributeName = event.getName();
        Object attributeValue = event.getValue();
        System.out.println("ServletContext属性 " + attributeName + " 添加,值为: " + attributeValue);
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        // 当ServletContext属性被移除时执行的操作
        String attributeName = event.getName();
        Object attributeValue = event.getValue();
        System.out.println("ServletContext属性 " + attributeName + " 被移除,值为: " + attributeValue);
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        // 当ServletContext属性被替换时执行的操作
        String attributeName = event.getName();
        Object oldAttributeValue = event.getValue();
        Object newAttributeValue = event.getServletContext().getAttribute(attributeName);
        System.out.println("ServletContext属性 " + attributeName + " 被替换,旧值为: " + oldAttributeValue + ",新值为: " + newAttributeValue);
        // 其他处理逻辑
        // ...
    }
}

HttpSessionListener

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
 
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // 当HttpSession被创建时执行的操作
        System.out.println("HttpSession被创建,ID: " + se.getSession().getId());
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // 当HttpSession被销毁时执行的操作
        System.out.println("HttpSession被销毁,ID: " + se.getSession().getId());
        // 其他处理逻辑
        // ...
    }
}

HttpSessionAttributeListener

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
 
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
 
    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        // 当向HttpSession中添加属性时执行的操作
        System.out.println("属性已添加:名称:" + event.getName() + ",值:" + event.getValue());
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        // 当从HttpSession中移除属性时执行的操作
        System.out.println("属性已移除:名称:" + event.getName() + ",值:" + event.getValue());
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        // 当替换HttpSession中的属性时执行的操作
        System.out.println("属性已替换:名称:" + event.getName() + ",旧值:" + event.getValue() + ",新值:" + event.getSession().getAttribute(event.getName()));
        // 其他处理逻辑
        // ...
    }
}

ServletRequestListener

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
 
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
 
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        // 页面请求到达时执行的操作
        System.out.println("收到新请求");
        // 记录请求信息,如URL、参数等
        // ...
    }
 
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // 页面请求处理完成后执行的操作
        System.out.println("请求处理完成");
        // 清理操作,如释放资源
        // ...
    }
}

ServletRequestAttributeListener

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
 
@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
 
    @Override
    public void attributeAdded(ServletRequestAttributeEvent event) {
        // 当向ServletRequest中添加属性时执行的操作
        HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
        System.out.println("属性已添加:名称:" + event.getName() + ",值:" + event.getValue() + ",请求URL:" + request.getRequestURL());
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent event) {
        // 当从ServletRequest中移除属性时执行的操作
        HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
        System.out.println("属性已移除:名称:" + event.getName() + ",值:" + event.getValue() + ",请求URL:" + request.getRequestURL());
        // 其他处理逻辑
        // ...
    }
 
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent event) {
        // 当替换ServletRequest中的属性时执行的操作
        HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
        System.out.println("属性已替换:名称:" + event.getName() + ",旧值:" + event.getValue() + ",新值:" + request.getAttribute(event.getName()) + ",请求URL:" + request.getRequestURL());
        // 其他处理逻辑
        // ...
    }
}
posted @ 2025-03-19 22:24  LuoboWang  阅读(6)  评论(0)    收藏  举报