您的位置:首页 > Web前端 > JavaScript

Head First Servlets&Jsp 读书摘记11——【过滤器的威力】

2010-07-03 22:59 519 查看
接近尾声,还来点实用的技术活儿——过滤器的威力!

124、与servlet非常类似,过滤器就是Java组件,请求发送到servlet之前,可以用过滤器截获和处理请求,另外servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应。(P672);

125、过滤器是模块化的,而且可以在DD中配置,容器根据DD中声明来确定何时调用过滤器。(P672~673);

126、过滤器不知道谁来调用它们,也不知道过滤器链中下一个是谁!(675);

127、过滤器的生命周期:

首先要有一个init();

真正的工作在doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain)中完成;

最后来个destroy()。

128、过滤器可以应用于直接来自客户的请求,这当然很棒。但是如果请求来自转发或包含、请求分派和/或错误处理器呢?

Servlet规范2.4提供了解决办法。(P679);

129、过滤器声明规则:

1)必须要有<filter-name>;

2)必须要有<url-pattern>或<servlet-name>元素其中之一;

3)可以有0~4个<dispatcher>元素;

4)REQUEST值表示对客户请求启用过滤器。如果没有指定<dispatcher>元素,则默认为REQUEST;

5)INCLUDE值表示对由一个include()调用分派来的请求启用过滤器;

6)FORWARD值表示对由一个forward()调用分派来的请求启动过滤器;

7)ERROR值表示对错误处理器调用的资源启动过滤器。

(P679too);

130、Rachel这样介绍doFilter()方法中代码的基本结构——首先,完成与请求相关的工作,然后调用chain.doFilter(),最后,当Servlet(以及链中当前过滤器之后的所有其他过滤器)工作结束,而且控制返回到原先的doFilter()方法时,可以对响应在做点工作。(P682);

131、

public void doFilter(request, response, chain){

//请求处理放在这里

chain.doFilter(request, response);

//这里完成压缩逻辑

}

chain.doFilter()调用返回,过滤器希望拿到输出,并开始处理点什么……不过,已经太晚了!输出已经发送给客户!容器并没有为过滤器把输出缓存起来。等到过滤器自己的doFilter()方法至于(概念)栈的栈顶时,过滤器再想影响输出已为时已晚。

(P683);

132、建立一个自己的响应实现,并把它通过chain.doFilter()调用传递到Servlet。而且这个定制响应实现还必须包含一个定制的输出流(处理),因为这是我们的目标,在Servlet写输出之后并且在输出返回给客户之前,过滤器就能拿到这个输出。(P685, 689);



133、包装器包装了实际的请求或响应对象,而且调用委托给(传给)实际的对象,还允许你对定制请求或响应做所需的额外处理。(P687);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: