将 JSF .xhtml 文件映射为无扩展名

Posted

技术标签:

【中文标题】将 JSF .xhtml 文件映射为无扩展名【英文标题】:Mapping JSF .xhtml files to no extension 【发布时间】:2013-01-04 11:22:35 【问题描述】:

在 JSF 中,我可以将 Faces Servlet 映射到各种 URL 模式。例如。到*.xhtml

我想要的是将 Faces Servlet 映射到 no 扩展。意思是,如果我的 Web 根目录中有一个页面 customers.xhtml,我想使用 http://example.com/customers 请求这个。

我查看了How do I configure JSF url mappings without file extensions? 的问题,这在某种程度上有效,但它需要我单独映射我拥有的每个文件(如果我错了,请纠正我)。

如何将我的所有.xhtml 文件一次性映射到 Faces Servlet,而不必单独映射它们?

【问题讨论】:

【参考方案1】:

现在,标准是可能的。 JSF 2.3 解决了这个问题。可以在here 找到一个示例。 JSF release info

只需在 web.xml 中 JSF 的 servlet 映射中使用 <url-pattern>/pageName</url-pattern>

    <servlet>
      <servlet-name>JSF</servlet-name>
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
      <servlet-name>JSF</servlet-name>
      <!-- suffix -->
      <!-- if someone open /other.xhtml instead of /other -->
      <url-pattern>*.xhtml</url-pattern>

      <url-pattern>/home</url-pattern><!-- it will map to /home.xhtml -->
      <url-pattern>/other</url-pattern><!-- it will map to /other.xhtml -->
    </servlet-mapping>

【讨论】:

【参考方案2】:

使用标准方法是不可能的。您基本上需要自制一个映射到/* 的servlet filter 并检查当前请求URL 是否为无扩展名,如果是,则对附加文件扩展名的URL 执行RequestDispatcher#forward() 调用(你知道,转发不会像重定向那样修改当前请求 URL)。您还需要自定义 view handler 来为 JSF &lt;h:form&gt;&lt;h:link&gt; 等生成所需的无扩展 URL。

或者,您可以使用 PrettyFaces 或 OmniFaces 的 FacesViews,这样您就无需重新发明***。在 FacesViews 展示页面的底部,您可以找到一些直接指向源代码的简单链接,这些链接可能会给您一些启发。

【讨论】:

我一直在网上搜索您所说的内容。您是否知道 JSF 的未来版本是否计划考虑这种特性? @João:有concrete plans 将FacesViews 集成到标准JSF 中。但很大程度上取决于 Servlet 4.0 API 和可用时间/资源。

以上是关于将 JSF .xhtml 文件映射为无扩展名的主要内容,如果未能解决你的问题,请参考以下文章

排除子目录的过滤器映射 url 模式

将静态 HTML(无效 XHTML)文件包含到 JSF Facelets

JSF 和 PrettyFaces - 如何限制直接 xhtml 请求

从 xhtml 文件创建 jsf 视图/组件树

JSF/Primefaces 如何将另一个域中的 .xhtml 包含到您的 .xhtml 中

无法从xhtml文件,Jsf managedBean访问方法