在List <String>上使用<h:dataTable> <h:inputText>不会更新模型值

Sha*_*ahe 3 string datatable jsf input

我有以下数据表:

<h:dataTable var="row" value="#{myBean.listOfStrings}">
    <h:column> 
         <h:inputText value="#{row}" />
    </h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

哪个与List<String>:

private List<String> listOfStrings = new ArrayList<String>();

public List<String> getListOfStrings() {
    return listOfStrings;
}

public void setListOfStrings(List<String> listOfStrings) {
    this.listOfStrings = listOfStrings;
}
Run Code Online (Sandbox Code Playgroud)

当我在字段中输入一个值并保存表单时,它没有将值传递给列表中的字段,这是设置null,我在这里做错了什么?

Bal*_*usC 5

这个String类是不可变的.它没有实例值的setter.getter在这个构造中基本上是Object#toString()由EL隐式调用的方法,它巧合地返回字符串值本身.

您需要将更改的值设置为新的列表项.您可以通过列表中的括号表示法来执行此操作,从而传递列表索引:#{myBean.listOfStrings[index]}.

所以,这应该做,利用UIData#getRowIndex()列表索引:

<h:dataTable binding="#{table}" value="#{myBean.listOfStrings}" var="row">
    <h:column> 
         <h:inputText value="#{myBean.listOfStrings[table.rowIndex]}" />
    </h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

(注意:值的表达式binding是as-is!不要将它绑定到bean属性)

也可以看看: