引言
平时使用JSF,在查看标签proposal的时候经常到瞟到这个属性,几乎所有组件标签都有这个属性,但是一直不知道有什么用,今晚无意中研究了一下,发现还挺好用。
binding属性
先看下binding的proposal:
The ValueExpression linking this component to a property in a backing bean
大意为这是一个求值表达式,它将当前的组件和某个backing bean的属性连接绑定在一起。
JSF中所有的UI组件都是对象,都有对应的类,那么JSF组件对象作为bean的成员属性也是可以的,所以试验一下:
package net.zealot.bean;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIInput;
@ManagedBean
@SessionScoped
public class UserBean {
private String username;
private UIInput inputComponent;//<h:inputText />
public void test() {
String value = (String) this.inputComponent.getValue();//这里有非常多的操作input组件的方法
System.out.println(value);
}
public UIInput getInputComponent() {
return inputComponent;
}
public void setInputComponent(UIInput inputComponent) {
this.inputComponent = inputComponent;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head></h:head>
<h:body>
<h:form>
<h:outputLabel b for="username">username:</h:outputLabel>
<h:inputText binding="#{userBean.inputComponent}"></h:inputText><br/><!-- 故意不写value -->
<h:commandButton value="click" action="#{userBean.test}"></h:commandButton>
</h:form>
</h:body>
</html>
点击按钮,页面自然是没有什么变化,但是控制台确实输出了inputText中的内容:
aaaaa
就是说,binding将组件的实例绑定到后端一个bean的成员属性上,这样一来,完全可以动态地在后端控制前端的所有组件的属性。