概念

监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的

发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用

监听器对象中的方法。

常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等。

创建步骤

  1. 创建类
  2. 实现指定的监听器接口中的方法
  3. 在web.xml文件中配置监听/在类上标注@WebListener 注解

第一类:域对象监听器

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

监听器接口 描述
ServletContextListener 监听Servlet上下文对象的创建、销毁
HttpSessionListener 监听会话对象的创建、销毁
ServletRequestListener 监听请求对象的创建、销毁

Servlet上下文对象 创建和销毁的监听器

public class ApplicationListener implements ServletContextListener { //Servlet上下文对象创建的时候被调用@Overridepublic void contextInitialized(ServletContextEvent contextEvent) {System.out.println("Servlet上下文对象被创建啦...");//项目一旦启动,此处代码运行!Timer timer=new Timer();//5秒钟之后开始执行,以后每间隔2秒发送一封邮件!timer.schedule(new TimerTask() {@Overridepublic void run() {//System.out.println("发邮件...."+new Date());}}, 5000, 2000);}//Servlet上下文对象销毁的时候被调用@Overridepublic void contextDestroyed(ServletContextEvent contextEvent) {System.out.println("Servlet上下文对象被销毁啦...");//服务器在停止的时候,要执行某些动作,那么就可以把代码写在这个位置!!!   }
}
<!-- web.xml中配置 -->
<listener><listener-class>com.dream.listener.ApplicationListener</listener-class>
</listener>

会话对象 创建和销毁的监听器

@WebListener
public class SessionListener implements HttpSessionListener{@Overridepublic void sessionCreated(HttpSessionEvent event) {HttpSession session = event.getSession();System.out.println("session对象创建啦...."+session.getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent event) {HttpSession session = event.getSession();System.out.println("session对象销毁啦...."+session.getId());}
}

请求对象的创建和销毁的监听器

@WebListener
public class RequestListener implements ServletRequestListener{@Overridepublic void requestInitialized(ServletRequestEvent event) {ServletRequest request = event.getServletRequest();System.out.println("Request对象的创建...."+request);}@Overridepublic void requestDestroyed(ServletRequestEvent event) {ServletRequest request = event.getServletRequest();System.out.println("Request对象的销毁...."+request);}}

案例:统计网站在线人数

@WebListener
public class ApplicationListener implements ServletContextListener{@Overridepublic void contextInitialized(ServletContextEvent event) {//项目启动,向application对象中存一个变量,初始值0ServletContext application = event.getServletContext();  application.setAttribute("count", 0);}@Overridepublic void contextDestroyed(ServletContextEvent event) {}
}@WebListener
public class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent event) {// 有人访问了 count++HttpSession session = event.getSession();ServletContext application = session.getServletContext();int count =(Integer) application.getAttribute("count");count++;application.setAttribute("count", count);}@Overridepublic void sessionDestroyed(HttpSessionEvent event) {// 有人离开了 count--HttpSession session = event.getSession();ServletContext application = session.getServletContext();Integer count =(Integer) application.getAttribute("count");count--;application.setAttribute("count", count);}
}

第二类:属性监听器

监听域对象属性变化的监听器

监听器接口 描述
ServletContextAttributeListener 监听Servlet上下文对象属性的创建、删除、替换
HttpSessionAttributeListener 监听会话对象属性的创建、删除、替换
ServletRequestAttributeListener 监听请求对象属性的创建、删除、替换

Servlet上下文对象属性变化的监听器

@WebListener
public class ApplicationAttributeListener implements ServletContextAttributeListener{//Servlet上下文对象新增值的时候被调用@Overridepublic void attributeAdded(ServletContextAttributeEvent event) {String str = "Servlet上下文对象中添加了属性:"+event.getName()+",属性值是:"+event.getValue();System.out.println(str);}//Servlet上下文对象删除值的时候被调用@Overridepublic void attributeRemoved(ServletContextAttributeEvent event) {String str = "Servlet上下文对象中删除了属性:"+event.getName()+",属性值是:"+event.getValue();System.out.println(str);}//Servlet上下文对象替换值的时候被调用@Overridepublic void attributeReplaced(ServletContextAttributeEvent event) {String str = "Servlet上下文对象中替换了属性:"+event.getName()+",属性值是:"+event.getValue();System.out.println(str);}
}

第三类:监听HttpSession中的对象(JavaBean)

前两类监听器是作用在 ServletContext HttpSession ServletRequest上

第三类监听器是作用在JavaBean上的。

注意:这类监听器不需要在web.xml中配置

监听器接口 描述
HttpSessionBindingListener 监听会话对象中JavaBean对象的绑定、删除
HttpSessionActivationListener 监听会话对象中JavaBean对象的钝化、活化

会话对象中JavaBean对象的绑定和删除的监听器

实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件

