Appearance
监听器
案例目标
- 利用监听器技术,实现项目加载与卸载时分别打印出当前时间
- 利用监听器技术,监听上下文域的属性增加、删除、修改,并将修改前与修改后的值分别打印到控制台
监听器概述
监听器作用
事件源【重点】
- 请求域
- 会话域
- 上下文域
事件【重点】
- 创建和销毁的事件
- 作用域中的值发生变化的事件
回顾:三种作用域的创建与销毁时机
作用域 | 接口名 | 作用范围 | 生命周期 |
---|---|---|---|
请求域 | 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概要
- 事件源
请求域
会话域
上下文域
- 事件
生命周期事件
域属性增删改
- 与 ServletContext 相关的两个监听器
ServletContextListener
ServletContextAttributeListener
八大监听器【了解】
三个事件源
- request
- session
- application
两个事件
属性增删改
生命周期
Servlet context events
Lifecycle【掌握】
上下文域创建和销毁
texjavax.servlet.ServletContextListener
Changes to attributes【掌握】
上下文域属性增删改的操作
texjavax.servlet.ServletContextAttributeListener
HTTP session events
Lifecycle
会话域创建和销毁
texjavax.servlet.http.HttpSessionListener
Changes to attributes
会话域属性增删改的操作
texjavax.servlet.http.HttpSessionAttributeListener
Session migration【了解】
texjavax.servlet.http.HttpSessionActivationListener
tex钝化: 使对象随Session存储到硬盘中 活化:使对象随Session活化到内存中
Object binding【了解】
texjavax.servlet.http.HttpSessionBindingListener
tex使对象感知自己被放到session中,称为绑定setAttribute("user", new User()) 使对象感知自己从session中移除,称为解绑removeAttribute("user")
Servlet request events
Lifecycle
请求域创建和销毁
texjavax.servlet.ServletRequestListener
Changes to attributes
请求域属性增删改的操作
texjavax.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 |
Filter | 1. 对HTTP请求及响应进行拦截 2. 对HTTP请求及响应进行放行 3. 对HTTP请求及响应进行增强 | javax.servlet.Filter |
Listener | 对作用域监听: 事件源: - 请求域 - 会话域 - 上下文域 事件: - 属性增删改 - 生命周期 额外: - 钝化活化监听器 - 绑定解绑监听器 | javax.servlet.XxxListener |
学习目标总结
- 能够说出 Web 中的监听器