Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JF2动态表单元素不';我不记得每次添加元素时输入和页面都会刷新_Java_Forms_Dynamic_Jsf 2 - Fatal编程技术网

Java JF2动态表单元素不';我不记得每次添加元素时输入和页面都会刷新

Java JF2动态表单元素不';我不记得每次添加元素时输入和页面都会刷新,java,forms,dynamic,jsf-2,Java,Forms,Dynamic,Jsf 2,我正在尝试创建一个带有添加行选项的表单。但是,在我键入一些输入并再次单击“添加”按钮后,我输入的输入将消失。我不确定我的代码出了什么问题。此外,当我单击add按钮时,页面将刷新。有没有办法停止此页面刷新 Person.java public class Person{ private List<String> guys = new ArrayList<String>(); public List<String> getGuys() { re

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

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("");
}
}
公共类人物{
private List guys=new ArrayList();
公共列表getGuys(){
回头客;
}
公共部门人员(列出人员){
这个。伙计们=伙计们;
public void addNewItem(){
加上(“”);
}
}
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>
<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>



这是因为您没有该bean的作用域,所以它的请求作用域是有限的,所以当您调用操作时,会再次创建该bean,您可以使用sessionScope或conversationScope解决此问题如果您从不更新列表,您只是添加空项。您应该执行以下操作: Person.java(可视范围)

public类Person实现可序列化{
private List guys=new ArrayList();
私有HTMLDATABLE DTGYES;
public void addNewItem(){
加上(“”);
}
公共无效添加列表(ValueChangeEvent e){
set(dtGuys.getRowIndex(),e.getNewValue().toString());
}
公共字符串保存(){
System.out.println(“保存…”);
用于(字符串项:guys){
System.out.println(“项=”+项);
}
返回null;
}
//盖特和塞特
}
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>
<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>



使用JSF2.0.10和primefaces 3.5,如果bean被放置在功能需求的正确范围内,视图范围内,剩下的唯一一个主要错误是,您期望
字符串
类有一些神奇的setter方法

它没有。
字符串
类是不可变的。以下内容在
字符串
上永远不会起作用:


您有两种选择:

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


  • 改为按行索引设置值:

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

    这基本上是一个
    person.getGuys().add(table.getRowIndex(),submittedValue)
    。也就是说,setter是在
    列表
    本身上调用的,它工作得非常好。另请参见以下有关
    ui:repeat
    的相关答案:


  • 谢谢!效果很好。你知道如何在不刷新页面的情况下添加新行吗?我想我应该使用ajax,但我不确定如何使用。我是否创建一个未呈现的输入文本,然后在我想添加另一行时呈现它?只需在
    中嵌套
    ,或者用
    替换
    。将来,p请在这里单独提问。对不起。下次我会问的。非常感谢!