当我遇到{ommifaces UnmappedResourceHandler时,我正在浏览JSF 2中的自定义资源处理程序。这是在this发布后在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的专家,但我很想知道为什么只需要这种类型而不是其他两种?
答案 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
可以识别它们。