将 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 <h:form>
、<h:link>
等生成所需的无扩展 URL。
或者,您可以使用 PrettyFaces 或 OmniFaces 的 FacesViews,这样您就无需重新发明***。在 FacesViews 展示页面的底部,您可以找到一些直接指向源代码的简单链接,这些链接可能会给您一些启发。
【讨论】:
我一直在网上搜索您所说的内容。您是否知道 JSF 的未来版本是否计划考虑这种特性? @João:有concrete plans 将FacesViews 集成到标准JSF 中。但很大程度上取决于 Servlet 4.0 API 和可用时间/资源。以上是关于将 JSF .xhtml 文件映射为无扩展名的主要内容,如果未能解决你的问题,请参考以下文章
将静态 HTML(无效 XHTML)文件包含到 JSF Facelets
JSF 和 PrettyFaces - 如何限制直接 xhtml 请求