【问题标题】:Richfaces and JSF/AJAX LifecyclesRichfaces 和 JSF/AJAX 生命周期
【发布时间】:2013-04-15 18:43:34
【问题描述】:

我已经设法让代码按照我的意图进行,但我不明白为什么它有效的特定方面。我正在使用 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>
...

backing 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" 以便将值持久保存到支持 bean 中,否则当我将单选按钮切换到位置 2 时,下拉菜单将恢复为原始值。 (我意识到这只是装饰性的!)我已经用调试器检查了这个,它确实在支持 bean 中设置了属性,并且一切都按预期工作。

一旦单选按钮切换到位置 2,就可以在文本框中输入一个值并进行验证。这非常有效,当我将单选按钮切换回位置 1 时,如果该字段处于错误状态,验证错误将被清除。大概是因为错误信息只存在于请求范围内。

当单选按钮位于位置 2 并在文本字段中输入有效值时再次启动调试器,显示切换回位置 1 时支持 bean 没有更新。我也预料到了这一点,因为我只告诉无线电和要在服务器上处理的下拉列表。这是我不明白的一点 - 文本字段中的值 is 在回发时仍然存在。 (请参阅上面的第二个链接)如果不在支持 bean 中,此文本字段的此值保存在哪里?

【问题讨论】:

  • 如果图像没有消失,这个问题可能会更有用! :)
  • 他们回来了 - 正在更换主机 :-)
  • 澳洲新闻网!我在研究 JSF 生命周期问题时发现了您的问题。我想问题/答案对我帮助不大,但这是一个写得很好的问题。 FWIW,我发现这个 ooold 页面非常有用:balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html您可能已经找到它,或者现在可能已经非常了解 JSF 生命周期,但它对我帮助很大。

标签: jsf richfaces seam


【解决方案1】:

提交的表单值存储在Apply Request Values阶段的组件中。

例如,在您的情况下,文本字段的 javax.faces.component.html.HtmlInputText#decode 方法调用 javax.faces.component.UIInput#setSubmittedValue。提交的值未设置为 bean(如您所料),因为该组件未包含在 execute 部分中。然后 inputText 的渲染器重新显示(写入响应)提交的值。

验证失败时它的工作原理几乎相同。提交的值存储在Apply Request Values阶段,然后由于验证失败提交的值没有设置为bean(跳过Update Model Values阶段),然后重新显示提交的值。

【讨论】:

  • 您好,感谢您的回答。我的印象是 ajaxSingle="true" 之外的其他组件没有调用应用请求值阶段。此外,我无法理解的是,为什么当我删除 process="myDropdown" 而文本框没有保留它的值时,下拉列表没有保留它的值!作为一个实验,我在下拉列表中添加了一个 ajax 验证器(我意识到在这种情况下它永远不会被触发),并从我的支持标签中删除了该进程。这也保留了回发的价值。
  • 此外,我刚刚读到 rich:ajaxValidator 跳过了除了验证之外的所有 JSF 阶段!这现在更有意义了——我设置了一个 PhaseListener 并且可以看到当我使用 ajax 验证器时调用了恢复视图、应用请求值、流程验证和呈现响应。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2011-02-22
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多