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

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

  1. Listener监听器与Filter过滤器

    1.Listener     [1]监听器简介         > Listener是JavaWeb的三大组件之一,Servlet.Filter.Listener         > Li ...

  2. Listener监听器和Filter过滤器

    Listener监听器 WEB中的监听器 WEB 中的 Listener 和 Filter 是属于 Servlet 规范中的高级的技术.WEB中的监听器共有三类八种(监听三个域对象)* 事件源:Ser ...

  3. Servlet之Listener监听器

    Servlet2.5规范共有8中Listener接口,6种Event类型 ServletContextListener接口 [接口方法] contextInitialized()与 contextDe ...

  4. EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统

    EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...

  5. Java中Filter、Servlet、Listener的学习

    1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个reques ...

  6. 转 Java中Filter、Servlet、Listener的学习

      1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个requ ...

  7. spring boot中使用servlet、listener和filter

    spring boot中支持使用java Web三大组件(servlet.listener和filter),但是坑比较多,主要是spring boot内嵌tomcat和独立tomcat服务器有一些细节 ...

  8. [web]Servlet中的Listener和Filter

    建议先看看 ——> Servlet工作原理 一.Listener 在Tomcat服务中,Listener的设计是基于观察者模式的,目前在Servlet中提供6中两类事件的观察者接口,它们分别是: ...

  9. Servlet、Listener和Filter

    Servlet: Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式 ...

随机推荐

  1. 190320运算符&数据类型

    一.运算符 1.算术运算符 + 加 - 减 * 乘 / 除 ** 平方 // 整除 % 取余 2.比较运算符 == 等于 > 大于 < 小于 <= 小于等于 >= 大于等于 ! ...

  2. SDUT OJ 数据结构实验之链表五:单链表的拆分

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  3. 重写成员“MySql.Data.Entity.MySqlConnectionFactory.CreateConnection(System.String)”时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。

      1,程序中使用加载反射出现下面的问题: 无法加载一个或多个请求的类型.有关更多信息,请检索 LoaderExceptions 属性. 然后把代码改了一下, try { types.AddRange ...

  4. ML理论知识博文列表

    一文弄懂神经网络中的反向传播法——BackPropagation:http://www.cnblogs.com/charlotte77/p/5629865.html 人脸识别图库:http://vis ...

  5. Query on a tree 树链剖分 [模板]

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  6. TX2 上使用opencv 调用板载mipi摄像头

    使用命令测试 gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, fo ...

  7. Haproxy配置之URL重写,支持websocket

    配置文件位置:/etc/haproxy/haproxy.cfg Reqrep 正则重写 配置详情: Frontend App *: acl uri_api path_beg /api/ acl uri ...

  8. redis锁

    1.引入依赖: <!--使用redis客户端需要用到的包 --> <dependency> <groupId>redis.clients</groupId&g ...

  9. CentOS 7 基础网络管理

    网络服务管理 network服务是对整个计算机网络服务的控制,也可以理解为控制所有网卡. [root@localhost ~]# systemctl start network //开启网络服务 [r ...

  10. 【算法笔记】B1026 程序运行时间

    1026 程序运行时间 (15 分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗 ...