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. OOP1(定义基类和派生类)

    面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类 ...

  2. 使用python-docx生成Word文档

    首先是安装python-docx:(centos环境) pip install python-docx 基本方法使用: from docx import Document from docx.shar ...

  3. 【BZOJ2159】Crash的文明世界 斯特林数+树形dp

    Description Crash 小朋友最近迷上了一款游戏--文明5(Civilization V).在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家.现 ...

  4. P2925 [USACO08DEC]干草出售Hay For Sale 题解

    \(\Huge{dp第一题}\) 题目描述 农民john面临一个很可怕的事实,因为防范失措他存储的所有稻草给澳大利亚蟑螂吃光了,他将面临没有稻草喂养奶牛的局面.在奶牛断粮之前,john拉着他的马车到农 ...

  5. 《Andrew Ng深度学习》笔记3

    浅层神经网络 初步了解了神经网络是如何构成的,输入+隐藏层+输出层.一般从输入层计算为层0,在真正计算神经网络的层数时不算输入层.隐藏层实际就是一些算法封装成的黑盒子.在对神经网络训练的时候,就是对神 ...

  6. JS 对象的三种创建方式

    变量 instanceof 类型的名字----->布尔类型,true就是这种类型,false不是这种类型 在当前的对象的方法中,可以使用this关键字代表当前的对象   1.调用系统的构造函数创 ...

  7. mysql5.6 的st_distance 实现按照距离远近排序。

    当前所处在的位置(113.858202 , 22.583819 ),需要查询我附近1000米内的小区,并安装由近到远的顺序排列  SELECT s.id,s.name,s.lng,s.lat, rou ...

  8. MapReduce编写的正确姿势

    先看一下目录结构 这里是job接口,负责参数的传递和定时的调用 下面的图是MR 程序相关的目录图片,其中MR的入口程序负责读取数据,并指定对应的Map.Reduce程序. 程序的流程 首先简单的说一下 ...

  9. day--43 HTML标签和CSS基本小结

    HTML标签和CSS基本小结一:常用标签 01:块标签 p,h1--h6 ,hr ,div 02:内联标签 b,i,u,s 小提示:块标签可以嵌套内置元素或者某些块级元素,但内联元素不能包含块级元素 ...

  10. tornado 01 路由、输入与输出

    tornado 01 路由.输入与输出 一.安装tornado pyvip@Vip:~$ workon py3env #安装python3的虚拟环境 (py3env) pyvip@Vip:~$ pip ...