目录:
第一类:用于监听作用域创建和销毁的监听器 1、监听Request作用域创建和销毁 2、监听Session作用域创建和销毁 3、监听ServletContext作用域的创建和销毁 第二类:用于监听作用域中的值创建、删除、修改 4、监听Request作用域中的值被创建、修改、删除 5、监听Session作用域中的值被创建、删除、修改 6、监听ServletContext作用域中的值的创建、修改、删除 第三类:用于监听Session作用域中的数据状态和对象绑定 7、监听对象在session中绑定或移除的事件 8、监听session中绑定的对象的活化和钝化
文章比较长,介意根据目录查阅。
什么是监听器
它的作用与谍战片中的监听器相同,用来监听或监控你干了什么,只不过谍战片中监听对象是人,而动态网页中监听对象是代码。
官方一点的就是:动态网页中的监听器用于监听你想要监听的对象状态发生改变的事件。
必须条件
要实现监听器就必须有三个必须条件,即:
事件源:我们需要监听的对象。
监听器:用于监听事件源状态发生改变的对象。
注册监听器:将事件源和监听器绑定的过程。
八个监听器可以分为三类
前六个监听器都有基于xml和注解两种方式。
1、用于监听作用域创建和销毁的监听器类
01
监听Request作用域创建和销毁
xml方式
创建实现 ServletRequestListener 接口的实现类:
代码语言:javascript复制public class RequestListener implements ServletRequestListener {
//监听request对象销毁的
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("request对象销毁");
}
//监听request对象创建的
@Override
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("request对象创建");
}
}
在web.xml中注册监听器:
代码语言:javascript复制<listener>
<listener-class>com.Listeners.RequestListener</listener-class>
</listener>
注解方式:
注解方式只需要在实现类前添加类级别注解 @WebListener,声明该类是一个监听器。
下面演示一次,后面不再演示。
在类前声明类级别注解:
代码语言:javascript复制@WebListener
public class RequestListener implements ServletRequestListener {
//监听request对象销毁的
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("request对象销毁");
}
//监听request对象创建的
@Override
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("request对象创建");
}
}
02
监听Session作用域创建和销毁
xml方式
创建实现 HttpSessionListener 接口的实现类:
代码语言:javascript复制public class SessionListener implements HttpSessionListener {
//监听session作用域创建
@Override
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("session对象创建");
}
//监听session作用域销毁
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("session对象销毁");
}
}
在web.xml中注册监听器:
代码语言:javascript复制<listener>
<listener-class>全限定类名</listener-class>
</listener>
注解方式:在实现类前添加类级别注解 @WebListener,声明该类是一个监听器。
03
监听ServletContext作用域的创建和销毁
应用服务器启动时,创建,在停止(正常停止)时销毁。
xml方式
创建实现 ServletContextListener 接口的实现类:
代码语言:javascript复制public class ApplicationListener implements ServletContextListener {
//监听应用销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("应用销毁");
}
//监听应用启动
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("应用启动");
}
}
在web.xml中注册监听器:
代码语言:javascript复制<listener>
<listener-class>全限定类名</listener-class>
</listener>
注解方式:在实现类前添加类级别注解 @WebListener,声明该类是一个监听器。
2、用于监听作用域中值的创建、修改、删除
04
监听Request作用域中的值被创建、修改、删除
xml方式
创建ServletRequestAttributeListener接口的实现类:
代码语言:javascript复制public class RequestAttributeListener implements ServletRequestAttributeListener {
//监听Request作用域中的值被创建
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Request作用域中的值被创建");
}
//监听Request作用域中的值被删除
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Request作用域中的值被删除");
}
//监听Request作用域中的值被修改
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Request作用域中的值被修改");
}
}
在web.xml中注册监听器:
代码语言:javascript复制<listener>
<listener-class>全限定类名</listener-class>
</listener>
注解方式:在实现类前添加类级别注解 @WebListener,声明该类是一个监听器。
05
监听Session作用域中的值被创建、删除、修改
xml方式
创建HttpSessionAttributeListener接口的实现类:
代码语言:javascript复制public class SessionAttributeListener implements HttpSessionAttributeListener {
//监听Session作用域中的值被创建
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Session作用域中的值被创建");
}
//监听Session作用域中的值被删除
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Session作用域中的值被删除");
}
//监听Session作用域中的值被更新
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Session作用域中的值被更新");
}
}
在web.xml中注册监听器:
代码语言:javascript复制<listener>
<listener-class>全限定类名</listener-class>
</listener>
注解方式:在实现类前添加类级别注解 @WebListener,声明该类是一个监听器。
06
监听ServletContext作用域中的值的创建、修改、删除
xml方式
创建ServletContextAttributeListener接口的实现类:
代码语言:javascript复制public class ApplicationAttributeListener implements ServletContextAttributeListener {
//监听ServletContext作用域中的值被创建
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContext作用域中的值被创建");
}
//监听ServletContext作用域中的值被删除
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContext作用域中的值被删除");
}
//监听ServletContext作用域中的值被修改
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContext作用域中的值被修改");
}
}
在web.xml中注册监听器:
代码语言:javascript复制<listener>
<listener-class>全限定类名</listener-class>
</listener>
注解方式:在实现类前添加类级别注解 @WebListener,声明该类是一个监听器。
3、用于监听session中的数据状态和绑定情况
注意:
① 这一类型的监听器不需要注册,不需要在web.xml中配置,也不需要注解。
② 实现接口的实现类必须是一个实体类。
07
对象在session中绑定或移除的事件
创建HttpSessionBindingListener的实现类(该类必须是一个实体类):
代码语言:javascript复制public class SessionBindingListener implements HttpSessionBindingListener {
private int id;//用户id
private String user;//用户名
private String pwd;//用户密码
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//监听该对象在Session中被绑定
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("SessionBindingListener实体类被绑定到Session");
}
//监听该对象在Session中被解除绑定
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("SessionBindingListener实体类在Session解除绑定");
}
}
08
监听session中绑定的对象的活化和钝化
绑定到session会中的对象可以被监听到活化和钝化的时间。在VM(虚拟机)之间项目迁移,保留会话(会话序列化到硬盘中),恢复会话(反序列化)。
活化(反序列化):将硬盘中的对象写入到内存中。
钝化(序列化):将内存中的对象写入到硬盘中。
创建Serializable,HttpSessionActivationListener两个接口的实现类(该类必须是一个实体类):
代码语言:javascript复制public class Tuser implements Serializable, HttpSessionActivationListener {
private int id;
private String user;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//监听对象活化,反序列化
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Tuser对象活化");
}
//监听对象钝化,序列化
@Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Tuser对象钝化");
}
}