分享

Servlet中listener(监听器)和filter的总结

 天绝缘 2010-12-02

Servlet中listener(监听器)和filter的总结

文章分类:Java编程

Listener我是这样理解他的,他是一种观察者模式的实现:我们在web.xml中配置listener的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作出相应的反应。在jsp/servlet中具体的实现是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类。

 

总体上说servlet中有主要有3类事件既:Servlet上下文事件、会话事件与请求事件总共有8listener(部分类容转载于http://ritaleo./blog/48751)接口,我们在web.xml中注册时对应上自己对相应接口的实现类即可:

Servlet中的ListenerEvent:

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
[
触发场景] 若有对象加入为applicationServletContext)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()attributeRemoved()

3.         HttpSessionListener
[
接口方法] sessionCreated()sessionDestroyed ()
[
接收事件] HttpSessionEvent
[
触发场景] session HttpSession)对象建立或被消灭时,会分别呼叫这两个方法。

4.         HttpSessionAttributeListener
[
接口方法] attributeAdded() attributeReplaced()attributeRemoved()
[
接收事件] HttpSessionBindingEvent
[
触发场景] 若有对象加入为sessionHttpSession)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced() attributeRemoved()

5.         HttpSessionActivationListener
[
接口方法] sessionDidActivate() sessionWillPassivate()
[
接收事件] HttpSessionEvent
[
触发场景] ActivatePassivate是用于置换对象的动作,当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透 过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以容 易理解的,sessionDidActivate() sessionWillPassivate()分别于Activeate后与将Passivate前呼叫。

6.         ServletRequestListener
[
接口方法] requestInitialized() requestDestroyed()
[
接收事件] RequestEvent
[
触发场景] requestHttpServletRequest)对象建立或被消灭时,会分别呼叫这两个方法。

7.         ServletRequestAttributeListener
[
接口方法] attributeAdded() attributeReplaced()attributeRemoved()
[
接收事件] HttpSessionBindingEvent
[
触发场景] 若有对象加入为requestHttpServletRequest)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced() attributeRemoved()

8.         HttpSessionBindingListener
[
接口方法] valueBound()valueUnbound()
[
接收事件] HttpSessionBindingEvent
[
触发场景] 实现HttpSessionBindingListener接口的类别,其实例如果被加入至sessionHttpSession)对象的属性中,则会 呼叫 valueBound(),如果被从sessionHttpSession)对象的属性中移除,则会呼叫valueUnbound(),实现 HttpSessionBindingListener接口的类别不需在web.xml中设定。

 

具体使用方法:在web.xml中添加如下语句:

< listener
< listener-class > com.servlet.listener.YouAchieveListener  < \listener-class >

< \listener >

其中YouAchieveListener  为你实现的某个Listener接口的实现类com.servlet.listener.为你的包名。

 

FilterFilter 技术是servlet 2.3 新增加的功能.(以下部分类容转载于http://www./article/1836.html

Filter的使用户可以改变一 request或修改一个response Filter 不是一个servlet,它不能产生一个response,但是他能够在一个request到达servlet之前预先处理request,也可以在一个响应离开 servlet时处理response

一个filter 包括:
1.
servlet被调用之前截获;
2.
servlet被调用之前检查servlet request;
3.
根据需要修改request头和request数据;
4.
根据需要修改response头和response数据;
5.
servlet被调用之后截获.

Filterservlet的对应关系为多对多的关系 ,也就是说你可以配置一个filter 到一个或多个servlet;而一个servlet可以有多个filter。几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter.
一个filter必须实现javax.servlet.Filter接口并定义三个方法:
1.void setFilterConfig(FilterConfig config) //
设置filter 的配置对象;
2. FilterConfig getFilterConfig() //
返回filter的配置对象;
3. void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) //
执行filter 的工作.

服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结.
每一个filterdoFilter()方法中得到当前的requestresponse.在这个方法里,可以进行任何的针对request response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filterdoFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下 一个filter.
一个filter可以包装request response以改变几个方法和提供用户定制的属性.Api2.3提供了HttpServletRequestWrapper HttpServletResponseWrapper来实现.它们能分派最初的requestresponse.如果要改变一个方法的特性,必须继 wapper和重写方法.下面是一段简单的日志filter用来记录所有request的持续时间.
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));
}
}
server调用setFilterConfig(),filter保存config信息.doFilter()方法中通过config信息得到 servletContext.如果要运行这个filter,必须去配置到web.xml.tomcat4.01为例:
<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>

从上面的事例中可以看出,filterservlet是在web.xml中配置起来的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多