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

我有jsf页面:

.... 

....

并且具有字符串ArrayList的托管bean:

 @ManagedBean @ViewScoped public class NewMusician { private ArrayList strings = new ArrayList(); public NewMusician() { strings.add("olo"); } public ArrayList getStrings() { return strings; } public void saveNewMusician() { ..... } .... } 

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

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

  

一切都变好了。

问题:为什么使用1级getter 是不正确的,但使用2级getter: 是好的?

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

 public class Musician { private String preferredGenre; // Add/generate constructor, getter, setter, etc. } 

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

 @ManagedBean @ViewScoped public class NewMusician { private ArrayList musicians = new ArrayList(); public NewMusician() { musicians.add(new Musician("olo")); } public ArrayList getMusicians() { return musicians; } public void saveNewMusician() { // ... } // ... } 

你的数据表: