说明:
Listener用于监听作用域创建和销毁、属性值的变更、Session值的变更等。
一、监听三个作用域创建和销毁:
1.application作用域:
触发时机:启动服务器时调用contextInitialized,停止服务器时调用contextDestroyed。
实现接口:ServletContextListener
(1)实现ServletContextListener接口,重写创建和销毁方法:
public class ServletContextListenerImpl implements ServletContextListener {
//启动服务器时触发
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContextListener.super.contextInitialized(sce);
}
//停止服务器时触发
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContextListener.super.contextDestroyed(sce);
}
}
(2)在web.xml中注册listener:
<!-- 注册ServletContextListener -->
<listener>
<listener-class>com.yyh.hkw.listener.ServletContextListenerImpl</listener-class>
</listener>
2.session作用域:
触发时机:调用getSession时调用sessionCreated,session销毁时调用sessionDestroyed(默认30分钟后、非正常关闭、正常关闭服务器)。
实现接口:HttpSessionListener
(1)实现HttpSessionListener接口,重写创建和销毁方法:
public class HttpSessionListenerImpl implements HttpSessionListener {
//调用getSession时触发
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSessionListener.super.sessionCreated(se);
}
//session销毁时触发(默认30分钟后、非正常关闭、正常关闭服务器)
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSessionListener.super.sessionDestroyed(se);
}
}
(2)在web.xml中注册listener(代码同上)。
3.request作用域:
触发时机:html/jsp/servlet请求来时调用requestInitialized,响应结束时调用requestDestroyed。
实现接口:ServletRequestListener
(1)实现ServletRequestListener接口,重写创建和销毁方法:
public class ServletRequestListenerImpl implements ServletRequestListener {
//请求来时触发
@Override
public void requestInitialized(ServletRequestEvent sre) {
ServletRequestListener.super.requestInitialized(sre);
}
//结束响应后触发
@Override
public void requestDestroyed(ServletRequestEvent sre) {
ServletRequestListener.super.requestDestroyed(sre);
}
}
(2)在web.xml中注册listener(代码同上)。
二、监听三个作用域属性值变更(增加、移除、替换):
1.application作用域:
触发时机:属性值变更时调用。
实现接口:ServletContextAttributeListener
(1)实现ServletContextAttributeListener接口,重写增加、移除、替换监听方法:
public class ServletContextAttributeListenerImpl implements ServletContextAttributeListener {
//增加时触发
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeAdded(scae);
}
//移除时触发
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeRemoved(scae);
}
//替换时触发
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeReplaced(scae);
}
}
(2)在web.xml中注册listener(代码同上)。
2.session作用域:
触发时机:session中属性值变更时调用。
实现接口:HttpSessionAttributeListener
(1)实现HttpSessionAttributeListener接口,重写增加、移除、替换监听方法:
public class HttpSessionAttributeListenerImpl implements HttpSessionAttributeListener {
//增加时触发
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeAdded(se);
}
//移除时触发
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeRemoved(se);
}
//替换时触发
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeReplaced(se);
}
}
(2)在web.xml中注册listener(代码同上)。
3.request作用域:
触发时机:request中属性值变更时调用。
实现接口:ServletRequestAttributeListener
(1)实现ServletRequestAttributeListener接口,重写增加、移除、替换监听方法:
public class ServletRequestAttributeListenerImpl implements ServletRequestAttributeListener {
//增加时触发
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeAdded(srae);
}
//移除时触发
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeRemoved(srae);
}
//替换时触发
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeReplaced(srae);
}
}
(2)在web.xml中注册listener(代码同上)。
三、监听JavaBean存入、移出Session:
触发时机:当前JavaBean对象被存到session时调用valueBound,当前JavaBean对象被移出session时调用valueUnbound。
实现接口:HttpSessionBindingListener
实现HttpSessionBindingListener接口,重写存入、移出监听方法:
public class User implements HttpSessionBindingListener {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 当前JavaBean对象被存到session时触发
@Override
public void valueBound(HttpSessionBindingEvent event) {
HttpSessionBindingListener.super.valueBound(event);
}
// 当前JavaBean对象被移出session时触发
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSessionBindingListener.super.valueUnbound(event);
}
}
四、监听JavaBean序列化(存入磁盘)、反序列化(从磁盘取出):
触发时机:当前JavaBean对象被序列化时调用sessionWillPassivate,当前JavaBean对象被反序列化时调用sessionDidActivate。
实现接口:HttpSessionActivationListener
1.实现HttpSessionActivationListener接口,重写序列化、反序列化监听方法:
public class User implements HttpSessionActivationListener {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 当前JavaBean对象被序列化时触发(存入磁盘)
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
HttpSessionActivationListener.super.sessionWillPassivate(se);
}
// 当前JavaBean对象被反序列化时触发(从磁盘取出)
@Override
public void sessionDidActivate(HttpSessionEvent se) {
HttpSessionActivationListener.super.sessionDidActivate(se);
}
}
2.配置Tomcat自动序列化、反序列化session中的值:
(1)在context.xml中加入配置:
方法1,对所有服务器生效:
...\apache-tomcat-x\conf\context.xml
方法2,对localhost生效:
...\apache-tomcat-x\conf\Catalina\localhost\context.xml
方法3,对本工程生效:
工程/WebContent/META-INF/context.xml
(2)配置内容:
<!-- maxIdleSwap表示不进行序列化时间(分钟为单位),directory指序列化文件存放目录 -->
<Context>
<Manager className="org.apache.catalina.session.persistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="temp">
</Manager>
</Context>