永无止境的程序

..::[......]::..

导航

[译]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。
        下面的一些元素展示了如何指定压缩过滤器需要的元素。你为过滤器提供一个名字,实现过滤器的类,还有初始化参数名字和值,通过这些来定义压缩过滤器。

           <filter>
           
<filter-name>Compression Filter</filter-name>
           
<filter-class>CompressionFilter</filter-class>
           
<init-param>
                  
<param-name>compressionThreshold</param-name>
                  
<param-value>10</param-value>
           
</init-param>
        
</filter>

        filter-mapping元素将压缩过滤器映射到CompressionTest Servlet。这个映射同样也指定了URL表达式”/CompressionTest“。注意”filter“, ”filter-mapping“, ”servlet“, 和 ”servlet-mapping“必须按照下面的顺序出现在Web应用部署描述符中。

        <filter-mapping>
           
<filter-name>Compression Filter</filter-name>
           
<servlet-name>CompressionTest</servlet-name>
        
</filter-mapping>
        
<servlet>
           
<servlet-name>CompressionTest</servlet-name>
           
<servlet-class>CompressionTest</servlet-class>
        
</servlet>
        
<servlet-mapping>
           
<servlet-name>CompressionTest</servlet-name>
           
<url-pattern>/CompressionTest</url-pattern>
        
</servlet-mapping>

        要注意映射使得在所有对CompressionTest Servlet发出请求的时候,和对任何映射到URL表达式”/CompressionTest“的JSP或者静态网页的发出请求的时候,过滤器被调用。

        如果你想要为所有的对Web应用程序的请求做日志的话,你可以将点击计数器的过滤器映射到URL表达式”/*“。
        这里是和例子一同分发的部署描述符:

        ?xml version="1.0" encoding="ISO-8859-1"?>
        
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web 
                Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"
>
        
<web-app>
           
<filter>
                  
<filter-name>XSLTFilter</filter-name>
                  
<filter-class>XSLTFilter</filter-class>
           
</filter>
           
<filter>
                  
<filter-name>HitCounterFilter</filter-name>
                  
<filter-class>HitCounterFilter</filter-class>
           
</filter>
           
<filter-mapping>
                  
<filter-name>HitCounterFilter</filter-name>
                  
<url-pattern>/*</url-pattern>
           
</filter-mapping>  
           
<filter-mapping>
                  
<filter-name>XSLTFilter</filter-name>
                  
<servlet-name>FilteredFileServlet</servlet-name>
           
</filter-mapping>  
           
<servlet>
                  
<servlet-name>FilteredFileServlet</servlet-name>
                  
<servlet-class>FileServlet</servlet-class>
           
</servlet>
           
<servlet-mapping>
                  
<servlet-name>FilteredFileServlet</servlet-name>
                  
<url-pattern>/ffs</url-pattern>
           
</servlet-mapping>
        
</web-app>


        正如你看到的,你可以你可以将一个过滤器映射到一个或多个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

(完)

posted on 2004-12-13 22:44  AlleNny  阅读(594)  评论(0编辑  收藏  举报