[译]The Essentials of Filters (III)
原文:http://java.sun.com/products/servlet/Filters.html
配置过滤器:
现在我们已经看到了如何编写一个过滤器,最后一步是指定一个Web组件或一组Web组件如何应用过滤器。为了映射过滤器到Servlet你要:
● 在Web应用部署描述符(web.xml)中用<filter>元素来声明过滤器。这个元素为过滤器创建名称,声明实现过滤器的类和初始化参数。
● 通过在部署描述符中定义一个<filter-mapping>元素将过滤器映射到Servlet。这个元素将过滤器通过Servlet的名字或者URL的表达式映射到Servlet。
下面的一些元素展示了如何指定压缩过滤器需要的元素。你为过滤器提供一个名字,实现过滤器的类,还有初始化参数名字和值,通过这些来定义压缩过滤器。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
filter-mapping元素将压缩过滤器映射到CompressionTest Servlet。这个映射同样也指定了URL表达式”/CompressionTest“。注意”filter“, ”filter-mapping“, ”servlet“, 和 ”servlet-mapping“必须按照下面的顺序出现在Web应用部署描述符中。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
要注意映射使得在所有对CompressionTest Servlet发出请求的时候,和对任何映射到URL表达式”/CompressionTest“的JSP或者静态网页的发出请求的时候,过滤器被调用。
如果你想要为所有的对Web应用程序的请求做日志的话,你可以将点击计数器的过滤器映射到URL表达式”/*“。
这里是和例子一同分发的部署描述符:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
正如你看到的,你可以你可以将一个过滤器映射到一个或多个Serlvet,也可以将多个过滤器映射到一个Servlet。图一中的例子说明了这一点,过滤器F1被映射到Servlet S1,S2,和S3,过滤器F2被映射到Servlet S2,过滤器F3被映射到Servlet S1和S2。
图一:映射Servlet的过滤器
回忆一下,一个过滤器链是传递给过滤器的doFilter方法的诸多对象中的一个。这个链是通过过滤器映射间接的形成的。在这个链中过滤器的顺序同Web应用部署描述符中出现的过滤器映射的顺序是一样的。
当一个URL被映射到Servlet S1的时候,Web容器调用F1的doFilter方法。在S1的过滤器链中的每个过滤器的doFilter方法的都是通过前面的过滤器调用chan.doFilter方法而被调用的。由于Servlet S1的过滤器链包含过滤器F1和F3,F1对chain.doFilter的调用执行过滤器F3的doFilter方法。当F3的doFilter方法完成时,控制器返回到F1的doFilter方法。
部署描述符只是描述了将点击计数器和XSLT过滤器放到FilteredFileServlet过滤器链中。无论何时FilteredFileServlet被访问,点击计数器过滤器记录访问日志,但是只有在Response的类型为“HTML”的时候,过滤器在XSLT转换之后把计数器值插入到Response里。
结论:
过滤器机制提供了一种在组件中封装通用功能的方法,这种组件是可以在许多不同Context中重用的。过滤器易于编写和配置也具有可移植性和可重用性。总的来说,过滤器是一个Web开发者工具箱里的必备工具。
感谢:
字符编码过滤器是Sun Microsystems的Craig McClanahan开发的,压缩过滤器是Sun Microsystems的Amy Roh开发的,还有XSLT过滤器是National Processing 公司的Alan Canon开发的。
资源:
你可以通过下载Tomcat4.0得到字符编码过滤器和压缩过滤器。字符编码过滤器位于TOMCAT_HOME/webapps/examples/WEB-INF/classes/filters 目录。压缩过滤器位于TOMCAT_HOME/webapps/examples/WEB-INF/classes/compressionFilters目录。你可以从这里(http://java.sun.com/products/servlet/filters.zip)下载一个包含文中提到的其他过滤器的zip文件。编译和运行XSLT过滤器,你需要从http://java.sun.com/xml/download.html获得一个XML解析器和转换器引擎。
想要得到更多的关于文中描述的此类技术的资料,访问以下资源。
http://java.sun.com/products/servlet
http://www.w3.org/XML
http://www.w3.org/Style/XSL
http://java.sun.com/xml
(完)