【问题标题】:JF2 Dynamic form element doesn't remember input and page refreshes every time I add elementJF2 动态表单元素不记得每次添加元素时的输入和页面刷新
【发布时间】:2013-06-24 05:05:10
【问题描述】:

我正在尝试制作一个带有添加行选项的表单。但是,在我输入一些输入并再次单击添加按钮后,我输入的输入消失了。我不确定我的代码有什么问题。此外,当我单击添加按钮时,页面会刷新。有没有办法停止此页面刷新?

Person.java

public class Person{

    private List<String> guys = new ArrayList<String>();

public List<String> getGuys() {
    return guys;
}
public void setGuys(List<String> guys) {
    this.guys = guys;

public void addNewItem(){
    guys.add("");
}
}

form.xhtml

      <h:form>
        <h:panelGrid columns="2">              
          <h:outputText value="Guys: " />
          <h:dataTable value="#{person.guys}" var="men">
            <h:column>
              <p:inputText value="#{men}" />
            </h:column>
          </h:dataTable>
          <h:commandButton name="add" value="Add" action="#{person.addNewItem}" />
        </h:panelGrid>
        <br />
        <h:commandButton name="submit" type="submit" value="Submit"></h:commandButton>
  </h:form>

【问题讨论】:

    标签: java forms dynamic jsf-2


    【解决方案1】:

    假设 bean 被放置在功能需求的正确范围内,即视图范围内,剩下的唯一主要错误是您期望 String 类有一些神奇的 setter 方法。

    它没有。 String 类是不可变的。以下将永远不会在String 上工作:

    <p:inputText value="#{men}" />
    

    你有两个选择:

    1. 创建一个真实的模型类。您可以在以下答案中找到完整的示例:


    2. 改为按行索引设置值:

      <h:dataTable binding="#{table}" value="#{person.guys}">
          <h:column>
              <p:inputText value="#{person.guys[table.rowIndex]}" />
          </h:column>
      </h:dataTable>
      

      (注意:表格不需要额外的 bean 属性!代码原样)

      这基本上是一个person.getGuys().add(table.getRowIndex(), submittedValue)。 IE。 setter 在 List 本身上调用,效果很好。另请参阅以下有关ui:repeat的相关答案:

    【讨论】:

    • 谢谢!那效果很好。您知道如何在不刷新页面的情况下添加新行吗?我想我应该使用ajax,但我不确定如何。我是否要创建一个未渲染的 inputText,然后在我想添加另一行时渲染它?
    • 只需将&lt;f:ajax execute="@form" render="@form"/&gt; 嵌套在&lt;h:commandButton&gt; 中,或将&lt;h:commandButton&gt; 替换为&lt;p:commandButton update="@form"&gt;。以后,请在此处作为单独的问题提出单独的问题。
    • 对不起。下次我会这样做。非常感谢!
    【解决方案2】:

    您永远不会更新您的列表,您只是在添加空项目。你应该这样做: Person.java (viewscoped)

    public class Person implements Serializable {
      private List<String> guys = new ArrayList<String>();
      private HtmlDataTable dtGuys;
    
      public void addNewItem() {
        guys.add("");
      }
    
      public void addToList(ValueChangeEvent e) {
        guys.set(dtGuys.getRowIndex(), e.getNewValue().toString());
      }
    
      public String save() {
        System.out.println("saving...");
        for (String item : guys) {
            System.out.println("item= " + item);
        }
        return null;
      }
      //gettes and setters
    }
    

    form.xhtml

    <h:form id="frmPrincipal">
      <h:panelGrid columns="2">
        <h:outputText value="Guys: " />
        <h:dataTable value="#{person.guys}" var="men" binding="#{person.dtGuys}" >
          <h:column>
            <p:inputText value="#{men}" valueChangeListener="#{person.addToList}" />
          </h:column>
        </h:dataTable>
        <h:commandButton name="add" value="Add" action="#{person.addNewItem}" />
      </h:panelGrid>
      <br />
      <h:commandButton id="submit" name="submit" value="Submit" action="#{person.save}"/>
    </h:form>
    

    使用 jsf 2.0.10 和 primefaces 3.5

    【讨论】:

      【解决方案3】:

      这是因为您没有该 bean 的作用域,因此它的请求是作用域的,因此当您调用该操作时,bean 会再次创建,您可以使用 sessionScope 或 conversationScope 修复此问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 2019-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        相关资源
        最近更新 更多