我有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}"/>
是否正确?
答案 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>