简介

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的创建、销毁事件以及监听这些域对象中的属性发生修改的事件。

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

相关概念

  事件源:即谁产生的事件
  事件对象:即产生了什么事件
  监听器:监听事件源的动作

监听对象

在Servlet规范中定义了多种类型的监听器(一共8个监听器),它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象。Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

1.域对象的生命周期监听:监听域对象自身的创建和销毁。这个监听器需要实现相应的监听器接口:ServletContextListener、HttpSessionListener、ServletRequestListener。

2.域对象的属性监听:监听域对象中属性的增加和删除。这个监听器需要实现的监听器接口为:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener。

3.感知监听(都与HttpSession域对象有关):

  绑定和解绑:监听绑定到HttpSession域中的某个JavaBean对象的状态的监听器以及解绑。这个监听器需要实现的监听器接口:HttpSessionBindingListener。

  钝化和活化:监听JaveBean对象随HttpSession序列化到硬盘上(正常关闭服务器,session会钝化到硬盘上)以及从硬盘反序列化到内存中。这个监听器需要实现的监听器接口:HttpSessionActiveationListener、Serializable。

示例:

域对象的生命周期监听

监听request的创建和销毁:

public class MyRequestListener implements ServletRequestListener {

    //创建
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("监听新的request对象被创建了...");
}
//销毁
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("监听request对象被销毁了...");
} }

监听session的创建和销毁:

public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent se)  {
// Event 事件: 通过事件对象可以获取被监听对象的引用
HttpSession session = se.getSession();
System.out.println(session.getId() + "对应的session被创建了**** **** ");
} public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session.getId() + "对应的session被销毁了**** **** ");
} }

监听context的创建和销毁:

public class MyServletContextListner implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce)  {
System.out.println("--------------------------- 监听到项目被创建了....");
} public void contextDestroyed(ServletContextEvent sce) {
System.out.println("*********************** 监听到项目被销毁了....");
} }

域对象属性变化监听

以request为例:

public class MyRequestAttrChangeListener implements ServletRequestAttributeListener {

    public void attributeAdded(ServletRequestAttributeEvent srae) {
// 属性 = 属性名 + 属性值
// 1 获取属性名
String name = srae.getName();
// 2 获取属性值:
// 2.1 获取事件源对象, 指request对象
ServletRequest request = srae.getServletRequest();
Object value = request.getAttribute(name); System.out.println("*****request 增加属性: " + name + " = " + value);
} public void attributeReplaced(ServletRequestAttributeEvent srae) {
// 1 获取属性名
String name = srae.getName();
// 2 获取属性值:
// 2.1 获取事件源对象, 指request对象
ServletRequest request = srae.getServletRequest();
Object newValue = request.getAttribute(name);
// 2.2 获取原来的值
Object oldValue = srae.getValue(); System.out.println("***** ***** *****request 修改属性 属性名: " + name);
System.out.println("***** ***** *****request 修改属性 新的属性值: " + newValue);
System.out.println("***** ***** *****request 修改属性 旧的属性值: " + oldValue);
} public void attributeRemoved(ServletRequestAttributeEvent srae) {
// 1 获取属性名
String name = srae.getName(); System.out.println("***** ***** *****request 删除属性 : " + name);
} }

感知监听

绑定和解绑:

public class User1 implements HttpSessionBindingListener {
private int id;
private String name;
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User1 [id=" + id + ", name=" + name + ", age=" + age + "]";
} @Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println(this + "感知自己被放到 session中------------------绑定");
} @Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(this + "感知自己从 session中移除 -----------------解绑");
} }

钝化和活化:

public class User2 implements HttpSessionActivationListener, Serializable {
private String nickname;
private String city; public String getNickname() {
return nickname;
} public void setNickname(String nickname) {
this.nickname = nickname;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Override
public String toString() {
return "User2 [nickname=" + nickname + ", city=" + city + "]";
} @Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(this + "随session活化到内存中 .........");
} @Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(this + "随session钝化到硬盘上..........");
} }

由于idea的运行机制问题(重启tomcat的话,会删除tomcat文件夹内的work文件夹再重新创建(同时也就删除了文件夹内的序列化到硬盘上的SESSIONS.SAR文件)),上面这个示例不能被活化到内存中。

java Web 监听器Listener详解的更多相关文章

  1. java web.xml配置详解(转)

    源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...

  2. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  3. java web之Filter详解

    java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...

  4. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  5. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  6. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  7. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  8. Servlet 监听器Listener详解

    转自:http://blog.csdn.net/u012228718/article/details/41730799 一.简介 (一)概述 1.Listener 用于监听 Javaweb程序中的事件 ...

  9. Java Web开发之详解JSP

    JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面.Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用, ...

随机推荐

  1. Arcgis for Js之GeometryService实现测量距离和面积

    距离和面积的测量时GIS常见的功能,在本节,讲述的是通过GeometryService实现测量面积和距离.先看看实现后的效果:                                  距离 ...

  2. [置顶] 个人博客上线!欢迎来访~ http://onlyloveyd.cn/

    简介 Hexo + Github + 个人域名 构建静态博客系统. 构建方法 参考 https://yq.aliyun.com/articles/64953 个人博客网站 Cherish Androi ...

  3. canvas 绘制环形进度条

    结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...

  4. I.MX6 recovery mode hacking

    /******************************************************************************** * I.MX6 recovery m ...

  5. sublime上配置markdown

    等等等等 简书一个不错的教程:Sublime Text3的Markdown配置 补充说明:第一步可以直接找 Tools-->install package control. ^.^ ...

  6. BZOJ - 5427:最长上升子序列 (二分&思维)

    现在给你一个长度为n的整数序列,其中有一些数已经模糊不清了,现在请你任意确定这些整数的值, 使得最长上升子序列最长.(为何最长呢?因为hxy向来对自己的rp很有信心)   Input 第一行一个正整数 ...

  7. 剑指offer-第六章面试中的各项能力(二叉树的深度)

    题目:1:输入一个二叉树,求二叉树的深度.从根节点开始最长的路径. 思路:我们可以考虑用递归,求最长的路径实际上就是求根节点的左右子树中较长的一个然后再加上1. 题目2:输入一颗二叉树的根节点,判断该 ...

  8. C# 用wps(api v9) 将word转成pdf

    我们不产生代码只是代码的搬运工 我们先来看一段跑不起来的代码  ..各种未将对象应用到实例.. using System; using System.Collections.Generic; usin ...

  9. 笔记:开源协议 Apache 2 和 GPL 兼容

    笔记:开源协议 Apache 2 和 GPL 兼容 Apache 2 和 GPL v3 兼容. GPL 分了很多版本,LGPL 为最宽松的 GPL,而 AGPL 为最严格的 GPL 协议. Linux ...

  10. zabbix 执行自定义key脚本超时

    报错如下: [root@master scripts]# /usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k web.site.code[www.baid ...