【发布时间】:2011-06-05 10:52:56
【问题描述】:
我有 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 of Strings 的托管 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“字符串”包含相同的旧值“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}"/> 可以?
【问题讨论】: