JSF 2.0导航无法正常工作

时间:2012-10-05 11:12:43

标签: jsf jsf-2 navigation primefaces

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

文件结构如下:

enter image description here

我已在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>

E.g。以下按钮将带您进入成功页面(/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,但我真的不明白为什么以及如何处理页面的多个子文件夹。

感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:14)

  

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

这是正常行为。 HTML <form action>指向/index.xhtml,因此表单将完全提交给该网址,但在幕后,响应会显示/pages/success.xhtml的内容。

如果您想要更改网址,则需要执行重定向。您可以通过将<redirect/>添加到相关的<navigation-case>来执行此操作。

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

另见:


无关具体问题,使用导航案例是soo 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重新显示同一页面,而不是导航到“成功”或“错误”页面,这也是真实的网络表单工作。当然,除非你正在做一些“Hello World”。

答案 1 :(得分:-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>