当我在JSF 2中浏览自定义资源处理程序时,我看到了无所不在的UnmappedResourceHandler。这是在这帖子之后的Omnifaces中添加的。
我注意到,与Omnifaces提供的另外两个ResourceHandlers不同的是,Omnifaces提供了另外两个。CDNResourceHandler和CombinedResourceHandler,这里需要JSF前缀模式的附加映射:
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>我不是JSF方面的专家,但我很想知道为什么只需要这种类型,而不需要其他两种呢?
发布于 2014-08-16 20:41:37
JSF资源也需要由FacesServlet提供。它负责在/resources文件夹中找到正确的文件,并与适当的缓存头一起重放。如果从资源URL中删除.xhtml扩展(或/faces路径),则该URL将不再与FacesServlet的URL模式匹配,因此不会调用FacesServlet,也无法完成为资源服务的工作。您只会得到一个404未找到的错误回来,因为“原始”资源URL不匹配的公共网页内容文件夹结构。
UnmappedResourceHandler利用了JSF具有由ResourceHandler.RESOURCE_IDENTIFIER标识的公共前缀路径/javax.faces.resource这一事实。因此,为了调用FacesServlet,即使没有.xhtml扩展(或/faces路径),也只需将/javax.faces.resource/* URL模式添加到映射中即可。
CDNResourceHandler不需要更改映射,因为它无论如何不会生成JSF资源URL,但是真正的CDN,比如指向jQuery或Google主机的URL。无论如何,这些URL都不会(需要)访问FacesServlet。
CombinedResourceHandler只生成默认的JSF资源URL,带有.xhtml扩展(或/faces路径)。它只使用一个特殊的library名称omnifaces.combined,以便CombinedResourceHandler能够识别它们。
https://stackoverflow.com/questions/25341077
复制相似问题