1

我是 JSF 的新手。谁能解释一下为什么binding在下面的代码中使用属性:

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

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

4

2 回答 2

2

据我所知,使用绑定到支持 beanUIComponent实例的唯一原因是能够在 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 失败

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

<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 的以下答案:

于 2013-09-23T11:26:05.380 回答
1

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

另请参阅:值和绑定之间的区别

于 2013-09-23T10:34:45.880 回答