无法找到与from-view-id'/ login.xhtml'匹配的导航案例,以便将行为'#{admin.Validity}'与结果'失败'相关联

Li3*_*3ro 4 jsf

我无法让它发挥作用.我得到以下内容:

Unable to find matching navigation case with from-view-id '/login.xhtml' for action '#{admin.Validity}' with outcome 'failure'
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

HTML:

<div id="main" >

        <h:form id="login_form">
            <table>
                <tr>
                    <td><h:outputText value="User: " /></td>
                    <td><h:inputText id="username"
                            value="#{admin.username}" /></td>
                </tr>
                <tr>
                    <td><h:outputText value="Password: " /></td>
                    <td><h:inputSecret id="password"
                            value="#{admin.password}" /></td>
                </tr>
                <tr>
                    <td></td>
                    <td><h:commandButton value="Login" type="submit"
                            action="#{admin.Validity}" /></td>
                </tr>
            </table>
        </h:form>

    </div>
Run Code Online (Sandbox Code Playgroud)

Admin.java

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;


@ManagedBean(name="admin")
@SessionScoped
public class Admin implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
Boolean authenticated;
String username;
String password;

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}

public String Validity() {
    if(username.equals("admin") && password.equals("admin")) {
        authenticated=true;
        return "success";
    }   else   {
        authenticated=false;
        return "failure";
    }
}

}
Run Code Online (Sandbox Code Playgroud)

faces-config.xml中

<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>/login.xhtml</from-view-id>

    <navigation-case>
       <from-action>#{Admin.Validity}</from-action>
       <from-outcome>success</from-outcome>
       <to-view-id>/main.xhtml</to-view-id>
       <redirect/>
    </navigation-case>

    <navigation-case>
        <from-action>#{Admin.Validity}</from-action>
        <from-outcome>failure</from-outcome>
        <to-view-id>/login.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
</faces-config>
Run Code Online (Sandbox Code Playgroud)

谢谢.ÿ

Bal*_*usC 17

您的托管bean已命名#{admin},

@ManagedBean(name="admin")
Run Code Online (Sandbox Code Playgroud)

但是你试图#{Admin}在导航的情况下访问它,

<from-action>#{Admin.Validity}</from-action>
Run Code Online (Sandbox Code Playgroud)

所以它绝对不会起作用.Java区分大小写.

相应地修复导航案例中的托管bean名称:

<from-action>#{admin.Validity}</from-action>
Run Code Online (Sandbox Code Playgroud)

具体问题无关,你有几个小的设计错误.

  1. 托管bean名称已默认为classname,第一个字符为小写.所以你@ManagedBean(name="admin")可以被替换为@ManagedBean.

    @ManagedBean
    @SessionScoped
    public class Admin implements Serializable {
    
    Run Code Online (Sandbox Code Playgroud)
  2. 方法名称不应以大写字母开头.替换Validity()validity().此外,方法名称中也存在语法/语言错误,但这可能是语言障碍.您通常已将其命名validate()或在此上下文中更好authenticate()或更好.

  3. 导航案例是soo JSF 1.x. 从JSF 2.0开始,您可以使用新的"隐式导航"功能.您可以将结果值用作映射/无扩展名视图ID.

    public String authenticate() {
        if (username.equals("admin") && password.equals("admin")) {
            authenticated=true;
            return "main";
        } else {
            authenticated=false;
            return "login";
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样你就可以<navigation-rule>完全删除整个块.

也可以看看: