Servlet Listener(监听器)
监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java 对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即自动执行。
监听器的相关概念:
- 事件:方法调用、属性改变、状态改变等。
- 事件源:被监听的对象( 例如:request、session、servletContext)。
- 监听器:用于监听事件源对象 ,事件源对象状态的变化都会触发监听器。
- 注册监听器:将监听器与事件源进行绑定。
监听器的分类
Servlet 规范中定义了 8 个监听器接口,可以用于监听 ServletContext、HttpSession 和 ServletRequest 对象的生命周期和属性变化事件。开发 Servlet 监听器需要实现相应的监听器接口并重写接口中的方法。
监听器 Listener 按照监听的事件划分,可以分为 3 类:
- 监听对象创建和销毁的监听器
- 监听对象中属性变更的监听器
- 监听 HttpSession 中的对象状态改变的监听器
监听对象创建和销毁的监听器
Servlet 规范定义了监听 ServletContext、HttpSession、HttpServletRequest 这三个对象创建和销毁事件的监听器,如下表所示。
事件源 | 监听器 | 监听器描述 | 创建和销毁方法 | 调用时机 |
---|---|---|---|---|
ServletContext | ServletContextListener | 用于监听 ServletContext 对象的创建与销毁过程 | void contextInitialized (ServletContextEvent sce) | 当创建 ServletContext 对象时 |
void contextDestroyed (ServletContextEvent sce) | 当销毁 ServletContext 对象时 | |||
HttpSession | HttpSessionListener | 用于监听 HttpSession 对象的创建和销毁过程 | void sessionCreated (HttpSessionEvent se) | 当创建 HttpSession 对象时 |
void sessionDestroyed (HttpSessionEvent se) | 当销毁 HttpSession 对象时 | |||
ServletRequest | ServletRequestListener | 用于监听 ServletRequest 对象的创建和销毁过程 | void requestInitialized (ServletRequestEvent sre) | 当创建 ServletRequest 对象时 |
void requestDestroyed (ServletRequestEvent sre) | 当销毁 ServletRequest 对象时 |
监听属性变更的监听器
Servlet 规范定义了监听 ServletContext、HttpSession、HttpServletRequest 这三个对象中的属性变更事件的监听器,这三个监听器接口分别是 ServletContextAttributeListener、HttpSessionAttributeListener 和 ServletRequestAttributeListener。这三个接口中都定义了三个方法,用来处理被监听对象中属性的增加,删除和替换事件。同一种事件在这三个接口中对应的方法名称完全相同,只是参数类型不同,如下表所示。
事件源 | 监听器 | 监听器描述 | 方法 | 调用时机 |
---|---|---|---|---|
ServletContext | ServletContextAttributeListener | 用于监听 ServletContext 对象的属性新增、移除和替换 | public void attributeAdded (ServletContextAttributeEvent scae) | 当 ServletContext 对象中新增一个属性时 |
public void attributeRemoved (ServletContextAttributeEvent scae) | 当删除 ServletContext 对象中的一个属性时 | |||
public void attributeReplaced (ServletContextAttributeEvent scae) | 当 ServletContext 对象中的某个属性被替换时 | |||
HttpSession | HttpSessionAttributeListener | 用于监听 HttpSession 对象的属性新增、移除和替换 | public void attributeAdded (HttpSessionBindingEvent hsbe) | 当 HttpSession 对象中新增一个属性时 |
public void attributeRemoved (HttpSessionBindingEvent hsbe) | 当删除 HttpSession 对象中的一个属性时 | |||
public void attributeReplaced (HttpSessionBindingEvent hsbe) | 当 HttpSession 对象中的某个属性被替换时 | |||
HttpServletRequest | ServletRequestAttributeListener | 用于监听 HttpServletRequest 对象的属性新增、移除和替换 | public void attributeAdded (ServletRequestAttributeEvent srae) | 当 HttpServletRequest 对象中新增一个属性时 |
public void attributeRemoved (ServletRequestAttributeEvent srae) | 当删除 HttpServletRequest 对象中的一个属性时 | |||
public void attributeReplaced (ServletRequestAttributeEvent srae) | 当 HttpServletRequest 对象中的某个属性被替换时 |
监听 Session 中对象状态改变的监听器
Session 中的对象可以有多种状态:绑定到 Session 中、从 Session 中解除绑定、随 Session 对象持久化到存储设备中(钝化)、随 Session 对象从存储设备中恢复(活化)。
Servlet 规范中定义了两个特殊的监听器接口,用来帮助对象了解自己在 Session 中的状态:HttpSessionBindingListener 接口和 HttpSessionActivationListener 接口 ,实现这两个接口的类不需要进行注册。
事件源 | 监听器 | 监听器描述 | 方法 | 调用时机 |
---|---|---|---|---|
HttpSession | HttpSessionBindingListener | 用于监听 JavaBean 对象绑定到 HttpSession 对象和从 HttpSession 对象解绑的事件 | void valueBound (HttpSessionBindingEvent event) | 当对象被绑定(添加)到 HttpSession 对象中时 |
void valueUnbound (HttpSessionBindingEvent event) | 当对象从 HttpSession 对象中解除绑定(移除)时 | |||
HttpSessionActivationListener | 用于监听 HttpSession 中对象活化和钝化的过程 | void sessionWillPassivate (HttpSessionBindingEvent event) | 当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前 | |
void sessionDidActive (HttpSessionBindingEvent event) | 当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后 |
注册监听器
注册 Servlet 监听器有 2 种方式,分别是:
- 在 web.xml 中注册监听器;
- 使用 @WebListener 注册监听器。
1. 在 web.xml 中注册监听器
在 web.xml 中使用 <listener> 标签配置监听器,Web 容器会自动把监听器注册到事件源中,示例代码如下。
<?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">
<listener>
<listener-class>net.biancheng.www.listener.MySessionListener</listener-class>
</listener>
</web-app>
2. 使用 @WebListener 注解注册监听器
在监听器类上使用 @WebListener 注解,可以将该 Java 类注册为一个监听器类。示例代码如下。
package net.biancheng.www.servlet;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 监听器实例代码
*
* @author 编程帮 www.biancheng.net
*/
@WebListener
public class MyListener implements ServletContextListener {
public MyListener() {
}
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
}
}
使用 HttpSessionBindingListener 和 HttpSessionActivationListener 时,不必进行注册,直接创建 Java 类实现这两个接口即可。
Servlet Listener(监听器)的更多相关文章
- Servlet之监听器(Listener)
一.监听器(Listener)概述 1.概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Se ...
- 【Servlet】Java Serlvet Listener 监听器
Listener监听器 Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理 容器产生的事件分类 - 生命周期相关的事件 - 设置和删除Attribute数据 ...
- Servlet的监听器Listener
Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是 随web应用的启动而启动,只初始化一次,随web ...
- Servlet之Listener监听器
Servlet2.5规范共有8中Listener接口,6种Event类型 ServletContextListener接口 [接口方法] contextInitialized()与 contextDe ...
- [Java] JSP笔记 - Listener 监听器
Java Web 开发时,可以使用 Listener 来监听来监听一些事件,从而实现一些功能.实际上这个监听器,原理就是 Delphi 中大家常用的各种事件. 1. 那么,监听器的主要用途用哪些呢: ...
- listener监听器
前言:之前写了一篇关于Filter的文章:http://tianweili.github.io/blog/2015/01/26/java-filter/,现在再来一篇Listener的,Filter和 ...
- spring listener监听器
1.Listener的定义与作用 监听器Listener就是在application,session,request三个对象创建.销毁或者往其中添加修改删除属性时自动执行代码的功能组件. Listen ...
- j2ee servlet listener
JSP/Servlet 中的事件处理写过AWT或Swing程序的人一定对桌面程序的事件处理机制印象深刻:通过实现Listener接口的类可以在特定事件(Event)发生时,呼叫特定的方法来对事件进行响 ...
- Listener 监听器
Listener的定义与作用 监听器Listener就是在application,session,request三个对象创建.销毁或者往其中添加修改删除属性时自动执行代码的功能组件. Listener ...
- Servlet, Listener 、 Filter.
Java Web的三大组件:Servlet, Listener . Filter. 使用Listener监听器:八大监听器: 第一组:用于监听Servlet三个域对象的创建与销毁 1. Servlet ...
随机推荐
- 使用docker logs -f 打印日志中文无法正常显示
打印docker日志的时候 中文无法显示 显示了问号 在Dockerfile加入 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US ...
- 基于DNN的残余回声抑制
摘要 由于功率放大器或扬声器的限制,即使在回声路径完全线性的情况下,麦克风捕获的回声信号与远端信号也不是线性关系.线性回声消除器无法成功地消除回声的非线性分量.RES是在AES后对剩余回声进行抑制的一 ...
- 【LeetCode】968. Binary Tree Cameras 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】497. Random Point in Non-overlapping Rectangles 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/random-p ...
- 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...
- 【LeetCode】896. Monotonic Array 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Codeforces 567C:Geometric Progression(DP)
time limit per test : 1 second memory limit per test : 256 megabytes input : standard input output : ...
- 洛谷1052——过河(DP+状态压缩)
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- Oracle 11g安装和PL/SQL连接完全解读(连接本地数据库)
Oracle安装是很多新手都烦恼的事情,各种奇怪的错误,并且还无从下手解决.我也隔了两年没有用Oracle了,昨天安装了一下,出现很多问题,也很苦恼.现在将安装过程详细记录下来,一来方便自己下次安装, ...
- Android开发 ListView(垂直滚动列表项视图)的简单使用
效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...