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. shell-脚本-作用是发现前10个最占用磁盘空间的文件

    #!/bin/bash## 这个脚本的作用是发现前10个最占用磁盘空间的文件################定义这个脚本的全区变量##################################C ...

  2. 洛谷P4494 [HAOI2018]反色游戏(tarjan)

    题面 传送门 题解 我们先来考虑一个联通块,这些关系显然可以写成一个异或方程组的形式,形如\(\oplus_{e\in edge_u}x_e=col_u\) 如果这个联通块的黑色点个数为奇数,那么显然 ...

  3. The server of Apache (二)——apache服务客户端验证

    一.确定网站名称.IP地址 地址为: 192.168.1.1   域名为: www.benet.com 二.配置可用的DNS域名服务或者修改本地hosts记录 ~] # vim /etc/hosts ...

  4. 一个很棒的PHP缓存类,收藏下

    <?php class Cache { /** 缓存目录 **/ var $CacheDir = './cache'; /** 缓存的文件 **/ var $CacheFile = ''; /* ...

  5. 5、用Numpy实现结构体

    1.结构数组: 在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地定义结构数组.和C语言一样,在NumPy中也很容易 ...

  6. windows xp 环境下 Oracle8i 双击安装文件无反应的解决办法

    今天调试一份比较老的程序,数据库用的是Oracle8i,在本地xp系统上搞了半天,双击安装文件就是没反应! 在网上整理了一下解决办法: 1.将ORACLE软件拷贝到硬盘. (比如我拷贝到:F:\Ora ...

  7. A Simple Math Problem(矩阵快速幂)----------------------蓝桥备战系列

    Lele now is thinking about a simple function f(x).  If x < 10 f(x) = x.  If x >= 10 f(x) = a0 ...

  8. C - 思考使用差分简化区间操作

    FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positi ...

  9. Qt随笔 - QSettings

    QSettings类提供了持久的跨平台应用程序设置. 嗯,一句话概括QSettings-- 创建 来看一下原型: QSettings::QSettings(const QString &org ...

  10. Aop之使用Castle动态代理实现对方法的拦截

    using System; using System.Linq; using Castle.DynamicProxy; namespace AopTest { class AopTest { stat ...