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 . 为你的包名。

Filter : Filter 技术是 servlet 2.3 新增加的功能 . (以下部分类容转载于http://www.programfan.com/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 被调用之后截获 .

Filter 和 servlet 的对应关系为多对多的关系 ,也就是说你可以配置一个 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 已经终结 . 
每一个 filter 从 doFilter() 方法中得到当前的 request 及 response. 在这个方法里 , 可以进行任何的针对 request 及response 的操作 .( 包括收集数据 , 包装数据等 ).filter 调用 chain.doFilter() 方法把控制权交给下一个 filter. 一个filter 在 doFilter() 方法中结束 . 如果一个 filter 想停止 request 处理而获得对 response 的完全的控制 , 那它可以不调用下 一个 filter. 
一个 filter 可以包装 request 或 response 以改变几个方法和提供用户定制的属性 .Api2.3 提供了HttpServletRequestWrapper 和 HttpServletResponseWrapper 来实现 . 它们能分派最初的 request 和 response.如果要改变一个方法的特性 , 必须继 承 wapper 和重写方法 . 下面是一段简单的日志 filter 用来记录所有 request 的持续时间 .

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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 为例 :

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<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>

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

原出处:http://my.oschina.net/ydsakyclguozi/blog/398403

时间: 2024-10-03 23:20:21

Servlet中listener(监听器)和filter的总结的相关文章

Listener监听器与Filter过滤器

1.Listener [1]监听器简介 > Listener是JavaWeb的三大组件之一,Servlet.Filter.Listener > Listener翻译过来就是监听器 > 现实生活中的监听器: - 监听谁:明星 - 监听器:朝阳群众 - 监听事件:干坏事 - 回调函数:报警 > JavaWeb中的监听器: - 监听谁:ServletContext.HttpSession.ServletRequest - 监听器:自己写 - 监听的事件:生命周期.属性的变化 - 回调函数

Servlet之Listener监听器

Servlet2.5规范共有8中Listener接口,6种Event类型 ServletContextListener接口 [接口方法] contextInitialized()与 contextDestroyed() [接收事件] ServletContextEvent [触发场景] 在Container加载Web应用程序时(例如启动Container之后),会呼叫contextInitialized(),而当容器移除Web应用程序时,会呼叫contextDestroyed ()方法. Ser

转 Java中Filter、Servlet、Listener的学习

1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查serv

Java中Filter、Servlet、Listener的学习

1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查serv

Java中Filter、Servlet、Listener的学习 (转)

1.Filter的功能 filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查ser

Servlet中的listener

JSP/Servlet 中的事件处理写过AWT或Swing程序的人一定对桌面程序的事件处理机制印象深刻:通过实现Listener接口的类可以在特定事件(Event)发生时,呼叫特定的方法来对事件进行响应. 其实我们在编写JSP/Servle程序时,也有类似的事件处理机制,所不同的是在JSP/Servlet中是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类. 1. Servlet中的Listener和Event: 在JSP 2.0/S

java中的监听器(listener)

监听器在java应用中比较广泛,记得web启动的时候的监听器吗,记得spring配置中的监听器吗?,记得消息传输中的监听器吗? 没错,这就是listener的应用,无处不在,身为一个java程序员,你如果不懂的监听器的原理是不是很可悲啊,没错我感觉挺可悲的(因为我刚刚才了解到监听器的工作原理), 为了纪念自己取得的一点小小的success,写篇博文记录一下自己的一些不成熟的意见和理解 监听器,就我理解就和我们日常生活中的原始概念一样,就是监听事物的一些行为.举个例子,抗战时期,发现一个国民党特务

Servlet中的Filter怎么使用?

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过F

Servlet过滤器和监听器知识总结(转)

 Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤.判断用户的登录状态.过滤器使得Servlet开发者能够在客户端请求到达 Servlet资源之前被截获,在处理之后再发送给被请求的Servlet资源,并且还可以截获响应,修改之后再发送给用户.而Servlet监听器可以  监听客户端发出的请求.服务器端的操作,通过监听器,可以自动激发一些操作,如监听在线人数.  Servlet过滤器简介绍      Servlet过滤器是在Java Servle