4

我正在尝试开始使用 JSF 2.0。我正在尝试一个基本的导航示例,但它无法正常工作。

文件结构如下:

在此处输入图像描述

我已经在 web.xml 中配置了映射:

<!-- Change to "Production" when you are ready to deploy -->
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<!-- Welcome page -->
<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

<!-- JSF mapping -->
<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>
</servlet-mapping>

并且索引页面有 2 个按钮,点击后可将您带到不同的页面

faces-config.xml 文件定义了一些导航案例:

<!-- Configuration of navigation rules -->  
<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id> 
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/pages/success.xhtml</to-view-id>
    </navigation-case>
     <navigation-case>
        <from-outcome>error</from-outcome>
        <to-view-id>/pages/error.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

例如,以下按钮应将您带到成功页面(/pages/success.xhtml):

<p:commandButton id="addUser" value="Add" action="#{userMB.addUser}" ajax="false"/>

我已经对此进行了调试,addUser 的返回值绝对是“成功”。

页面切换到success.xhtml,因为我看到内容变了,但是浏览器URL指向index.xhtml....

启动时: URL 是localhost:8080/PROJECT/没有 index.xhtml 可能是因为我们将其配置为欢迎文件。当我们点击上面的按钮时,URL 变为localhost:8080/PROJECT/index.xhtml

我相信我弄乱了映射或相对路径。我发现了一些建议,唯一的映射应该是带有 *.xhtml 的映射,但我并不真正理解为什么以及如何处理页面的多个子文件夹。

任何帮助表示赞赏,谢谢

4

2 回答 2

14

页面切换到success.xhtml,因为我看到内容已更改,但浏览器URL 指向index.xhtml。

这是正常行为。HTML<form action>指向,/index.xhtml因此表单将准确地提交到该 URL,但在幕后,响应显示/pages/success.xhtml.

如果要更改 URL,则需要执行重定向。您可以通过添加问题来做到这<redirect/>一点<navigation-case>

<navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/pages/success.xhtml</to-view-id>
    <redirect/>
</navigation-case>

也可以看看:


与具体问题无关,使用导航的案例都是 JSF 1.x。考虑利用新的 JSF 2.0 隐式导航特性。这使您免于冗长的 XML 地狱。

public String addUser() {
    if (...) {
        return "/pages/success.xhtml?faces-redirect=true";
    } else {
        return "/pages/error.xhtml?faces-redirect=true";
    }
}

但是,我建议只添加面孔消息,然后通过返回voidnull导航到“成功”或“错误”页面来重新显示同一页面,这也是真正的 Web 表单的工作方式。当然,除非你正在做一些“Hello World”。

于 2012-10-05T12:19:04.100 回答
-1

在导航规则中试试这个

<navigation-rule>
<from-view-id>/index.jsf</from-view-id> 
<navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/pages/success.jsf</to-view-id>
</navigation-case>
 <navigation-case>
    <from-outcome>error</from-outcome>
    <to-view-id>/pages/error.jsf</to-view-id>
</navigation-case>

于 2012-10-05T11:59:49.917 回答