Skip to content

监听器

案例目标

  • 利用监听器技术,实现项目加载与卸载时分别打印出当前时间
  • 利用监听器技术,监听上下文域的属性增加、删除、修改,并将修改前与修改后的值分别打印到控制台

监听器概述

Listener-Summary-Sample


Listener-Summary

监听器作用

事件源【重点】

  • 请求域
  • 会话域
  • 上下文域

事件【重点】

  • 创建和销毁的事件
  • 作用域中的值发生变化的事件

回顾:三种作用域的创建与销毁时机

作用域接口名作用范围生命周期
请求域HttpServletRequest一个用户的一次请求服务器接收到浏览器的请求时创建
响应结束时销毁
会话域HttpSession一个用户的所有请求用户第一次请求时创建
会话超时时销毁
上下文域ServletContext所有用户的所有请求项目加载时创建
项目卸载时销毁

事件源

  • 请求域
  • 会话域
  • 上下文域

事件

  • 生命周期事件
  • 属性增删改

监听器快速入门

步骤

  • 新建普通的 Java 类,实现特定的 Listener 接口,重写接口方法
  • 配置 Listener
    • 类路径

实现

java
package com.futureweaver.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 1. 新建普通的Java类,实现特定的Listener接口,实现接口方法
 * 2. 配置Listener
 *  1. 配置类路径
 */
public class HelloListener implements ServletContextListener {
    // 上下文域初始化的监听器
    // 当上下文域(ServletContext)初始化时,进入此方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("上下文域被创建了!" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    // 当ServletContext被销毁时,进入此方法
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("上下文域被销毁了!" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}
java
package com.futureweaver.listener;

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

/**
 * 1. 创建普通的Java类,实现特定的Listener接口,重写接口方法
 * 2. 配置Listener
 *  1. 配置Listner的类路径
 *
 *  这一个Listener编写的是监听ServletContext域对象值的变化
 */
public class Listener2 implements ServletContextAttributeListener {
    // 一个域对象被添加了
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("一个域对象被添加了,名字: " + event.getName() + ", 值: " + event.getValue());
    }

    // 一个域对象被删除了
    // event.getValue(),获取到的是一个旧的值
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("一个域对象被删除了,名字: " + event.getName() + ", 值: " + event.getValue());
    }

    // 一个域对象被替换了
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {

        // 因为replaced,是过去式
        // 所以意味着进入到这一个方法时,这个域对象已经被修改完成了
        // 所以想办法先获取servletContext,然后把name再传进getAttribute里面,那么得到的返回值,就是新的了
        ServletContext servletContext = event.getServletContext();
        Object newValue = servletContext.getAttribute(event.getName());

        System.out.println("一个域对象被替换了,名字: " + event.getName() + ", 旧值: " + event.getValue() + ", 新值: " + newValue);
    }
}

相关API概要

Listener-Class-Hierachy

  • 事件源

请求域

会话域

上下文域

  • 事件

生命周期事件

域属性增删改

  • 与 ServletContext 相关的两个监听器

ServletContextListener

ServletContextAttributeListener

八大监听器【了解】

三个事件源

  • request
  • session
  • application

两个事件

  • 属性增删改

  • 生命周期

  • Servlet context events

    • Lifecycle【掌握】

      上下文域创建和销毁

      tex
      javax.servlet.ServletContextListener
    • Changes to attributes【掌握】

      上下文域属性增删改的操作

      tex
      javax.servlet.ServletContextAttributeListener
  • HTTP session events

    • Lifecycle

      会话域创建和销毁

      tex
      javax.servlet.http.HttpSessionListener
    • Changes to attributes

      会话域属性增删改的操作

      tex
      javax.servlet.http.HttpSessionAttributeListener
    • Session migration【了解】

      tex
      javax.servlet.http.HttpSessionActivationListener
      tex
      钝化: 使对象随Session存储到硬盘中
      活化:使对象随Session活化到内存中
    • Object binding【了解】

      tex
      javax.servlet.http.HttpSessionBindingListener
      tex
      使对象感知自己被放到session中,称为绑定setAttribute("user", new User())
      使对象感知自己从session中移除,称为解绑removeAttribute("user")
  • Servlet request events

    • Lifecycle

      请求域创建和销毁

      tex
      javax.servlet.ServletRequestListener
    • Changes to attributes

      请求域属性增删改的操作

      tex
      javax.servlet.ServletRequestAttributeListener

web.xml

xml
<listener>
    <listener-class>com.futureweaver.listener.MyRequestListener</listener-class>
</listener>

案例

  • 利用监听器技术,实现项目加载与卸载时分别打印出当前时间
  • 利用监听器技术,监听上下文域的属性增加、删除、修改,并将修改前与修改后的值分别打印到控制台

JavaWeb 的三种组件【了解】

组件作用实现接口
Servlet是一个Java类,运行在Web容器中
Servlet的作用:
1. 接收数据
2. 处理数据
3. 响应数据
javax.servlet.Servlet
Filter1. 对HTTP请求及响应进行拦截
2. 对HTTP请求及响应进行放行
3. 对HTTP请求及响应进行增强
javax.servlet.Filter
Listener对作用域监听:
事件源:
- 请求域
- 会话域
- 上下文域
事件:
- 属性增删改
- 生命周期
额外:
- 钝化活化监听器
- 绑定解绑监听器
javax.servlet.XxxListener

学习目标总结

  • 能够说出 Web 中的监听器