  • 当对象被绑定到HttpSession对象中时,web服务器调用该对象的

void valueBound(HttpSessionBindingEvent event)方法

  • 当对象从HttpSession对象中解除绑定时,web服务器调用该对象的

void valueUnbound(HttpSessionBindingEvent event)方法

public class User implements HttpSessionBindingListener {private int id;private String name;public User() {}public User(int id, String name) {this.id = id;this.name = name;}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 void valueBound(HttpSessionBindingEvent event) {System.out.println("对象绑定到了Session中");}public void valueUnbound(HttpSessionBindingEvent event) {System.out.println("对象从Session中移除");}
}
<%@ page import="com.dream.vo.User"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>ServletContextAttributeListener监听器测试</title>
</head>
<body><%User user = new User(1, "aaa");session.setAttribute("user", user);session.removeAttribute("user");%>
</body>
</html>

会话对象中JavaBean对象的钝化和活化的监听器

实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件

钝化(序列化):在内存中JavaBean对象通过Session存储硬盘的过程

活化(反序列化):从硬盘中通过Session取出JavaBean对象到内存的过程

  • javabean对象将要随Session对象被钝化(序列化)之前,web服务器调用该对象的

void sessionWillPassivate(HttpSessionEvent event) 方法

这样javabean对象就可以知道自己将要和Session对象一起被钝化到硬盘中

  • javabean对象将要随Session对象被活化(反序列化)之后,web服务器调用该对象的void sessionDidActive(HttpSessionEvent event)方法

这样javabean对象就可以知道自己将要和Session对象一起被活化回到内存中

注意: 想要随着Session 被钝化、活化的对象它的类必须实现Serializable 接口,放在

Session中没有实现Serilizable接口的对象,在Session钝化时,不会被序列化到磁盘上。

public class User implements Serializable, HttpSessionActivationListener{private static final long serialVersionUID = -1566395353697458460L;private int id;private String name;public User() {}public User(int id, String name) {this.id = id;this.name = name;}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;}//钝化@Overridepublic void sessionWillPassivate(HttpSessionEvent event) {System.out.println("对象被钝化......." + event.getSource());}//活化@Overridepublic void sessionDidActivate(HttpSessionEvent event) {System.out.println("对象被活化......");}
}

在WebContent\META-INF文件夹下创建一个context.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Context><!-- maxIdleSwap:"1": session如果1分钟没有使用就序列化directory: 序列化后文件所保存的路径 --><Manager className="org.apache.catalina.session.PersistentManager"maxIdleSwap="1"><Store className="org.apache.catalina.session.FileStore"        directory="C:\\text" /></Manager>
</Context>

面试题:Session 的钝化与活化

  • 钝化:当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务

器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫

做Session 的钝化。

  • 活化:当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢

复之前保存起来的Session 对象,这个过程叫做Session的活化。

  • 注意事项
  1. 想要随着Session 被钝化、活化的对象它的类必须实现Serializable 接口,还有的是只有在服务器正常关闭的条件下,还未超时的Session 才会被钝化成文件。当Session 超时、调用invalidate方法或者服务器在非正常情况下关闭时,Session 都不会被钝化,因此也就不存在活化。
  2. 在被钝化成“SESSIONS.ser” 文件时,不会因为超过Session 过期时间而消失,这个文件会一直存在,等到下一次服务器开启时消失。
  3. 当多个Session 被钝化时,这些被钝化的Session 都被保存在一个文件中,并不会为每个Session 都建立一个文件。

