0

我正在尝试设置一个投票应用程序,该应用程序将显示用户是否能够在我的 bean 类中使用 if 语句进行投票,但是这个 Unable to find matching navigation case with from-view-id '/home.xhtml'操作“#{user.checkAge(user.age)}”,结果为“无效用户,请重试!!!”。我对 Java Server Faces 还不是很了解,我试着弄乱配置文件并用谷歌搜索错误,但我无法修复它。谁能帮助我。

这是我的代码:

Home.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <head>
        <title>Results Page</title>
    </head>
    <body>
        <h:form>
           Name: <h:outputText id="outTxt" value="#{user.name}"/><br></br>
           Age: <h:outputText id="outTxt2" value="#{user.age}"/><br></br>
            <h:commandButton id="cmdBtn" value="Check" action="#{user.checkAge(user.age)}"/>
        </h:form>
    </body>
</html>

index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Home Page</title>
    </h:head>
    <h:body>

    <h:body> 
       <h:form>
           Name: <h:inputText id="inTxt" value="#{user.name}"/><br></br>
           Age: <h:inputText id="inTxt2" value="#{user.age}"/><br></br>
            <h:commandButton id="cmdBtn" value="Check" action="home"/>
        </h:form>
    </h:body>
    </h:body>
</html>

User.java

package MyPackage;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class User 
{
private String name;
private int age;
private String msg;

    public String getMsg() 
    {
        return msg;
    }

    public void setMsg(String msg)
    {
        this.msg = msg;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name) 
    {
        this.name = name;
    }

    public int getAge() 
    {
        return age;
    }

    public void setAge(int age) 
    {
        this.age = age;
    }
     public String checkAge(int checkAgeVoter)
    {
        if(checkAgeVoter >= 18)
        {
            msg = "Valid User, Access Granted!!!";
        }
        else
        {
            msg = "Invalid User, Please Try Again!!!";
        }
        return msg;
    }
}
4

2 回答 2

1

User.checkAge()用作 JSF 动作。因此,它的返回值被解释为输入 JSF 导航逻辑的“结果”。JSF 尝试查找当前视图 (/home.xhtml) 的导航规则和您的“结果”以找出接下来要显示的页面。它找不到任何东西。

您可能希望从 checkAge 返回 null(或使方法无效),从而导致 JSF 导航再次显示当前页面。但是,我没有看到将显示 User.msg 的任何地方。因此,您可能希望导航到执行此操作的另一个页面并返回导航规则的正确结果。(注意:您的用户在 index.html 中输入数据,因此您可能希望在此处引用您的输入验证操作并返回“/home.xhtml”。)有关现代 JSF 中导航的更多详细信息,请参阅Faces Navigation not really working in JSF2

请注意,在 JSF 中有一种基于标签 h:messages(和 h:message)和 FacesContext.getCurrentInstance().addMessage()(和验证)显示消息的机制。例如,请参阅http://www.javabeat.net/2008/04/display-error-messages-in-jsf-hmessages-part-1-2/


你可以试试:

  1. 在 home.xhtml 中:<f:form>添加Msg: <h:outputText value="#{user.msg}"/><br/>.
  2. 在 index.xhtml 中:替换action="home"action="#{user.checkAge(user.age)}".
  3. 在 User.java 中:在 checkAge() 中替换return msg;return "home";(或"/home.xhtml")。

假设 index.html 是您的起始页面,这将检查输入的数据并导航到主页(假设action="home"已经工作)。

于 2013-09-29T10:06:40.447 回答
0

这不是最好的方法,只是为了很好地理解著名的配置文件是如何进行导航的faces-config

首先,您可以省略msg属性,并将业务方法修改为:

public String checkAge(int checkAgeVoter) {
    if (checkAgeVoter >= 18) return "granted";
    else return "denied";
}

有了这个faces-config

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">

<navigation-rule>
<from-view-id>/index</from-view-id>
    <navigation-case>
        <from-outcome>home</from-outcome>
        <to-view-id>/home.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

<navigation-rule>
<from-view-id>/home.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>granted</from-outcome>
        <to-view-id>/votepage.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>denied</from-outcome>
        <to-view-id>/errorpage.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

并添加 2 个测试页面:votepage.xhtml在成功的情况下,errorpage.xhtml否则。

于 2013-09-29T11:54:10.560 回答