Javax.servlet中定义了三类监听器:ServletContex相关、ServletRequest相关、和HttpSession相关的监听器。
ServletContex相关监听器:
ServletContextListener:
实现该接口的对象可以接收到web应用中servlet上下文载入或销毁的事件通知。需要在配置文件(web.xml)里面设置。
定义有如下方法:
void contextInitialized(ServletContextEvent sce):在servlet上下文开始初始化时触发;在context初始化时,所有的ServletContextListener都将先于filter和servlet的初始化前被通知。
void contextDestroyed(ServletContextEvent sce):在servlet上下文即将关闭时触发;在context 关闭时,所有的filter和servlet都将在ServletContextListener被通知前被destory()ed.
(事实上,contextListener、filter、servlet的初始化顺序依次是listener、filter、servlet,因此不可以反向引用它们的初始化数据,例如不能在filter初始化时使用servlet的初始化数据,不能在listener初始化时使用filter或servlet里面的初始化数据)
ServletContextAttributeListener:
实现该接口的对象可以接收到web应用中servlet上下文配置变动的事件通知。需要在配置文件(web.xml)里面设置。
定义有如下方法:
void attributeAdded(ServletContextAttributeEvent scab):在servlet上下文增加了一个属性时触发;
void attributeRemoved(ServletContextAttributeEvent scab):在servlet上下文移除一个已存在的属性时触发;
void attributeReplaced(ServletContextAttributeEvent scab):在servlet上下文替换一个已存在的属性时触发。
ServletContex相关监听器一般不需要应用程序来使用。除非你需要实时地检测配置项的信息更改,而如果必须得这样做的话,你最好把这些配置项存储在数据库中,然后提供一个更友好的UI来提供给用户更改,而不是直接修改配置文件。
ServletRequest相关监听器:
ServletRequestListener:当你希望接收到各种request请求进入(coming in)或离开(out of)一个web部件(component)的消息时,你可以通过实现这个接口来完成。当一个request开始进入每一个web应用的第一个servlet或filter时,将触发进入(coming in)web应用事件,当一个request离开最后一个servlet或filter链的第一个filter时,将触发一个离开(out of)web应用事件。(注意filter链的执行顺序)
定义有下面两个方法:
void requestDestroyed(ServletRequestEvent sre): request将离开一个web应用;
void requestInitialized(ServletRequestEvent sre) :request 将进入一个web应用。
ServletRequestAttributeListener:当你希望接收到request的属性变更事件时,可以通过实现这个接口来完成。变更通知只在request处于web应用中的时候发出。Request处于一个web应用指的是,从一个request进入(coming in)web应用到离开(out of)web应用之间的时间。
定义有下面方法:
void attributeAdded(ServletRequestAttributeEvent srae): 向一个request里面增加一个属性时触发;
void attributeRemoved(ServletRequestAttributeEvent srae): 从一个request里面移除一个属性时触发;
void attributeReplaced(ServletRequestAttributeEvent srae): 从一个request里面替换一个属性时触发。
ServletRequest相关监听器很少使用,也许你在调试程序的时候希望用到它们。
HttpSession相关监听器:
HttpSessionActivationListener: 绑定到session的对象可以侦听通知它们会话将被钝化和会话将被激活的容器事件。在 VM 之间迁移session或者保留session的容器需要通知绑定到实现 HttpSessionActivationListener 的session的所有属性。
定义有下面方法:
void sessionDidActivate(HttpSessionEvent se) : 通知会话刚刚被激活;
void sessionWillPassivate(HttpSessionEvent se):通知会话即将被钝化.
HttpSessionAttributeListener: 为了获取此 Web 应用程序内会话属性列表更改的通知,可实现此侦听器接口。
定义有下面方法:
void attributeAdded(HttpSessionBindingEvent se) :通知已将属性添加到会话。在添加属性之后调用;
void attributeRemoved(HttpSessionBindingEvent se) :通知属性已从会话中移除。在移除属性之后调用;
void attributeReplaced(HttpSessionBindingEvent se) : 通知已替换会话中的一个属性。在替换属性之后调用。
HttpSessionBindingListener: 使对象在被绑定到会话或从会话中取消对它的绑定时得到通知。该对象通过 HttpSessionBindingEvent 对象得到通知。这可能是 servlet 编程人员显式从会话中取消绑定某个属性的结果(由于会话无效,或者由于会话超时)。
定义有下面方法:
void valueBound(HttpSessionBindingEvent event) :通知对象它将被绑定到某个会话并标识该会话;
void valueUnbound(HttpSessionBindingEvent event) :通知对象要从某个会话中取消对它的绑定并标识该会话。
HttpSessionListener: 对 Web 应用程序中活动会话列表的更改将通知此接口的实现。要接收通知事件,必须在 Web 应用程序的部署描述符中配置实现类。
定义有下面方法:
void sessionCreated(HttpSessionEvent se) : 通知创建了一个会话;
void sessionDestroyed(HttpSessionEvent se) : 通知某个会话即将无效。
HttpSession相关监听器中,HttpSessionListener最为常用,同时也是所有监听器中最常用的一个。由于Session标识了客户端的信息,通过对session的创建和销毁事件的统计,可以很容易地实现web应用中在线人数的统计。结合cookie技术,我们就可以实现应用系统的单点登录,并据此来实现系统授权数量的限制功能。