一、概念
监听器Listener,用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等。
监听器的启动顺序:按照web.xml的配置顺序来启动
加载顺序:监听器>过滤器>Servlet
二、八大监听器
Listener接口 |
Event类 | 说明 |
ServletContextListener |
ServletContextEvent | 监听ServletContext对象的创建和销毁(需要在web.xml配置 ) |
ServletContextAttributeListener |
ServletContextAttributeEvent | 监听ServletContext对象属性变化(需要在web.xml配置 ) |
HttpSessionListener |
HttpSessionEvent | 监听Session对象的创建和销毁(需要在web.xml配置 ) |
HttpSessionActivationListener | 监听Session内部的对象钝化与活化(不需要在web.xml配置 ) | |
HttpSessionAttributeListener |
HttpSessionBindingEvent | 监听Session对象属性变化(需要在web.xml配置 ) |
HttpSessionBindingListener | 监听Session内部的对象绑定与解绑(不需要在web.xml配置 ) | |
ServletRequestListener |
ServletRequestEvent | 监听Request对象的创建和销毁(需要在web.xml配置 ) |
ServletRequestAttributeListener |
ServletRequestAttributeEvent | 监听Request对象属性变化(需要在web.xml配置 ) |
Session钝化与活化
当正在浏览页面的时候服务器突然关闭,浏览器不关闭,当再次开启服务器时还能够恢复关闭时的页面
(1)钝化状态:是将session内存中的对象持久化(序列化)到磁盘
(2)活化状态:就是将磁盘上的对象再次恢复到session内存中
public class Person implements Serializable, HttpSessionActivationListener {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println(this+"从硬盘读取并活化了");
}
@Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println(this+"钝化保存到硬盘");
}
@Override
public String toString() {
return "Person [name=" + name + "]---"+super.toString();
}
}
(3)钝化配置
session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以钝化存储到硬盘上,等下一次在使用的时候,在从硬盘上活化提取出来。
配置Session对象在一定时间内钝化
1'' 在Tomcat中conf/context.xml 里面配置(对所有的运行在这个服务器的项目生效 )
2'' 在Tomcat中conf/Catalina/localhost/context.xml 配置(对 localhost生效, localhost:8080)
3'' 在自己的web工程项目中的 META-INF/context.xml(只对当前的工程生效)
<Context>
<!--maxIdleSwap : 1分钟不用就钝化-->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<!--directory :钝化后的那个文件存放的目录位置-->
<Store className="org.apache.catalina.session.FileStore" directory="mark"/>
</Manager>
</Context>
三、使用
1.实现相应Listener接口
/**
* 自定义监听器, 实现ServletContextListener
*/
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("web容器启动, context对象被创建...");
System.out.println(sce.getServletContext().toString());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("web容器关闭, context对象被销毁...");
}
}
2.在web.xml
文件中注册
<!-- 配置监听器 -->
<listener>
<listener-class>com.mark.demo.web.listener.MyListener</listener-class>
</listener>