在JSF表单中使用绑定的原因

时间:2013-09-23 09:27:21

标签: jsf jsf-2

我是JSF的新手。任何人都可以解释一下为什么在下面的代码中使用了binding属性:

<h:form id="epox" binding="#{rxManufacturerEditor.form}" /> 

我对valuebinding属性感到有些困惑,但我不明白为什么我们提到带有表单标记的绑定属性。

2 个答案:

答案 0 :(得分:2)

使用绑定到我知道的支持bean的UIComponent实例的唯一原因是能够在action / actionlistener方法或ajax侦听器方法中以编程方式操作该组件,喜欢在:

UIInput programmaticInput;//getter+setter
String value1, value2;//getter+setter
...
public void modifyInput() {
    ELContext ctx = FacesContext.getCurrentInstance().getELContext();
    ValueExpression ve = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(ctx, "#{bean.value2}", Object.class);
    programmaticInput.setValueExpression("value", ve);
}

触发操作方法后,组件<h:inputText value="#{bean.value1}" binding="#{bean.programmaticInput} ... />的值将绑定到value2而不是value1

我很少使用这种类型的绑定,因为facelets提供了基于XML的视图定义,而无需(经常)弄乱程序化组件。

请务必知道上述构造在早于2.1.18的Mojarra版本中失败,从而强制在每个HTTP请求上重新创建视图范围的bean。有关详细信息,请参阅@ViewScoped fails in tag handlers

更典型的是,您希望使用绑定到视图,您可以在其中进行跨字段验证:

<h:inputText binding="#{input}" ... />
<h:inputText validator="#{bean.validate}" ... >
    <f:attribute name="input" value="#{input}" />
</h:inputText>

这里,整个第一个输入组件将作为第二个组件的属性使用,因此它的值将在相关的验证器(方法)中可用。另一个例子是检查在视图中触发了哪个命令组件:

<h:commandButton binding="#{button}" ... />
<h:inputText disabled="#{not empty param[button.clientId]}" ... />

此处,仅在按下按钮时才会禁用输入文本组件。

有关更多信息,请继续阅读BalusC的以下答案:

答案 1 :(得分:1)

<h:form>标记可以绑定到支持bean的属性,该属性具有相同类型的标记HTMLForm - 就像其他常用标记一样。

另请参阅:Difference between value and binding