JavaWeb 之 Listener监听器及Session的钝化与活化相关推荐

  1. javaweb(11) Listener监听器与Filter过滤器

    javaweb(11) Listener监听器与Filter过滤器 Listener监听器 什么是Listener监听器 Listener 监听器它是 JavaWeb 的三大组件之一.JavaWeb ...

  2. 对于session序列化跟session的钝化与活化的粗浅理解

    1. API对序列化的解释:类通过实现 java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化.可序列化类的所有子类型本身都是可序列化的. ...

  3. Session 的钝化与活化

    (一)钝化 当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件("SESSIONS.ser")的形式存储在tomcat 的work 目 ...

  4. session的钝化和活化

    钝化:内存->硬盘 活化:硬盘->内存 session对象的四种状态: 1.session.setAttribute("a",xxx),将对象a绑定到session中 ...

  5. JavaWeb-WEB核心7 会话技术 理解什么是会话跟踪技术掌握Cookie的使用掌握Session的使用(钝化、活化)完善用户登录注册案例的功能

    会话技术 今日目标 理解什么是会话跟踪技术 掌握Cookie的使用 掌握Session的使用 完善用户登录注册案例的功能 1,会话跟踪技术的概述 对于会话跟踪这四个词,我们需要拆开来进行解释,首先要理 ...

  6. 06CookieSession-12. HttpSession的钝化和活化

    (一)钝化 当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件("SESSIONS.ser")的形式存储在tomcat 的work 目 ...

  7. Javaweb Listener监听器的简单应用:统计网站在线人数

    Listener监听器实现统计网站在线人数 开发环境: IntelliJ IDEA 一.什么是监听器 是指专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时, ...

  8. Listener监听器与Filter过滤器

    1.Listener     [1]监听器简介         > Listener是JavaWeb的三大组件之一,Servlet.Filter.Listener         > Li ...

  9. JavaWeb学习-Listener

    Listener 概念:Listener表示监听器,是JavaWeb三大组件(Servlet.Filter.Listener)之一. 监听器可以监听就是在application,session,req ...

  10. Listener监听器

    1.Listener监听器概述和分类 概念:Listener表示监听器,是JavaWeb三大组件(Servlet.Filter.Listener)之一 监听器可以监听在application,sess ...

最新文章

  1. qpython3l手机版安装第三方库总是报错_python编码问题在此终结
  2. JavaScript变量——栈内存or堆内存
  3. 用C++的类重载高精度加法,乘法和等于符号
  4. 【SPFA】桐人的约会
  5. 《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv
  6. 语句拼接_第2课:一个周末学会R语言数据处理:表拆分和拼接
  7. mysql差异备份数据库get shell_shell进行完整和增量备份mysql数据库
  8. [Java] Maven 建立 Spring MVC 工程
  9. bootstrap table导出功能无效报错Uncaught INVALID_CHARACTER_ERR: DOM Exception 5和导出中文乱码问题...
  10. OpenCV 利用MFC的Picture控件显示和处理图像
  11. 如何使用计算机对文件修改密码,文件夹怎么设置密码?怎么给文件夹设置密码?...
  12. 计算机cmd测试命令,[cmd测试网速]cmd指令测试网速技巧
  13. VUE | key的内部原理、Vue监测数据的原理、Vue.set()和vm.$set()的使用
  14. 面向智能网联汽车边缘网络的分布式端-边协同算法
  15. Linux Terminal终端常用快捷键
  16. 如何快速查看IP地址和MAC地址
  17. 舔砖加瓦(java)之多线程
  18. java将字节转十六进制,Java代码将字节转换为十六进制
  19. mysql 围栏_一个电子围栏需求的脚本记录
  20. 线性代数-思维导图(1)

热门文章

  1. 正好配资点评北交所成立,新基建起爆
  2. [exgcd] Jzoj P5855 吃蛋糕
  3. 使用linux时电脑突然蓝屏,win7系统电脑突然蓝屏的原因的原因和解决方法介绍
  4. 用MySQL后电脑频繁蓝屏_电脑容易蓝屏怎么办_电脑突然开始频繁蓝屏修复方法-win7之家...
  5. [cf] Deltix Round, Autumn 2021 A. Divide and Multiply
  6. 计算机主机usb插口松,台式电脑音频接口坏了or接触不良?用这两个方法轻松解决,还不需要花什么钱...
  7. 英语作文计算机国际会议开幕词,英文国际会议演讲稿范文
  8. python image.open 参数作用,python基础(python Image Library)
  9. JavaScript——操作表单(MD5验证)
  10. vue报错elementUI使用datepicker报错Avoid mutating a prop directly since the value will be overwritten whene