Servlet中listener和filter的总结
转载
Listener我是这样理解他的,他是一种观察者模式的实现:我们在web.xml中配置listener的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作出相应的反应。在jsp/servlet中具体的实现是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类。
总体上说servlet中有主要有3类事件既:Servlet上下文事件、会话事件与请求事件总共有8个listener(部分内容转载于http://ritaleo.javaeye.com/blog/48751)接口,我们在web.xml中注册时对应上自己对相应接口的实现类即可:
Servlet中的Listener和Event:
1. 在JSP 2.0/Servlet 2.4中,共有八个Listener接口,六个Event类别。 ServletContextListener接口 [接口方法] contextInitialized()与 contextDestroyed() [接收事件] ServletContextEvent [触发场景] 在Container加载Web应用程序时(例如启动 Container之后),会呼叫contextInitialized(),而当容器移除Web应用程序时,会呼叫contextDestroyed ()方法。2. ServletContextAttributeListener [接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved() [接收事件] ServletContextAttributeEvent [触发场景] 若有对象加入为application(ServletContext)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、attributeRemoved()。3. HttpSessionListener [接口方法] sessionCreated()与sessionDestroyed () [接收事件] HttpSessionEvent [触发场景] 在session (HttpSession)对象建立或被消灭时,会分别呼叫这两个方法。4. HttpSessionAttributeListener [接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved() [接收事件] HttpSessionBindingEvent [触发场景] 若有对象加入为session(HttpSession)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、 attributeRemoved()。5. HttpSessionActivationListener [接口方法] sessionDidActivate()与 sessionWillPassivate() [接收事件] HttpSessionEvent [触发场景] Activate与Passivate是用于置换对象的动作,当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透 过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以容 易理解的,sessionDidActivate()与 sessionWillPassivate()分别于Activeate后与将Passivate前呼叫。6. ServletRequestListener [接口方法] requestInitialized()与 requestDestroyed() [接收事件] RequestEvent [触发场景] 在request(HttpServletRequest)对象建立或被消灭时,会分别呼叫这两个方法。7. ServletRequestAttributeListener [接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved() [接收事件] HttpSessionBindingEvent [触发场景] 若有对象加入为request(HttpServletRequest)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、 attributeRemoved()。8. HttpSessionBindingListener [接口方法] valueBound()与valueUnbound() [接收事件] HttpSessionBindingEvent [触发场景] 实现HttpSessionBindingListener接口的类别,其实例如果被加入至session(HttpSession)对象的属性中,则会 呼叫valueBound(),如果被从session(HttpSession)对象的属性中移除,则会呼叫valueUnbound(),实现 HttpSessionBindingListener接口的类别不需在web.xml中设定。具体使用方法:在web.xml中添加如下语句:< listener > < listener-class > com.servlet.listener.YouAchieveListener < \listener-class >< \listener >其中YouAchieveListener 为你实现的某个Listener接口的实现类com.servlet.listener.为你的包名。
public class LogFilter implements Filter { FilterConfig config; public void setFilterConfig(FilterConfig config) { this.config = config; } public FilterConfig getFilterConfig() { return config; } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { ServletContext context = getFilterConfig().getServletContext(); long bef = System.currentTimeMillis(); chain.doFilter(req, res); // no chain parameter needed here long aft = System.currentTimeMillis(); context.log("Request to " + req.getRequestURI() + ": " + (aft-bef)); } } <filter> <filter-name> log //filter 名字 </filter-name> <filter-class> LogFilter //filter class(上例的servlet) </filter-class> </filter> <filter-mapping> <filter-name>log</filter-name> <servletname>servletname</servlet-name> </filter-mapping> <servlet> <servlet-name>servletname</servletname> <servletclass>servletclass</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletname</servlet-name> <url-pattern>*</url-pattern> </servlet-mapping>