JSF AJAX 验证:执行= "@this" 渲染= "@form"不一致,具体取决于先前的请求



我有一个h:commandLink,它调用一个方法来改变绑定到无线电输入的属性。

我也有一个文本输入在相同的形式与一些验证(required=true)。

如果我将文本输入留空,并单击h:commandLinkexecute="@this,则单选按钮将按照预期从模型属性更新,因为文本输入从未被处理并且验证从未触发。

然而,如果首先我点击不同的execute="@form" h:commandLink然后execute="@this"的链接,验证消息消失,但单选按钮值确实从模型更新,即使单选按钮的UIInput从未处于无效状态。

我发现很烦人的是,execute="@this"的行为不同取决于我以前做过什么,当我的意图与@this是强制一切从模型更新,忽略任何提交的值从组件。

我怀疑发生的事情是这样的:

  • @form,单选按钮和文本都被处理。
  • 单选按钮有效,因此localValue设置为
  • 由于无效的文本输入,进程验证阶段整体失败,因此localValue保持设置,不被清除或传播到value
  • 解决这个问题的唯一方法是显式地调用resetValue()或重新处理有问题的组件(例如,execute="@this radio")以清除localValue,然后允许从bean中刷新。

我的问题是:

  • 我对生命周期的理解是否正确?
  • 是我做错了什么,还是这是JSF设计中令人讨厌的事情之一?

感觉这可能只是这个问题的另一个例子

验证错误发生后,我如何使用PrimeFaces AJAX填充文本字段?

不幸的是,我觉得我最近发现了很多这样的东西。: - (

代码示例如下:

<h:form>
<h:messages/>
Radio = 
<h:selectOneRadio value="#{testBean.radioValue}" id="radio" binding="#{radio}">
    <f:selectItem itemValue="foo" itemLabel="Foo"/>
    <f:selectItem itemValue="bar" itemLabel="Bar"/>
</h:selectOneRadio>
<br></br>
radio bean value = <h:outputText value="#{testBean.radioValue}"/>
<br></br>
radio UIInput localValue = <h:outputText value="#{radio.localValue}"/>
<br></br>
radio UIInput value = <h:outputText value="#{radio.value}"/>
<br></br>
String w/validation = <h:inputText value="#{testBean.stringValue}" required="true" />
<br></br>
<ul>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @form">
    <f:ajax render="@form" execute="@form"/>
</h:commandLink>
</li>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @this">
    <f:ajax render="@form" execute="@this"/>
</h:commandLink>
</li>
    <li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @this radio">
    <f:ajax render="@form" execute="@this radio"/>
</h:commandLink>
</li>   
</ul>
</h:form>

和这个bean:

@ManagedBean
@ViewScoped
public class TestBean {
private String radioValue = "foo";
private String stringValue;
public void changeRadioValue() {
    radioValue = "bar";
}
 // + getters/setters
 }

我对生命周期的理解是否正确?

是的。


是我做错了什么,还是这是JSF设计中令人讨厌的事情之一?

这是"恼人的设计问题"之一。JSF。正如我对那个相关问题的回答所述:

回到具体问题,我认为这是JSF2规范中的疏忽。对于我们JSF开发人员来说,当JSF规范要求以下内容时,这将更有意义:

  • 当JSF需要通过ajax请求更新/重新呈现输入组件,并且该输入组件不包括在ajax请求的处理/执行中,那么JSF应该重置输入组件的值。

我只是不记得我是否曾经报告过JSF规范。编辑:我报告过:JSF规范问题1060.

最新更新