扩展过滤器是做什么的?
一些 MyFaces 组件在页面中包含的比一些HTML更多一些.它们可能需要附加的支持脚本,样式表,图片...
那些资源文件都包含在MyFaces的jar包文件里 ,扩展过滤器添加代码和URL所需要提供的那些资源文件到生成的HTML.
一些其它组件,像文件上传组件(t:inputFileUpload)需要解析 Multipart 请求.
扩展过滤器也就处理这个.
为什么这是有用的?
这样设计有几个好处:
它提供了一个MyFaces组件和你的 web程序彻底分离.
你不需要包含附加的MyFaces组件相关的代码和资源文件到你的页面和web程序.
它提供了易用性,使得MyFaces团队可以更新他们的组件并保持清晰的相后 兼容性.
它使在页面开发中复杂组件 使用多个支持的资源文件而没有任何负担成为可能.
它仅为渲染组件加载有用的资源文件.
它处理MyFaces资源文件的缓存.
它如何工作?
当一个组件需要一个资源文件,它会调用一个org.apache.myfaces.component.html.util.AddResource的方法(例如 AddResource.addJavaScriptToHeader(InputHtmlRenderer.class, "sarissa.js", context); ).
AddResource方法添加一个属性到请求使过滤器被提醒为你的 JSF页面包含特定的javascript, 样式表, 或者资源链接到生成的HTML中.
一个深入的资源文件URL以/faces/myFacesExtensionResource开始,所以当客户端需要加载这个资源文件时它可以被拦截.
当客户端索取资源时,过滤器解码URL,然后从MyFaces的jar包文件服务适当的资源文件.
如何配置它?
在web.xml文件中, 为你JSF页面映射过滤器到路径(最 常用的像 .jsf),来使过滤器可以在你的JSF页面更新资源文件, 然后映射过滤器到/faces/myFacesExtensionResource/ 路径,来使它服务页面需要的资源文件,如 图片,javascript文件, 样式表. 这是一个扩展过滤器的配置的 例子:
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>20m</param-value>
<description>Set the size limit for uploaded files.
Format: 10 - 10 bytes
10k - 10 KB
10m - 10 MB
1g - 1 GB
</description>
</init-param>
</filter>
<!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.) -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
另外使用url-pattern映射代替servlet-name(你仍然也需要/faces/myFacesExtensionResource/*映射):
<!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
在什么情况下需要使用扩展过滤器?
如果你仅使用标准的JSF组件,但不使用MyFaces扩展组件(以t:开始的) , 那么你不需要扩展过滤器.
然而,倘若你使用一些MyFaces的扩展组件,像t:inputFileUpload, t:inputHtml, t:inputCalendar,等,那么你大部分情况下可能需要在你的web程序中有这个过滤器配置.
这影响效率吗?
这个过滤器对响应时间没有任何重大影响.
然而在把它写到客户端前必须缓存整个响应,所以它会稍微更加内存的使用.
一些 MyFaces 组件在页面中包含的比一些HTML更多一些.它们可能需要附加的支持脚本,样式表,图片...
那些资源文件都包含在MyFaces的jar包文件里 ,扩展过滤器添加代码和URL所需要提供的那些资源文件到生成的HTML.
一些其它组件,像文件上传组件(t:inputFileUpload)需要解析 Multipart 请求.
扩展过滤器也就处理这个.
为什么这是有用的?
这样设计有几个好处:
它提供了一个MyFaces组件和你的 web程序彻底分离.
你不需要包含附加的MyFaces组件相关的代码和资源文件到你的页面和web程序.
它提供了易用性,使得MyFaces团队可以更新他们的组件并保持清晰的相后 兼容性.
它使在页面开发中复杂组件 使用多个支持的资源文件而没有任何负担成为可能.
它仅为渲染组件加载有用的资源文件.
它处理MyFaces资源文件的缓存.
它如何工作?
当一个组件需要一个资源文件,它会调用一个org.apache.myfaces.component.html.util.AddResource的方法(例如 AddResource.addJavaScriptToHeader(InputHtmlRenderer.class, "sarissa.js", context); ).
AddResource方法添加一个属性到请求使过滤器被提醒为你的 JSF页面包含特定的javascript, 样式表, 或者资源链接到生成的HTML中.
一个深入的资源文件URL以/faces/myFacesExtensionResource开始,所以当客户端需要加载这个资源文件时它可以被拦截.
当客户端索取资源时,过滤器解码URL,然后从MyFaces的jar包文件服务适当的资源文件.
如何配置它?
在web.xml文件中, 为你JSF页面映射过滤器到路径(最 常用的像 .jsf),来使过滤器可以在你的JSF页面更新资源文件, 然后映射过滤器到/faces/myFacesExtensionResource/ 路径,来使它服务页面需要的资源文件,如 图片,javascript文件, 样式表. 这是一个扩展过滤器的配置的 例子:
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>20m</param-value>
<description>Set the size limit for uploaded files.
Format: 10 - 10 bytes
10k - 10 KB
10m - 10 MB
1g - 1 GB
</description>
</init-param>
</filter>
<!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.) -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
另外使用url-pattern映射代替servlet-name(你仍然也需要/faces/myFacesExtensionResource/*映射):
<!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
在什么情况下需要使用扩展过滤器?
如果你仅使用标准的JSF组件,但不使用MyFaces扩展组件(以t:开始的) , 那么你不需要扩展过滤器.
然而,倘若你使用一些MyFaces的扩展组件,像t:inputFileUpload, t:inputHtml, t:inputCalendar,等,那么你大部分情况下可能需要在你的web程序中有这个过滤器配置.
这影响效率吗?
这个过滤器对响应时间没有任何重大影响.
然而在把它写到客户端前必须缓存整个响应,所以它会稍微更加内存的使用.