如果将相同的backing bean属性绑定到同一表单中的两个输入字段,那么JSF的行为是什么?

时间:2009-06-24 11:14:51

标签: jsf

如果两个输入字段绑定到同一个会话范围的Backing Bean属性,那么JSF中是否存在已定义的行为。

这是我的代码段

<h:form id="myForm">
   <h:inputText id="field1" value="#{TheBackingBean.theProperty}" />
   <h:inputText id="field2" value="#{TheBackingBean.theProperty}" />

   <h:commandButton id="continueButton" action="#{TheBackingBean.doSomething}" />
</h:form>

我的问题:如果field1和field2接收到不同的值,那么将绑定到backing bean属性的是什么?这甚至是允许的吗?

我知道这是一个粗糙的场景。我的动机是,我们已经为我们的应用程序运行了htmlunit测试。在我们的JSF应用程序中,我们希望使用一个很酷的ajaxified自定义组件。这与htmlunit不能很好地协同工作。所以我的想法是,我只是放入一个隐藏的领域,绑定到同一个属性。单元测试然后填充隐藏的字段而不是“真实”的东西。

此致

1 个答案:

答案 0 :(得分:4)

我认为这种代码是允许的,但我不确定提交后 theProperty 的价值。我认为JSF将执行以下操作:

TheBackingBean.setTheProperty(field1.value);
TheBackingBean.setTheProperty(field2.value);

但是,据我所知,没有任何内容指定了setter调用的顺序。因此,在更新值 JSF阶段之后,您将无法确定 theProperty 是否等于 field1.value field2。值

关于您的方案,您说要将同一属性绑定到inputText和隐藏文本。由于hiddenText不会提交其值,因此与inputText不同,此问题不会发生。实际上,如果你有这种JSF代码:

<h:inputText id="field1" value="#{TheBackingBean.theProperty}"/>
<h:inputHidden id="field2" value="#{TheBackingBean.theProperty}"/>

然后JSF只会这样做:

TheBackingBean.setTheProperty(field1.value);

在提交阶段。