1. 基本概念
web监听器是Servlet规范中定义的一种特殊类
监听器就是能监听某个对象的状态变化的组件,是用来监听域对象的变化的
每当Tomcat创建或销毁三大域对象,都会被这些监听器察觉,然后它们会做相应的操作(调用自身的特定方法)
6个常规监听器,分属三类,分别对应JavaWeb三大域对象(除去JSP的Page域):ServletContext、HttpSession、ServletRequest。共三对,每一对都包括1个生命周期监听和1个属性监听
还有两个感知监听器
使用的时候实现相应的接口然后配置即可
6个常规监听器
|---ServletContext
|---ServletContextListener(生命周期监听)
|---ServletContextAttributeListener(属性监听)
|---HttpSession
|---HttpSessionListener(生命周期监听)
|---HttpSessionAttributeListener(属性监听)
|---ServletRequest
|---ServletRequestListener(生命周期监听)
|---ServletRequestAttributeListener(属性监听)
2个感知监听
|---HttpSessionBindingListener
|---HttpSessionActivationListener
-
生命监听器:所谓生命周期监听器,就是监听三大域对象的创建和销毁。每当Tomcat创建或销毁三大域对象,都会被这些监听器察觉,然后它们会做相应的操作(调用自身的特定方法)
-
属性监听器:属性监听器则专门监听三大域对象get/setAttribute()。每当我们给域对象设置值或者从里面取值,都会被它们监听到,然后还是触发它们特定的方法
2. 八大监听器详解(只写几个,其实使用都一样)
2.1 ServletContextListener生命周期监听器
用来监听ServletContext域的创建与销毁,ServletContext域在服务器启动时创建,在服务器关闭时销毁
使用场景
-
初始化的工作:初始化对象 初始化数据 加载数据库驱动 连接池的初始化
-
加载一些初始化的配置文件
-
任务调度
使用
编写一个监听器类去实现监听器接口,并覆盖监听器方法
参数是ServletContentEvent对象。可以通过它获取SeveletContext,当然也就可以对域对象get和set数据
在web.xml中进行配置
在Servlet3.0中,监听器的配置可以直接在代码中通过注释来完成,无需在web.xml中再配置(下面介绍)
2.2 HttpSessionListener
监听HttpSession域的创建与销毁,HttpSession在第一次调用request.getSession时创建,在服务器关闭 或session过期或手动销毁时销毁
使用场景
用监听器统计网站访问人数,记录访问日志
每当有一个访问连接到服务器时,服务器就会创建一个session来管理会话。那么我们就可以通过统计session的数量来获得当前在线人数
同样的参数是ServleSesionEvent对象。可以通过它获取Session域对象,当然也就可以对域对象get和set数据
@WebListener //在此注明以下类是监听器 监听器的配置注释来完成
public class onLineCount implements HttpSessionListener {
public int count=0;
public void sessionCreated(HttpSessionEvent arg0) {
count++;
arg0.getSession().getServletContext().setAttribute("Count", count);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
count--;
arg0.getSession().getServletContext().setAttribute("Count", count);
}
}
//在显示在线人数处通过session.getAttribute("Count")即可获取在线人数值。
2.3 ServletRequestListener
监听ServletRequest域创建与销毁的监听器,每一次请求都会创建request,请求结束销毁
2.4 监听域对象中的属性的增加和删除的事件监听器
25 监听绑定到HttpSession域中的某个对象的状态的事件监听对象
-
绑定:通过Session.setAttribute()将对象保存到Session域中
-
解除绑定:removeAttribute
-
钝化:将Sessin中的对象持久化存储到硬盘
-
活化:将Session对象从一个持久化设备进行恢复
Session的钝化机制
默认由org.apache.catalina.session.StandardManger管理
1.当Tomcat服务器被关闭或重启时,tomcat服务器会将当前内存中的Session对象钝化
2.Web应用程序被重新加载时,内存中的Session对象也会被钝化
3.钝化后端文件被保存在:Tomcat安装路径/work/Catalina/hostname/applicationname/SESSION.ser中(活化后文件消失)
由org.apache.catalina.session.Persistentmanager管理
1.在钝化的基础上进行了扩张。可以配置主流内存的Session对象数目,将不常使用的Session对象保存到文件系统或数据库,当用时再重新加载
2.默认情况下,Tomcat提供两个钝化驱动类,org.apache.Catalina.FileStore和org.apache.Cataline.JDBCStore
Servlet规范
HttpSessionBindingListener
- 绑定:valueBound方法
- 解除绑定:valueUnbound方法
HttpSessionActivationListener
- 钝化:sessionWillPassivate方法
- 活化:sessionDidActivate方法
注意:我们创建的并不是监听器,而是对普通的javaBean实现相应的接口,因为钝化,,活化,绑定,解除绑定所说的都是这个对象的状态,所以我们要监听的实际上只是这个对象(而且不需要在xml文件中配置,只要被放到了session域中就有效果)