jsf – 仅当验证失败时,输入字段才保留以前的值

我想出了一个奇怪的问题.我试图隔离问题,以下是我的简化代码.
public class MyBean {

  private List<Data> dataList;
  Data selectedData;

  public MyBean() {
    dataList = new ArrayList<Data>();
    dataList.add(new Data("John",16));
    dataList.add(new Data("William",25));
  }

  public List<Data> getDataList() {
    return dataList;
  }

  public void edit(Data data) {
    selectedData = data;
  }
  public void newData() {
    selectedData = new Data(null,null);
  }

  public Data getSelectedData() {
    return selectedData;
  }

  public class Data {
    String name;
    Integer age;
    Data(String name,Integer age) {
      this.name = name;
      this.age = age;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public Integer getAge() {
      return age;
    }
    public void setAge(Integer age) {
      this.age = age;
    }
  }
}

XHTML:

<rich:modalPanel id="pop">
  <h:form>
    Name: <h:inputText value="#{myBean.selectedData.name}" required="true" id="txtName"/><br/>
    Age : <h:inputText value="#{myBean.selectedData.age}" required="true" id="txtAge"/>
    <a4j:commandButton value="Save"/>
    <a4j:commandButton value="Close" onclick="Richfaces.hideModalPanel('pop');return false;"/>
    <br/>
    <rich:message for="txtName"/><br/>
    <rich:message for="txtAge"/>
  </h:form>     
</rich:modalPanel>

<h:form>
  <rich:dataTable value="#{myBean.dataList}" var="data">
    <rich:column>#{data.name}</rich:column>
    <rich:column>
      <a4j:commandLink value="Edit" action="#{myBean.edit(data)}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
    </rich:column>
  </rich:dataTable>
  <a4j:commandButton value="New" action="#{myBean.newData()}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</h:form>

这是错误的路径:

>加载页面
>点击第一行中的“编辑”链接(弹出窗口)
>在弹出窗口中,清除“年龄”字段,然后单击“保存”(显示所需信息)
>点击取消(不填入“年龄”字段)
>点击第二个链接.
>现在显示不相关的数据(以前的数据). – 这就是问题
>即使我点击“新建”按钮,它显示不正确的数据.

只有弹出窗口中的验证失败,才会发生这种情况.
是否有解决方案?

这个问题在JSF 2中也被认可和解释了如下答案: How can I populate a text field using PrimeFaces AJAX after validation errors occur?如果你使用JSF 2,你可以使用OmniFaces’ ResetInputAjaxActionListener或PrimeFaces’ <p:resetInput> or resetValues="true"为此.

至此,您需要清除EditableValueHolder组件的状态,当它将要进行ajax渲染时,但是不包括在ajax-execute中.要清除状态,在JSF 2中,您将使用方便的方法resetValue(),但这在JSF 1.2中不可用,您需要调用4个单独的方法setValue(null),setSubmittedValue(null),setLocalValueSet(false ),setValid(true)来清除状态.

为了弄清楚哪些组件是ajax呈现的,但是没有被ajax执行,您将使用PartialViewContext方法,但JSF 1.2中尚未使用这种方法,它还没有标准化ajax.您需要解决RichFaces特有的ajax API才能得出结论.我不能从头开始,所以这里是一个开球示例,假设你已经知道需要清除的组件.想象一下,您的弹出窗体中的表单具有id =“popForm”,名称输入字段具有id =“nameInput”,您可以在newData()方法中清除它:

UIInput nameInput = (UIInput) context.getViewRoot().findComponent("popForm:nameInput");
nameInput.setValue(null);
nameInput.setSubmittedValue(null);
nameInput.setLocalValueSet(false);
nameInput.setValid(true);

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...