Servlet 中的 Listener

/ JavaWeb / 220浏览

在整个Tomcat服务器中,Listener使用的非常广泛,它是基于观察者模式设计的,Listener设计为Servlet应用程序提供了一种快捷的手段,能够方便地从另一个纵向维度来控制程序和数据。

概述

目前在Servlet中提供了6种观察者接口,按分类来划分:他们分别是:

类型接口
EventListeners类型ServletContextAttributeListener
ServletRequestAttributeListener
ServletRequestListener
HttpSessionAttributeListener
LifecycleListeners类型ServletContextListener
HttpSessionListener

实际上,这6个Listener都继承了EventListener接口,每个Listener接口各自定义了需要实现的接口方法。如下图所示: alt

Listener 实现方法说明

ServletContextAttributeListener

接口方法说明
attributeAdded(ServletContextAttributeEvent var1)调用servletContext.setAttribute方式时触发
attributeRemoved(ServletContextAttributeEvent var1)调用servletContext.removeAttribute方法时触发
attributeReplaced(ServletContextAttributeEvent var1)如果在调用servletContext.setAttribute之前该
attribute已经存在,则替换这个 attribute 时触发

ServletRequestAttributeListener

接口方法说明
attributeAdded(ServletRequestAttributeEvent var1)调用request.setAttribute方法时触发
attributeRemoved(ServletRequestAttributeEvent var1)调用request.removeAttribute方法时触发
attributeReplaced(ServletRequestAttributeEvent var1)如果调用request.setAttribute方法之前该attribute
已存在,则替换这个attribute时触发

ServletRequestListener

接口方法说明
requestInitialized(ServletRequestEvent var1)当HttpServletRequest对象被传递到用户的Servlet的
service() 方法之前被触发
requestDestroyed(ServletRequestEvent var1)当HttpServletRequest对象在调用完用户的Servlet的
service() 方法之后被触发

HttpSessionAttributeListener

接口方法说明
attributeAdded(HttpSessionBindingEvent var1)调用 session.setAttribute 方法时触发
attributeRemoved(HttpSessionBindingEvent var1)调用sessoin.remoteAttribute 方法时触发
attributeReplaced(HttpSessionBindingEvent var1)如果调用session.setAttribute方法之前 attribute 已存
在,则替换这个 attribute 时被触发

ServletContextListener

接口方法说明
contextInitialized(ServletContextEvent var1)Context容器初始化时触发,在所有的Filter和Servlet的init()
方法调用之前该方法先被调用
contextDestroyed(ServletContextEvent var1)Context容器销毁时触发,在所有的Filter 和 Servlet 的
destroy() 方法调用之后该方法被调用

HttpSessionListener

接口方法说明
sessionCreated(HttpSessionEvent var1)当一个session对象被创建时触发
sessionDestroyed(HttpSessionEvent var1)当一个session对象被失效时触发

总结

它们基本上涵盖了整个Servlet声明周期中你感兴趣的每种事件。这些Listener的实现类可以配置在web.xml的标签中。当然也可以在应用程序中动态添加Listener,需要注意的是ServletContextListener在容器启动之后就不能再添加新的了,因为它所监听的事件已经不会再出现了。

掌握好 Listener 的各种方法,可以让应用程序设计更加灵活。