简体   繁体   中英

JSF AJAX - Class doesn't have property

I have been trying to run AJAX example in JSF. But I am getting "class does not have the property login". But in all the examples in various websites, code is same the same.

My index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>JSF AJAX Calls</title>
    </h:head>
    <h:body>
        <h2>AJAX Example</h2>
        <h:form>
            <h:inputText id="inputName" value="#{userData.name}"></h:inputText>
            <h:commandButton value="Login">
                <f:ajax execute="inputName" render="outputMsg" />
            </h:commandButton>
            <br />
            <hr />
            <h2><h:outputText id="outputMsg" value="#{userData.login}" /></h2>
        </h:form>
    </h:body>
</html>

UserData.java

package com.cyb3rh4wk.test;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean(name = "userData", eager = true)
@SessionScoped
public class UserData implements Serializable {

    private String name;

    public String getName() {
        return name;
    }

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

    public String login()   {
        if ("".equals(name) || name == null)
            return "";
        else
            return "Logged in as " + name;
    }
}

This is my error,

/index.xhtml value="#{userData.login}": The class 'com.cyb3rh4wk.test.UserData' does not have the property 'login'.

How do I resolve this error ?

Value and Method Expressions

The EL defines two kinds of expressions: value expressions and method expressions. Value expressions can either yield a value or set a value. Method expressions reference methods that can be invoked and can return a value.

Example of a value expression according to the above definition in your code is:

userData.name

In the following tag definition:

<h:outputText id="outputMsg" value="#{userData.login}" />

you are not using a value expression but rather a method expression because login is not a simple JavaBean getter returning the value of a bean property.

So you have to change the above line as:

<h:outputText id="outputMsg" value="Logged in as : #{userData.name}" />

And remove your login or use it for navigation purpose (that is why it is there).

Here is the reason (taken from JSF 2.0 specification) why you have to pass a value expression to an output component instead of a method expression:

4.1.10 UIOutput

UIOutput (extends UIComponentBase; implements ValueHolder) is a component that has a value, optionally retrieved from a model tier bean via a value expression (see Section 5.1 “Value Expressions”), that is displayed to the user. The user cannot directly modify the rendered value; it is for display purposes only:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM