06-监听器

nobility 发布于 2021-09-14 197 次阅读


监听器

服务器通过我们的监听器类监听ServletContextHttpSessionServletRequest对象的变化,也就是JSP中的applicationsessionrequest内置对象的变化,若这些对象创建、销毁、自定义属性发生变化,服务器就会自动调用监听器类对应的方法

对多个同类型的监听器由web.xml中注册的顺序决定

常见的过滤器使用场景有:

  • 统计在线人数
  • 统计页面访问次数
  • 应用启动时完成信息初始化工作

ServletContext对象监听器

  • 实现ServletContextListener接口,重写contextInitialized()contextDestroyed()方法,这两个方法本分别监听了ServletContext对象的创建与销毁,这两个方法都是默认方法,可选择性实现
  • 实现ServletContextAttributeListenerListener,重写attributeAdded()attributeReplaced()attributeRemoved方法,这三个方法监听ServletContext对象上的自定义属性的添加替换和删除,这三个方法都是默认方法,可选择性实现
package com;

import javax.servlet.*;
import javax.servlet.annotation.WebListener;

//@WebListener()	//同样Listener也提供了注解的方式配置
public class MyServletContextListener implements ServletContextListener, ServletContextAttributeListener {
  @Override
  public void contextInitialized(ServletContextEvent sce) {
    ServletContext servletContext = sce.getServletContext();
    //通过ServletContextEvent事件对象获取全局ServletContext对象,之后可执行相应的操作
    System.out.println("MyServletContextListener 监听到servletContext初始化");
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    ServletContext servletContext = sce.getServletContext();
    //通过ServletContextEvent事件对象获取全局ServletContext对象,之后可执行相应的操作
    System.out.println("MyServletContextListener 监听到servletContext销毁");
  }

  @Override
  public void attributeAdded(ServletContextAttributeEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值
    System.out.println("MyServletContextListener 监听到servletContext添加了自定义属性");
  }

  @Override
  public void attributeReplaced(ServletContextAttributeEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值
    System.out.println("MyServletContextListener 监听到servletContext修改了自定义属性");
  }

  @Override
  public void attributeRemoved(ServletContextAttributeEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值
    System.out.println("MyServletContextListener 监听到servletContext删除了自定义属性");
  }
}

web.xml中的配置

<listener>
  <listener-class>com.MyServletContextListener</listener-class>	<!--只需要配置监听器的全类名即可-->
</listener>

HttpSession对象监听器

  • 实现HttpSessionListener接口,重写sessionCreated()sessionDestroyed()方法,这两个方法本分别监听了Session对象的创建与销毁,这两个方法都是默认方法,可选择性实现
  • 实现HttpSessionAttributeListener,重写attributeAdded()attributeReplaced()attributeRemoved方法,这三个方法监听ServletContext对象上的自定义属性的添加替换和删除,这三个方法都是默认方法,可选择性实现
package com;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;

@WebListener()
public class MyHttpSessionListener implements HttpSessionListener, HttpSessionAttributeListener {
  @Override
  public void sessionCreated(HttpSessionEvent se) {
    HttpSession session = se.getSession();
    //通过HttpSessionEvent事件对象获取刚创建的Session对象,之后可执行相应的操作
    System.out.println("MyHttpSessionListener 监听到一个Session对象被创建");
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    //通过HttpSessionEvent事件对象获取刚销毁的Session对象,之后可执行相应的操作
    System.out.println("MyHttpSessionListener 监听到一个Session对象被销毁");
  }

  @Override
  public void attributeAdded(HttpSessionBindingEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    HttpSession session = scae.getSession();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值,以及该session对象
    System.out.println("MyHttpSessionListener 监听到Session对象添加了自定义属性");
  }

  @Override
  public void attributeReplaced(HttpSessionBindingEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    HttpSession session = scae.getSession();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值,以及该session对象
    System.out.println("MyHttpSessionListener 监听到Session对象修改了自定义属性");
  }

  @Override
  public void attributeRemoved(HttpSessionBindingEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    HttpSession session = scae.getSession();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值,以及该session对象
    System.out.println("MyHttpSessionListener 监听到Session对象删除了自定义属性");
  }
}

web.xml中的配置

<session-config>
  <session-timeout>1</session-timeout><!--设置session失效时间,单位分钟-->
</session-config>

ServletRequest对象监听器

  • 实现ServletRequestListener接口,重写requestInitialized()requestDestroyed()方法,这两个方法本分别监听了request对象的创建与销毁,这两个方法都是默认方法,可选择性实现
  • 实现ServletRequestAttributeListener,重写attributeAdded()attributeReplaced()attributeRemoved方法,这三个方法监听ServletContext对象上的自定义属性的添加替换和删除,这三个方法都是默认方法,可选择性实现
package com;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

@WebListener()
public class MyServletRequestListener implements ServletRequestListener, ServletRequestAttributeListener {
  @Override
  public void requestInitialized(ServletRequestEvent sre) {
    HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
    //通过ServletRequestEvent事件对象获取刚创建的请求对象,向下转型为HttpServletRequest对象之后方便可执行相应的操作
    System.out.println("MyServletRequestListener 监听到请求对象被创建");
  }

  @Override
  public void requestDestroyed(ServletRequestEvent sre) {
    HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
    //通过ServletRequestEvent事件对象获取刚创建的请求对象,向下转型为HttpServletRequest对象之后方便可执行相应的操作
    System.out.println("MyServletRequestListener 监听到请求对象被销毁");
  }

  @Override
  public void attributeAdded(ServletRequestAttributeEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值
    System.out.println("MyServletRequestListener 监听到请求对象添加了自定义属性");
  }

  @Override
  public void attributeReplaced(ServletRequestAttributeEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值
    System.out.println("MyServletRequestListener 监听到请求对象修改了自定义属性");
  }

  @Override
  public void attributeRemoved(ServletRequestAttributeEvent scae) {
    String name = scae.getName();
    Object value = scae.getValue();
    //通过ServletContextAttributeEvent事件对象获取该变化的属性和值
    System.out.println("MyServletRequestListener 监听到请求对象删除了自定义属性");
  }
}

HttpSessionBindingListener对象绑定解绑监听器

Javabean类实现ServletRequestListener接口,重写valueBound()valueUnbound()方法,这两个方法本分别监听了该Javabean对象与session对象绑定或解绑,这两个方法都是默认方法,可选择性实现,该监听器无需注册

package com;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class User implements HttpSessionBindingListener {
  //属性、getter和setter都省略
  @Override
  public void valueBound(HttpSessionBindingEvent event) {
    String name = event.getName();
    Object value = event.getValue();
    HttpSession session = event.getSession();
    //通过HttpSessionBindingEvent事件对象获取绑定的该JavaBean
    System.out.println("User对象绑定到Session对象");
  }

  @Override
  public void valueUnbound(HttpSessionBindingEvent event) {
    String name = event.getName();
    Object value = event.getValue();
    HttpSession session = event.getSession();
    //通过HttpSessionBindingEvent事件对象获取解绑的该JavaBean
    System.out.println("User对象与Session对象解绑");
  }
}

此作者没有提供个人介绍
最后更新于 2021-09-14