Java监听器
监听器
1.概念
监听器:主要是用来监听特定对象的创建,属性的变化的!,本质上却是一个实现特定接口的普通java类!
对象分为自己创建自己使用的,和别人创建自己用的,自己创建的不需要监听,值需要取监听别人创建的对象。
Servlet中需要监听的对象有:
- 用于http请求的Request域对象
- 用于会话管理的session域对象
- 用于Servlet服务的servletContext域对象
根据监听域对象的不同,java中的监听分为三种,分别是:request监听器,session相关监听器,servletContext监听器
监听器接口:
注意下面的都是接口,接口下有实现的对象方法的类
1.监听对象/销毁的监听器接口
Interface ServletRequestListener
监听request对象的创建或销毁
Interface HttpSessionListener
监听Session对象的创建或销毁
Interface ServletContextListener
监听ServletContext对象的创建或销毁
2.监听对象属性的变化
Interface ServletRequestAttributeListener
监听request对象属性变化:添加,移除,修改
Interface HttpSessionAttributeListener
监听session对象属性变化:添加,移除,修改
Interface ServletContextAttributeListener
监听servletContext对象属性变化
3.Session相关监听器
Interface HttpSessionBindingListener
监听对象绑定到Session上的事件
Interface HttpSessionActivationListener(了解)
监听Session序列化及反序列化的事件
2.生命周期接口监听器
生命周期接口监听器:就是监听对象的创建,销毁事件的
监听器开发步骤:
1.写一个普通java类,实现相关接口
2.配置(web.xml),即部署
2.1.ServletRequestListener
request域对象:在http向服务器请求时创建,在服务器响应之后销毁
/**
* 监听request对象的创建和销毁
* Created by cenyu on 16-12-19.
*/
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener {
//对象销毁
@Override
public void requestDestroyed(ServletRequestEvent sre) {
//拿取request中存放的数据
Object obj = sre.getServletRequest().getAttribute("cn");
System.out.println(obj);
System.out.println("request.......MyRequestListener.requestDestroyed");
}
//对象创建
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request.......MyRequestListener.requestInitialized");
}
}
2.2.HttpSessionListener
Session域对象:每次请求时都会创建Session,关闭浏览器或服务器不会销毁,可以等时效过去,或者手动删除
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 测试监听session对象的创建,销毁
* Created by cenyu on 16-12-19.
*/
public class MySessionListener implements HttpSessionListener {
//创建
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session......MySessionListener.sessionCreated");
}
//销毁
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session......MySessionListener.sessionDestroyed");
}
}
2.3.ServletContextListener
ServletContext域对象,在服务器启动时创建,在服务器关闭时销毁
package d_listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 监听ServletContext对象的创建,销毁
* Created by cenyu on 16-12-19.
*/
public class MyServletContextListener implements ServletContextListener {
//创建
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("servlet......MyServletContextListener.contextInitialized");
}
//销毁
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("servlet......MyServletContextListener.contextDestroyed");
}
}
以上三个监听器的配置文件:
<?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_3_1.xsd"
version="3.1">
<!--监听request对象创建,销毁-->
<listener>
<listener-class>d_listener.MyRequestListener</listener-class>
</listener>
<!--监听session对象创建,销毁-->
<listener>
<listener-class>d_listener.MySessionListener</listener-class>
</listener>
<!--监听ServletContext对象创建,销毁-->
<listener>
<listener-class>d_listener.MyServletContextListener</listener-class>
</listener>
</web-app>
3.属性监听器
3.1.ServletRequestAttributeListener
监听request对象属性变化:添加,移除,修改
package d_listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
/**
* 监听request对象属性变化:添加,移除,修改
* Created by cenyu on 16-12-20.
*/
public class MyRequestAttrListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent re) {
ServletRequest request = re.getServletRequest();
Object name = request.getAttribute("cn");
System.out.println("新增属性:"+name);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent re) {
System.out.println("属性移除");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent re) {
System.out.println("属性更改");
ServletRequest request = re.getServletRequest();
Object cn = request.getAttribute("cn");
System.out.println(cn);
}
}
3.2.HttpSessionAttributeListener
监听session对象属性变化:添加,移除,修改
package d_listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* 监听session对象属性变化:添加,移除,修改
* Created by cenyu on 16-12-19.
*/
public class MySessionAttrListener implements HttpSessionAttributeListener {
//增加属性
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
//先获取session对象
HttpSession session = se.getSession();
//获取添加的属性
Object obj = session.getAttribute("cn");
//测试
System.out.println("添加的属性,"+obj);
}
//移除属性
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性移除");
}
//更改属性
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
//获取Session对象
HttpSession session = se.getSession();
//获取替换前的值
Object obj1 = se.getValue();
System.out.println("原来的值:"+obj1);
//获取新值
Object obj2 = session.getAttribute("userName");
System.out.println("修改之后的新值:"+obj2);
}
}
3.3.ServletContextAttributeListener
监听servletContext对象属性变化
package d_listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
* 监听servletContext对象属性变化:添加,移除,修改
* Created by cenyu on 16-12-20.
*/
public class MyContextAttrListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent sb) {
ServletContext context = sb.getServletContext();
Object name = context.getAttribute("name");
System.out.println("context新增属性:"+name);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent sb) {
System.out.println("context值被移除");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent sb) {
ServletContext context = sb.getServletContext();
Object name = context.getAttribute("name");
System.out.println("context值被修改"+name);
}
}
总结:
先写类,实现接口,再配置
4.其他监听器:Session相关监听器
HttpSessionBindingListener:
监听对象绑定/接触绑定到Session事件
步骤:
1.对象实现接口
2.把对象绑定/解除绑定到Session上就可以了,不用写配置
作用:
可以做上线提醒等功能
思考:
这个Session监听器,和上面的声明周期,属性监听器的区别?
Session监听器不用在web.xml配置,因为监听的对象是自己创建的对象,不是服务器对象
package d_listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 监听此对象绑定到Session上的过程,需要实现Session特定接口
* Created by cenyu on 16-12-20.
*/
public class Admin implements HttpSessionBindingListener{
private int id;
private String name;
//对象放入Session
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("Admin对象已经放入Session");
}
//对象从Session中移除
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("Admin对象从Session中移除");
}
public Admin(int id, String name) {
this.id = id;
this.name = name;
}
public Admin() {
super();
}
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;
}
@Override
public String toString() {
return "Admin{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
在jsp中做的测试,测试方法是添加Session,但是要添加对象才行,如下:
//注意:添加的是new Admin()
session.setAttribute("userInfo",new Admin());
session.removeAttribute("userInfo");
Java监听器的更多相关文章
- JAVA监听器原理
http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...
- JAVA监听器Listener
JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...
- Java监听器Listener使用说明
转载:http://blog.csdn.net/meng2602956882/article/details/13511587 1.什么是Java监听器 监听器也叫Listener,是Servlet的 ...
- Java监听器listener的介绍
Java监听器listener的介绍 listener 能做什么 当web中某些动作发生之后,服务器就调用listener中对应的方法. 内部机制 接口回调 Web监听器 步骤 创建需要的监听器类,实 ...
- 自己编写一个Java监听器
Java监听器 1.原理: 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法. 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我 ...
- Java 监听器
1: 监听器的定义 2:监听器的用途 3:实例 4:监听器分类 5:Servlet3.0下监听器的使用 6:实际项目常用的案例 1: 监听器的定义: 监听器实际上是一个类,这个类实现了特定的接口,然后 ...
- java监听器之实现在线人数显示
在码农的世界里只有bug才能让人成长,The more bugs you encounter, the more efficient you will be! java中的监听器分为三种:Servle ...
- java监听器、定时器的使用
1.监听器 在web.xml配置 <!-- 时间任务 --> <listener> <listener-class> com.hk.common.timer.Tim ...
- java监听器(Listener)学习笔记
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次, ...
随机推荐
- cookie——小甜品
Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明.Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一 ...
- 开源Word读写组件DocX 的深入研究和问题总结
一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...
- [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作
走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...
- 学习总结 之 WebApi服务监控 log4net记录监控日志
在请求WebApi 的时候,我们更想知道在请求数据的时候,调用了哪个接口传了什么参数过来,调用这个Action花了多少时间,有没有人恶意请求.我们可以通过记录日志,对Action进行优化,可以通过日志 ...
- Solr Facet 默认值
前言 今天在用Solr Facet遇到了默认值的问题,我用Facet.field查询发现数据总共100条,刚开始没有注意,发现少个别数据,但是用这几个个别的id查询又能查出来数据.才发现是Facet默 ...
- 记一次nginx部署yii2项目时502 bad gateway错误的排查
周六闲来无事,就试着安装和部署下yii2,安装过程没什么问题,但部署到nginx上时遇到了502 bad gatewary问题,折腾了半天才搞定.这个问题是我以前在部署yii2时没有遇到过的,因此记在 ...
- Bootstrap 4-alpha 初体验
What is Bootstrap? 第一句话就是废话了,作为新时代有理想有节操的开发人员无人不知无人不晓.可能就是熟悉程度因为各种原因不尽相同,有人只是知道他大概是个什么东西,有些人可能基本可以使用 ...
- TypeScript 强类型 JavaScript – Rafy Web 框架选型
今天看到了 AngularJs 2.0 版本将基于 TypeScript 构建 的消息.与同事们对 TypeScript 展开了讨论.本文记录一些个人的想法. 理想的 JavaScript 开发模式 ...
- 在DevExpress程序中使用Winform分页控件直接录入数据并保存
一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...
- 03 通过Button打开另一个的frm
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DialogResult re = MessageBox ...