1、作用
Listener : 监听器 。用于监听某一个事件的发生。
2、分类
1)监听三个域对象创建销毁
用于监听 三个域对象的创建销毁事件
request ----httpServletRequest
session----httpSession
application ----ServletContext ServletContextListener
监听ServletContext创建销毁 创建 :服务器启动为每一个应用创建一个ServletContext实例
销毁:关闭服务器,或者项目从服务器中移除 作用: 完成初始化工作;执行自定义任务调度。Timer
ServletRequestListener 监听ServletRequest创建销毁 创建:只要有请求过来,不管请求什么东西,
服务器都会帮我们创建一个request实例 销毁:当服务器对这次请求作出了响应,那么就销毁了这个实例 HttpSessionListener
监听session的创建销毁 创建:服务器调用getSession 或者 访问jsp 会创建 session实例 销毁:会话超时 ,
非正常关闭 服务器(正常关闭服务器 ,session会序列化。) 作用:统计在线人数 用法: 三个用法都一样,
- 定义一个类, 实现对应的接口。
- 在 web.xml 中 使用listener 元素来注册
2)监听三个域对象值变更
ServletContextAttributeListener --------- ServletContext
监听ServletContext 域中的属性改变 , 添加 | 替换 | 移除
ServletRequestAttributeListener ---------- request
监听ServletRequest 域中的属性改变 , 添加 | 替换 | 移除
HttpSessionAttributeListener-------------------session
监听HttpSession 域中的属性改变 , 添加 | 替换 | 移除
用法一样:
- 定义一个了类,实现对应的接口
- 在web.xml中使用listener 注册
- 对三个域分别作出 添加 | 替换 | 移除的动作。
3)监听httpSession中的值改变
这一类监听器与前两种监听器不太一样。这种监听器无需在web.xml中配置, 只需要让javaBean实现对应的接口即可。
HttpSessionBindingListener 让JavaBean使用该接口
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("对象被绑定到了session上面去了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("对象从session中移除了。");
}
HttpSessionBindingListener 主要监听的是 对象与session域的绑定和解绑的事件
HttpSessionActivationListener
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("对象被钝化了...");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("对象被活化了...");
}
HttpSessionActivationListener 监听的是 对象被钝化 和 活化的事件 。
钝化:正常关闭服务器或者超过了规定时间,那么对象将会被 钝化(序列化)到硬盘上 。
活化:重新启动服务器, 那么之前钝化的数据将会被活化(反序列化。)
3、Session优化
Session中通常可以存数据的,那么我们可以把一些长时间不使用的数据给序列化到硬盘上,等再使用的时候,可以从硬盘反序列化回来。这样节省了不少内存空间。
如果想做到这个事情,我们可以通过配置,让服务器帮我们去完成这项工作。 配置主要有以下三种方式:
- 在tomcat中 conf/context.xml中配置 : 对服务器上部署的左右域名都生效
- 在 conf/Catalina/location/context.xml中配置 只针对localhost 域名生效
- 在web工程项目中 MATA-INF/context.xml中配置 只针对当前的工程生效