Servlets 为什么UnmappedResourceHandler需要JSF资源URL前缀模式的servlet映射?
我在浏览JSF2中的自定义资源处理程序时,遇到了omnifaces。这是在发布后的Omnifaces中添加的 我注意到,与Omnifaces提供的其他两个ResourceHandler不同,Omnifaces提供了vizServlets 为什么UnmappedResourceHandler需要JSF资源URL前缀模式的servlet映射?,servlets,jsf-2,omnifaces,unmappedresourcehandler,Servlets,Jsf 2,Omnifaces,Unmappedresourcehandler,我在浏览JSF2中的自定义资源处理程序时,遇到了omnifaces。这是在发布后的Omnifaces中添加的 我注意到,与Omnifaces提供的其他两个ResourceHandler不同,Omnifaces提供了vizCDNResourceHandler和CombinedResourceHandler,这需要JSF资源URL前缀模式的额外映射: <servlet-mapping> <servlet-name>facesServlet</servlet-na
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>
小脸蛋
*.xhtml
/javax.faces.resource/*
我不是JSF方面的专家,但我很想知道为什么只有这种类型才需要它,而其他两种类型不需要它?JSF资源也需要由
FacesServlet提供服务。它负责在/resources
文件夹中定位正确的文件,并将其与适当的缓存头一起重试。如果从资源URL中删除.xhtml
扩展名(或/faces
路径),则URL将不再与FacesServlet
的URL模式匹配,因此FacesServlet
将不会被调用,也将无法完成其服务资源的工作。由于“原始”资源URL与公共webcontent文件夹结构不匹配,因此您只能返回404 Not Found错误
UnmappedResourceHandler
利用了JSF资源URL有一个公共前缀路径/javax.faces.resource
,由标识。因此,为了无论如何调用FacesServlet
,即使没有.xhtml
扩展名(或/faces
路径),您只需要将/javax.faces.resource/*
URL模式添加到映射中
CDNResourceHandler
不需要更改映射,因为它不会生成JSF资源URL,而是生成真正的CDN URL,比如指向jQuery或Google CDN主机的URL。这些URL无论如何都不会(需要)点击FacesServlet
CombinedResourceHandler
只生成默认的JSF资源URL,扩展名为.xhtml
(或/faces
路径)。它只使用了一个特殊的库
名称omnifaces.combined
,以便CombinedResourceHandler
能够识别它们