1

当我遇到omnifaces的UnmappedResourceHandler 时,我正在浏览JSF 2 中的自定义资源处理程序。这是在这篇文章之后添加到 Omnifaces 中的。

我注意到与 Omnifaces 提供的其他两个 ResourceHandler 不同,即。CDNResourceHandler并且CombinedResourceHandler,这需要 JSF 资源 URL 前缀模式的附加映射:

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

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

4

1 回答 1

1

JSF 资源也需要由FacesServlet. 它负责在/resources文件夹中找到正确的文件并将其与适当的缓存标头一起返回。如果您从资源 URL 中删除.xhtml扩展名(或/faces路径),则该 URL 将不再FacesServletFacesServlet您只会收到 404 Not Found 错误,因为“原始”资源 URL 与公共 webcontent 文件夹结构不匹配。

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

CDNResourceHandler不需要更改映射,因为它不会生成 JSF 资源 URL,而是生成真正的 CDN URL,例如指向 jQuery 或 Google CDN 主机的 URL 。无论如何,这些 URL 不会(需要)命中FacesServlet

只生成默认的CombinedResourceHandlerJSF 资源 URL,带有.xhtml扩展名(或/faces路径)。它只使用一个特殊library的名称omnifaces.combined,以便CombinedResourceHandler可以识别它们。

于 2014-08-16T20:41:37.223 回答