我设法让代码按照我的意图行事,但我不明白为什么会这样做的特定方面。我使用Richfaces 3.3.3运行Seam 2.2.2。
以下是xhtml页面中的代码:
...
<h:form id="radiobuttontestform">
<fieldset>
<h:panelGrid columns="3">
<h:selectOneRadio layout="pageDirection" id="myRadio" value="#{actionBean.myRadioButton}">
<f:selectItem itemLabel="First" itemValue="0" />
<f:selectItem itemLabel="Second" itemValue="1" />
<a4j:support event="onclick" ajaxSingle="true" process="myDropdown" reRender="myDropdown,myCount,test" />
</h:selectOneRadio>
<h:panelGrid columns="1" border="0">
<h:selectOneListbox size="1" id="myDropdown" value="#{actionBean.rowCountPredefined}" disabled="#{actionBean.myRadioButton != '0'}">
<f:selectItem itemLabel="10" itemValue="10" />
<f:selectItem itemLabel="20" itemValue="20" />
<f:selectItem itemLabel="30" itemValue="30" />
</h:selectOneListbox>
<h:inputText id="myCount" maxlength="5" value="#{actionBean.rowCountSpecified}" disabled="#{actionBean.myRadioButton != '1'}" required="true">
<f:validateLongRange minimum="1" maximum="1000" />
<rich:ajaxValidator event="onkeyup" for="myCount" />
</h:inputText>
<rich:message id="errorMessage" for="myCount" ajaxRendered="true" showDetail="false" showSummary="true">
<f:facet name="errorMarker">ERROR:</f:facet>
</rich:message>
</h:panelGrid>
</h:panelGrid>
</fieldset>
<h:outputLabel id="test" value="RadioValue: #{actionBean.myRadioButton}" />
<a4j:commandButton id="show" value="Show Values in Log" action="#{actionBean.showValues}" />
<a4j:commandButton id="done" value="Save and end conversation" action="#{actionBean.apply}" />
</h:form>
...
支持bean只是一个简单的POJO,其中包含三个属性的getter和setter。 (myRadioButton,rowCountPredefined,rowCountSpecified)
这就是我得到的:(正确的结果)
radio button example http://katzekat.de/Bilder/radio2.png
radio button example http://katzekat.de/Bilder/radio.png
这是我的想法:
将ajaxSingle设置为true意味着只在服务器上处理单选按钮。它旁边的下拉列表不需要验证 - 它将始终包含正确的值。我添加了process =“myDropdown”以便将值保存到backing bean中,否则当我将单选按钮切换到位置2时,下拉列表将恢复为其原始值。 (我意识到这只是化妆品!)我已经用调试器检查了它,它确实在支持bean中设置了属性,一切都按预期工作。
将单选按钮切换到位置2后,可以在文本框中输入一个值并进行验证。这非常有效,当我将单选按钮切换回位置1时,如果此字段处于错误状态,则清除验证错误。大概是因为错误消息只出现在请求范围内。
当单选按钮位于位置2并且在文本字段中输入有效值时再次启动调试器会在切换回位置1时显示辅助bean没有更新。我也期望这是因为我只告诉无线电和服务器上的下拉列表。这是我不明白的一点 - 文本域中的值在回发时保持不变。 (请参阅上面的第二个链接)如果不在辅助bean中,此文本字段的值保存在哪里?
答案 0 :(得分:2)
提交的表单值存储在Apply Request Values
阶段的组件中。
例如,在您的案例中{text} javax.faces.component.html.HtmlInputText#decode
方法调用javax.faces.component.UIInput#setSubmittedValue
。提交的值未设置为bean(如您所料),因为组件未包含在execute
部分中。然后inputText的渲染器重新显示(写入响应)提交的值。
验证失败时,它的工作原理非常相似。提交的值存储在Apply Request Values
阶段,然后由于验证失败,提交的值未设置为bean(跳过Update Model Values
阶段),然后重新显示提交的值。