springmvc--监听器Listener

本文详细解析了监听器的工作原理,包括如何监听三大域对象(request、session、servletContext)的状态变化,以及如何实现监听器类并进行web.xml配置。同时介绍了监听器在初始化工作、任务调度等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

概述 

监听器就是监听某个对象的状态变化的组件

监听三大域对象创建与销毁的监听器

监听器实现类代码

web.xml配置  注册监听器

监听三大域对象的属性变化

与session中绑定的对象相关的监听器(对象感知监听器)

钝化与活化监听器


概述 

监听器就是监听某个对象的状态变化的组件

  1. 监听的事件源 -->三个域对象 request  session servletContext
  2. 监听器监听事件源--> 事件源对象的属性变化都会出发监听器
  3. 注册监听器--> 将将监听器与事件源绑定起来
  4. 相应行为--> 监听到事件源状态变化时做出的功能代码
  • 监听器按照被监听的对象分为  三个域 request  session servletContext
  • 监听器按照被监听的内容分为 监听域对象的创建和销毁 监听域对象的属性的变化

监听三大域对象创建与销毁的监听器

servletContext域的创建与销毁监听器 ServletContextListener

  • Servlet的生命周期  服务启动时创建,服务关闭时销毁
  • 监听器的编写步骤 
  1.  编写一个监听器类去实现监听器接口
  2. 覆盖监听器的方法
  3. 需要在web.xml中配置-->注册
  • 监听器作用
  1. 初始化工作:初始化对象,初始化数据
  2. 加载一下初始化的配置文件 -- spring的配置文件
  3. 任务调度 定时器

项目结构:

监听器位置

web.xml位置

监听器实现类代码

package cn.bufanli.CreateContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * @author BuShuangLi
 * @date 2019/1/2
 * context域创建与销毁监听器
 */
public class MyServletContextListener implements ServletContextListener {
     /**
      * 监听context的创建方法
      * @param servletContextEvent 事件源相关对象
      */
     @Override
     public void contextInitialized(ServletContextEvent servletContextEvent) {
          //被监听的对象 -- ServletContext
          ServletContext servletContext = servletContextEvent.getServletContext();
          //被监听的对象 通用方法
          Object source = servletContextEvent.getSource();
          System.out.println("context创建了");
     }

     /**
      * 监听context销毁方法
      * @param servletContextEvent
      */
     @Override
     public void contextDestroyed(ServletContextEvent servletContextEvent) {
          System.out.println("context销毁了");

     }
}

web.xml配置  注册监听器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <!--注册监听器-->
    <listener>
        <listener-class>cn.bufanli.CreateContext.MyServletContextListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>cn.bufanli.ServletDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/servletDemo</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>ServletImages</servlet-name>
        <servlet-class>cn.bufanli.ServletImages</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletImages</servlet-name>
        <url-pattern>/servletImages</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>CheckServlet</servlet-name>
        <servlet-class>cn.bufanli.CheckServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CheckServlet</servlet-name>
        <url-pattern>/checkServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>DownloadServlet</servlet-name>
        <servlet-class>cn.bufanli.DownloadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DownloadServlet</servlet-name>
        <url-pattern>/downloadServlet</url-pattern>
    </servlet-mapping>
</web-app>

httpSession域的创建与销毁....套路是一个样子

监听三大域对象的属性变化

package cn.bufanli.attribute;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
 * @author BuShuangLi
 * @date 2019/1/2
 */
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
     /**
      * 监听添加的
      *
      * @param servletContextAttributeEvent
      */
     @Override
     public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
          //获得添加到Context域中的name
          String name = servletContextAttributeEvent.getName();
          //获得添加到Context域中的value
          Object value = servletContextAttributeEvent.getValue();
     }

     /**
      * 删除
      *
      * @param servletContextAttributeEvent
      */
     @Override
     public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
          //获得删除Context域中的name
          String name = servletContextAttributeEvent.getName();
          //获得删除Context域中的value
          Object value = servletContextAttributeEvent.getValue();
     }

     /**
      * 修改前的
      *
      * @param servletContextAttributeEvent
      */
     @Override
     public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
          //获得修改前Context域中的name
          String name = servletContextAttributeEvent.getName();
          //获得修改前Context域中的value
          Object value = servletContextAttributeEvent.getValue();
     }
}

web.xml 同上,需要配置

  <listener>
        <listener-class>cn.bufanli.CreateContext.MyServletContextAttributeListener </listener-class>
    </listener>

 

与session中绑定的对象相关的监听器(对象感知监听器)

即将要被session绑定的几种状态:

绑定状态: 对象被放到session域当中

解绑状态: 对象从session域中移除

钝化状态: 将session中的对象序列化到磁盘

活化状态: 将磁盘的对象再恢复到session 内存中

绑定和解绑的监听器(直接绑定到要监听的类当中而且不用在web.xml中配置)

package cn.bufanli.attribute;

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

/**
 * @author BuShuangLi
 * @date 2019/1/2
 * 注册到要即将绑定到session域中的类
 */
public class Person implements HttpSessionBindingListener {
     private String  userName;
     private String age;

     public String getUserName() {
          return userName;
     }

     public void setUserName(String userName) {
          this.userName = userName;
     }

     public String getAge() {
          return age;
     }

     public void setAge(String age) {
          this.age = age;
     }

     public Person(String userName, String age) {
          this.userName = userName;
          this.age = age;
     }

     /**
      * 感知对象被绑定到session域中
      * @param httpSessionBindingEvent
      */
     @Override
     public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {

     }

     /**
      * 感知对象从session域中解绑
      * @param httpSessionBindingEvent
      */
     @Override
     public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {

     }
}

钝化与活化监听器

钝化与活化的监听器HttpSessionActivationListener

可以通过配置文件 指定对象钝化时间 --- 对象多长时间不用被钝化

在META-INF下创建一个context.xml

<Context>
 <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
 <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下  配置钝化的对象文件在												work/catalina/localhost/钝化文件 -->
 <Manager className="org.apache.catalina.session.PersistentManager" 																				maxIdleSwap="1">
  <Store className="org.apache.catalina.session.FileStore" directory="ceshi" />
 </Manager>
</Context>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值