为什么输入(例如h:inputText)嵌套在h:dataTable中不更新Bean模型?

时间:2011-01-07 18:11:32

标签: java jsf datatable jsf-2

我有jsf页面:

....
<form jsfc="h:form" action="">
  <h:dataTable value="#{newMusician.strings}" var="preferredMusicGenre" id="musicGenresSelectTable">
    <h:column>
      <h:inputText value="#{preferredMusicGenre}" immediate="true"/>
     </h:column>
   </h:dataTable>
   <p>
      <input type="submit" jsfc="h:commandButton" value="Add" action="#{newMusician.saveNewMusician}"/>
   </p>
</form>
....

具有字符串ArrayList的托管bean:

@ManagedBean
@ViewScoped
public class NewMusician {

    private ArrayList<String> strings = new ArrayList<String>();

    public NewMusician() {
        strings.add("olo");
    }
    public ArrayList<String> getStrings() {
        return strings;
    }
    public void saveNewMusician() {
    .....
    }
....
}

问题:当我更改文本并按下保存按钮时,在saveNewMusician()方法中,我可以看到ArrayList“strings”包含相同的旧值“olo”,但不包含我在输入字段中插入的值。 如果使用h:selecOneMenu,则会出现同样的问题。

如果不使用字符串,则改变情境,但是聚合字符串并将值设置为字符串的对象。 所以,如果我将使用一些POJO并将inputText更改为:

<h:inputText value="#{preferredMusicGenrePojo.string}" immediate="true"/>

一切都变好了。

问题: 为什么使用1级getter <h:inputText value="#{preferredMusicGenre}"/>是不正确的,但使用2级getter:<h:inputText value="#{preferredMusicGenrePojo.text}"/>是否正确?

1 个答案:

答案 0 :(得分:3)

String是不可变的。它没有值的setter。你需要将它包装在一个bean(或你称之为POJO)中。

public class Musician {
    private String preferredGenre; 

    // Add/generate constructor, getter, setter, etc.
}

然后按如下方式更改托管bean。

@ManagedBean
@ViewScoped
public class NewMusician {

    private ArrayList<Musician> musicians = new ArrayList<Musician>();

    public NewMusician() {
        musicians.add(new Musician("olo"));
    }

    public ArrayList<Musician> getMusicians() {
        return musicians;
    }

    public void saveNewMusician() {
        // ...
    }

    // ...
}

你的数据表:

<h:dataTable value="#{newMusician.musicians}" var="musician">
    <h:column>
        <h:inputText value="#{musician.preferredGenre}" />
    </h:column>
</h:dataTable>