5

我一直在阅读一些关于 javax.faces.default_suffix 的帖子,但在尝试实现它时没有成功。

使用:jsf 2.0、jboss 7.1、Mojarra 2.1.5

  • 我需要在 URL 中显示以下内容:localhost:8080/myproject/index.jsf
  • 导航时还需要显示 xxx.jsf

web.xml

<welcome-file-list>
    <welcome-file>/comum/inicio/index.xhtml</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>  **have tried *.jsf but with no success**
</servlet-mapping>

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.jsf</param-value>
</context-param>

你能帮我解决这个问题吗?谢谢

4

1 回答 1

14

您正在混合默认后缀和 URL 模式的含义。

代表您在 Web 应用程序中的物理文件的javax.faces.DEFAULT_SUFFIX默认后缀,它代表 JSF 文件。这在 JSF 2.0 中默认为. 如果将其更改为,则应将所有物理文件从 重命名为。这通常没有完全的意义。您不应该这样做,只需完全摆脱该上下文参数即可。.xhtml.jsfsome.xhtmlsome.jsf

<url-pattern>表示最终用户必须在请求 URL 中使用以调用的默认 URL 模式(FacesServlet这反过来使用默认后缀配置来根据 URL 定位物理文件)。您说要*.jsf在 URL 中使用,但是您已将其设置为*.xhtml. 这是不对的,更改默认后缀不是正确的解决方案。

您应该只设置 URL 模式,而不是默认后缀。

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

这种方式http://localhost:8080/myproject/index.jsf会奏效。

然后还有第三个问题:您完全误解了欢迎文件的用途。它不应该代表主页的路径。它应该代表您希望在请求 、 、 等/文件/foo/夹时作为默认文件提供的物理文件的文件名。/foo/bar/只需将其设置为index.jsf.

<welcome-file-list>
    <welcome-file>index.jsf</welcome-file>
</welcome-file-list>

但是,您应该记住,容器会在继续请求之前验证物理文件是否存在,以便在不存在时正确显示 404 错误。由于*.jsf实际上是一个虚拟 URL,该步骤将失败。您可以通过在所需文件夹中的文件旁边放置一个实际存在但为 的文件来欺骗容器来解决该问题。index.jsfindex.xhtml

只要您在根文件夹中http://localhost:8080/myproject/有一个真实index.xhtml文件和一个空文件,这种方式就可以工作。index.jsf

更容易的是摆脱虚拟 URL 并一直坚持下去*.xhtml

也可以看看:

于 2013-07-11T16:53:33.627 回答