监听器
专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
Servlet监听器
Servlet规范中定义的一种特殊类,用于监听web应用程序中的ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件
Servlet监听器的分类:
按监听的事件类型Servlet监听器可以分为如下三种类型:
1、域对象(request、session、application)监听器:监听域对象自身的创建和销毁的事件监听器;原来域对象的创建和销毁我们无法参与,监听器的出现提供了参与的机会
2、属性监听器:监听域对象中的属性的增加和删除的事件监听器;
3、HttpSession域内对象监听器:监听绑定到HttpSession域中的某个对象的事件监听器。
域对象监听器:
域对象创建和销毁的事件监听器就是用来监听ServletContext、HttpSession和HttpServletRequest这三个对象的创建和销毁事件的监听器。
域对象的创建和销毁时机:
域对象 | 创建时机 | 销毁时机 | 监听器接口 |
---|---|---|---|
ServletContext | Web服务器启动时为每个web应用程序创建相应的ServletContext对象 | Web服务器关闭时为每个web应用程序销毁相应的ServletContext对象 | ServletContextListener接口 |
HttpSession | 浏览器开始与服务器会话时创建 | 调用HttpSession.invalidate();超过了session的最大有效时间间隔;服务器进程被停止 | HttpSessionListener接口 |
ServletRequest | 每次请求开始时创建 | 每次访问结束后销毁 | ServletRequestListener接口 |
ServletContextListener接口:
ServletContextListener接口用于监听ServletContext对象的创建和销毁。
ServletContext对象被创建后调用contextInitialized(ServletContextEvent sce)方法。
ServletContext对象被销毁前调用contextDestroyed(ServletContextEvent sce)方法。
ServletContextEvent类中可以通过getServletContext()获取ServletContextServletContextListener.
实现类代码变化,则重新加载销毁。
使用时要去web.xml文件中配置Listener
HttpSessionListener接口:
HttpSessionListener接口用于监听HttpSession对象的创建和销毁。
HttpSession对象被创建后调用sessionCreated (HttpSessionEvent sce)方法。
HttpSession对象被销毁前调用sessionDestroyed(HttpSessionEvent sce)方法。
使用时要去web.xml文件中配置Listener。
ServletRequestListener接口:
ServletRequestListener接口用于监听request对象的创建和销毁。
public void requestInitiallized(ServletRequestEvent event):ServletRequest对象被创建后调用;
public void requestDestroyed(ServletRequestEvent event):ServletRequest对象被销毁前调用。
域对象中属性变更事件监听器
域对象中属性变更的事件监听器用来监听ServletContext、HttpSession和HttpServletRequest这三个对象中的属性变更信息事件的监听器。这三个监听器接口分别是ServletContextAttributeListener、HttpSessionAttributeListener和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中属性的增加、删除和替换事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
以HttpSessionAttributeListener为例演示该类监听器使用方法:
属性替换,即重新添加名相同值不同的属性
感知Session绑定的事件监听器
保存在Session域中的对象可以有多种状态:绑定到Session中;从Session域中解除绑定;随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复;
Servlet规范中定义了两个特殊的监听器接口来帮助JavaBean对象了解自己在Session域中的这些状态:HttpSessionBindingListener接口和HttpSessionActivationListener接口,实现这两个接口的类不需要web.xml文件中进行注册。
HttpSessionBindingListener接口
实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和从Session中删除的事件。当对象被绑定到HttpSession对象(session.setAttribute())中时,web服务器调用该对象的 void valueBound(HttpSessionBindingEvent event)方法;当对象从HttpSession对象中解除绑定(session.removeAttribute())时,web服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法。
HttpSessionBindingEvent方法:getName():getValue():getSession():
HttpSessionActivationListener接口
该接口用于监听实现该接口和Serializable接口的Java类的对象随session钝化和活化事件,若不实现该接口,则只能写到磁盘上,但不能读取出来
实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(从硬盘中读取session对象)和钝化(从内存中写到硬盘上)的事件。
当绑定到HttpSession对象中的对象将要随HttpSession对象被钝化(向硬盘中写入session对象)之前,web服务器调用该对象的void sessionWillPassivate(HttpSessionBindingEvent event)方法。javaBean要进行序列化。(关闭服务器时)
当绑定到HttpSession对象中的对象将要随HttpSession对象被活化(从硬盘中读出来)之后,web服务器调用该对象的void sessionDidActive(HttpSessionBindingEvent event)方法。(重启服务器时)
session对象存储在tomcat服务器的work\Catalina\localhost\项目名下,文件名为SESSION.SER