java Web 监听器Listener详解
简介
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详解的更多相关文章
- java web.xml配置详解(转)
源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...
- 《Tomcat与Java Web开发技术详解》思维导图
越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...
- java web之Filter详解
java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...
- Java web.xml 配置详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- java web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- Java Web(一) Servlet详解!!
这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...
- (转)Java Web(一) Servlet详解!!
https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...
- Servlet 监听器Listener详解
转自:http://blog.csdn.net/u012228718/article/details/41730799 一.简介 (一)概述 1.Listener 用于监听 Javaweb程序中的事件 ...
- Java Web开发之详解JSP
JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面.Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用, ...
随机推荐
- 作为一名Java开发工程师需要掌握的专业技能
在学习Java编程完之后,学员们面临的就是就业问题.作为一名Java开发工程师,企业在招聘的时候,也是有一定的标准的. 为了帮助大家更好的找到适合自己的工作,在这里分享了作为一名Java开发工程师需要 ...
- 卷积神经网络实战-----0001(移植卷积神经网络c++ to python or java)
1. https://github.com/174high/simple_cnn 自己fork的 2. https://github.com/can1357/simple_cnn 最初始的 3. ...
- Python解析excel文件并存入sqlite数据库
最近由于工作上的需求 需要使用Python解析excel文件并存入sqlite 就此做个总结 功能:1.数据库设计 建立数据库2.Python解析excel文件3.Python读取文件名并解析4.将解 ...
- 使用jenkins并发布应用到tomcat
jenkins的介绍及安装请自行百度,本文重点介绍如何使用jenkins,并自动发布web应用到tomcat中. 1 . 创建项目 打开jenkins --> 新建 --> 填写item名 ...
- 创建Oracle数据库需要注意的几点
规划表和存储空间,防止出现空间不足或者空间的浪费 规划快速恢复区,将快速恢复区定义在与数据文件不同的存储区域,减少IO争用 规划数据库的名称,db_name,db_main,sid 规划spfile内 ...
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...
- 在IIS站点中使用数字证书
1. SSL解析(内容来自百度百科) SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安 ...
- 洛谷 P2863 [USACO06JAN]牛的舞会The Cow Prom
传送门 题目大意:形成一个环的牛可以跳舞,几个环连在一起是个小组,求几个小组. 题解:tarjian缩点后,求缩的点包含的原来的点数大于1的个数. 代码: #include<iostream&g ...
- CLR值类型和引用类型
知识点:引用类型.值类型.装箱.拆箱 CLR支持两种类型:引用类型和值类型.引用类型在堆上分配内存,值类型在线程栈上分配内存.值类型与引用类型如下所示: 值类型对象有两种表示形式:未装箱和已装箱.将一 ...
- Arcmap10.1下安装ArcBrutile0.2.2 (Win7)(转)
前阵子换了高级新电脑,用的win7旗舰版装了Arcgis10.1,一直没试过ArcBrutile0.2.2能不能用,今天想用的时候发现自己竟然忘记怎么加载这个工具了!!! 网上搜了一下,度娘今天不 ...