9

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

然而,我想要的是将 Faces Servlet 映射到扩展名。这意味着,如果我的customers.xhtmlWeb 根目录中有一个页面,我想使用http://example.com/customers.

我查看了如何在没有文件扩展名的情况下配置 JSF url 映射的问题?这在某种程度上有效,但它需要我单独映射我拥有的每个文件(如果我错了,请纠正我)。

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

4

2 回答 2

10

使用标准方法是不可能的。您基本上需要自制一个映射到的servlet 过滤器/*并检查当前请求 URL 是否为无扩展名,如果是,则RequestDispatcher#forward()对附加文件扩展名的 URL 执行调用(您知道,转发不会修改当前请求 URL 作为重定向会做)。您还需要一个自定义视图处理程序<h:form>来为 JSF等生成所需的无扩展 URL <h:link>

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

于 2013-01-21T12:01:01.750 回答
1

现在,有了标准就可以了。JSF 2.3 解决了这个问题。一个例子可以在这里找到。JSF 发布信息

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

    <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>
于 2019-06-14T21:34:34.340 回答