27
votes

What is the difference between using value and binding with JavaServer Faces, and when would you use one as opposed to the other? To make it clearer what my question is, a couple of simple examples are given here.

Normally with JSF in the XHTML code you would use "value" as here:

<h:form> 
  <h:inputText value="#{hello.inputText}"/>
  <h:commandButton value="Click Me!" action="#{hello.action}"/>
  <h:outputText value="#{hello.outputText}"/>
</h:form>

Then the bean is:

// Imports
@ManagedBean(name="hello")
@RequestScoped
public class Hello implements Serializable {

private String inputText;
private String outputText;

public void setInputText(String inputText) {
    this.inputText = inputText;
}

public String getInputText() {
    return inputText;
}

// Other getters and setters etc.

// Other methods etc.

public String action() {

    // Do other things

    return "success";
}
}

However, when using "binding", the XHTML code is:

<h:form> 
  <h:inputText binding="#{backing_hello.inputText}"/>
  <h:commandButton value="Click Me!" action="#{backing_hello.action}"/>
  <h:outputText value="Hello!" binding="#{backing_hello.outputText}"/>
</h:form>

and the correspondibg bean is called a backing bean, and is here:

// Imports
@ManagedBean(name="backing_hello")
@RequestScoped
public class Hello implements Serializable {

private HtmlInputText inputText;
private HtmlOutputText outputText;

public void setInputText(HtmlInputText inputText) {
    this.inputText = inputText;
}

public HtmlInputText getInputText() {
    return inputText;
}

// Other getters and setters etc.

// Other methods etc.

public String action() {

    // Do other things

    return "success";
}
}

What practical differences are there between the two systems, and when would you use a backing bean rather than a regular bean? Is it possible to use both?

I have been confused about this for some time, and would most appreciate having this cleared up.

2

2 Answers

43
votes

value attribute represents the value of the component. It is the text that you see inside your text box when you open the page in browser.

binding attribute is used to bind your component to a bean property. For an example in your code your inputText component is bound to the bean like this.

#{backing_hello.inputText}`

It means that you can access the whole component and all its properties in your code as a UIComponent object. You can do lot of works with the component because now it is available in your java code. For an example you can change its style like this.

public HtmlInputText getInputText() {
    inputText.setStyle("color:red");
    return inputText;
}

Or simply to disable the component according to a bean property

if(someBoolean) {
  inputText.setDisabled(true);
}

and so on....

3
votes

Sometimes we don't really need to apply the value of UIComponent to a bean property. For example you might need to access the UIComponent and work with it without applying its value to the model property. In such cases it's good to use a backing bean rather than a regular bean. On the other hand in some situations we might need to work with the values of the UIComponent without any need of programmatic access to them. In this case you can just go with the regular beans.

So, the rule is that use a backing bean only when you need programmatic access to the components declared in the view. In other cases use the regular beans.