我是 JSF 的新手。谁能解释一下为什么binding
在下面的代码中使用属性:
<h:form id="epox" binding="#{rxManufacturerEditor.form}" />
我对value
和binding
属性有点困惑,但是我不明白为什么我们提到带有表单标签的绑定属性。
据我所知,使用绑定到支持 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 的以下答案:
<h:form>
标记可以绑定到具有相同类型标记的支持 bean 的属性-HTMLForm
就像其他常用标记一样。
另请参阅:值和绑定之间的区别