【问题标题】:Why does UnmappedResourceHandler require a servlet mapping for JSF resource URL prefix pattern?为什么 UnmappedResourceHandler 需要 JSF 资源 URL 前缀模式的 servlet 映射?
【发布时间】:2014-10-10 01:18:21
【问题描述】:

当我遇到全脸的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 方面的专家,但我很想知道为什么只需要这种类型而不需要其他两种?

【问题讨论】:

    标签: servlets jsf-2 omnifaces unmappedresourcehandler


    【解决方案1】:

    JSF 资源也需要由FacesServlet 提供服务。它负责在/resources 文件夹中找到正确的文件并将其与适当的缓存标头一起返回。如果您从资源 URL 中删除 .xhtml 扩展名(或 /faces 路径),则该 URL 将不再匹配 FacesServlet 的 URL 模式,因此不会调用 FacesServlet 并且不会能够完成为资源服务的工作。您只会收到 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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-12
      • 2017-03-27
      • 2011-02-24
      • 2012-08-15
      • 2015-07-28
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多