Richfaces和JSF / AJAX生命周期

时间:2013-04-22 18:39:58

标签: jsf richfaces seam

我设法让代码按照我的意图行事,但我不明白为什么会这样做的特定方面。我使用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中,此文本字段的值保存在哪里?

1 个答案:

答案 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阶段),然后重新显示提交的值。