为什么UnmappedResourceHandler需要为JSF资源URL前缀模式进行servlet映射?

时间:2014-08-16 14:24:48

标签: servlets jsf-2 omnifaces unmappedresourcehandler

当我遇到{ommifaces UnmappedResourceHandler时,我正在浏览JSF 2中的自定义资源处理程序。这是在this发布后在Omnifaces中添加的。

我注意到,与Omnifaces提供的其他两个ResourceHandler不同。 CDNResourceHandlerCombinedResourceHandler,这需要和JSF资源URL前缀模式的其他映射:

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
    <url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>

我不是JSF的专家,但我很想知道为什么只需要这种类型而不是其他两种?

1 个答案:

答案 0 :(得分:1)

JSF资源也需要由FacesServlet提供。它是负责在/resources文件夹中找到正确文件并将其与适当的缓存标头一起撤回的人。如果您从资源网址中删除.xhtml扩展程序(或/faces路径),则该网址不再与FacesServlet的网址格式相匹配,因此{{1}不会被调用,也无法完成服务资源的工作。你只会得到404 Not Found错误,因为&#34; raw&#34;资源URL与公共webcontent文件夹结构不匹配。

FacesServlet利用了JSF资源网址具有公共前缀路径UnmappedResourceHandler的事实,由ResourceHandler.RESOURCE_IDENTIFIER标识。因此,为了无论如何都要调用/javax.faces.resource,即使没有FacesServlet扩展名(或.xhtml路径),您只需要将/faces网址格式添加到映射中。

/javax.faces.resource/*并不需要对映射进行更改,因为它无论如何都不会生成JSF资源URL,而是真正的CDN URL,例如指向jQuery或Google CDN主机的URL。无论如何,这些网址都不会(需要)点击CDNResourceHandler

FacesServlet只生成默认的JSF资源网址,其中包含CombinedResourceHandler个扩展名(或.xhtml路径)。它仅使用/faces的特殊library名称,以便omnifaces.combined可以识别它们。