简介
监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
监听器的分类:
1) 监听域对象自身的创建和销毁的事件监听器
2) 监听域对象中的属性的增加和删除的事件监听器
3) 监听绑定到 HttpSession 域中的某个对象的状态的事件监听器
如何编写监听器:
1) 编写实现了监听器接口的Java 类
public class HelloServletContextListner implements ServletContextListener{...}
2) 对于第一种和第二种监听器需要在web.xml 中进行注册:
监听域对象自身的创建和销毁的事件监听器
域对象创建和销毁的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。
域对象的创建和销毁时机:
1. ServletContextListener,是最常用的 Listener, 可以在当前 WEB 应用被加载时对当前 WEB 应用的相关资源进行初始化操作:创建数据库连接池, 创建 Spring 的 IOC 容器, 读取当前 WEB 应用的初始化参数 ...
2. ServletRequestListener,
3.HttpSessionListener
在每个监听器中都要两个方法:
> 在域对象创建后立即被调用的方法
> 在域对象销毁前被调用的方法
方法的参数,以ServletContextEvent 为例: getServletContext() 获取 ServletContext
域对象中属性的变更的事件监听器(了解)
1). 监听 ServletContext, HttpSession, ServletRequest 中添加属性, 替换属性, 移除属性的事件监听器.
2). 以 ServletRequestAttributeListener 为例:
//添加属性时被调用 public void attributeAdded(ServletRequestAttributeEvent srae) { System.out.println("向 request 中添加了一个属性..."); } //移除属性时被调用 @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { System.out.println("从 request 中移除了一个属性..."); } //替换属性时被调用. @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { System.out.println("request 中属性替换了..."); }
3). 这三个 ServletContextAttributeListener,ServletRequestAttributeListener, HttpSessionAttributeListener 监听器较少被使用.
4). API:
ServletRequestAttributeEvent:
> getName(): 获取属性的名字
> getValue(): 获取属性的值.
感知 Session 绑定的事件监听器
1. HttpSessionBindingListener(该监听器较少被使用)
1). 监听实现了该接口的 Java 类的对象被绑定到 session 或从 session 中解除绑定的事件.
//当前对象被绑定到 session 时调用该方法 public void valueBound(HttpSessionBindingEvent event) //当前对象从 session 中解除绑定调用该方法 public void valueUnbound(HttpSessionBindingEvent event)
2). 注意: 该监听器不需要在 web.xml 文件中进行配置.
3). HttpSessionBindingEvent:
getName()
getValue()
getSession()
2. HttpSessionActivationListener(该监听器较少被使用)
1). 监听实现了该接口和 Serializable 接口(若不实现,则只能写到磁盘上,不能读取出来)的 Java 类的对象随 session 钝化和活化事件
> 活化: 从磁盘中读取 session 对象
> 钝化: 向磁盘中写入 session 对象
> session 对象存储在tomcat 服务器的 work\Catalina\localhost\contextPath 目录下. SESSION.SER
2). 该监听器不需要在 web.xml 文件中进行配置.
3).
//在活化之后被调用. public void sessionDidActivate(HttpSessionEvent se) //在钝化之前被调用 public void sessionWillPassivate(HttpSessionEvent se) HttpSessionEvent: getSession()
应用
统计当前在线人数列表