【问题标题】:Using <h:dataTable><h:inputText> on a List<String> doesn't update model values在 List<String> 上使用 <h:dataTable><h:inputText> 不会更新模型值
【发布时间】:2014-02-09 18:01:15
【问题描述】:

我有以下数据表:

<h:dataTable var="row" value="#{myBean.listOfStrings}">
    <h:column> 
         <h:inputText value="#{row}" />
    </h:column>
</h:dataTable>

这与List&lt;String&gt;: 相关联:

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

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

public void setListOfStrings(List<String> listOfStrings) {
    this.listOfStrings = listOfStrings;
}

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

【问题讨论】:

  • 我们需要完整的 bean 类声明。我的疯狂猜测:检查 bean 的范围。
  • @StefanoSanfilippo bean 正在会话中。
  • 必须在表单内

标签: string jsf input datatable


【解决方案1】:

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

您需要将更改的值设置为新的列表项。您可以通过列表上的大括号符号来执行此操作,从而传递列表索引:#{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>

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

另见:

【讨论】:

  • 如果我的页面上有多个表格怎么办?绑定不起作用?
  • 当然不是。只是给它一个不同的名字。 binding="#{table1}"、binding="#{table2}" 等或任何最能自我记录的东西,例如binding="#{listOfValuesTable}"(期望“listOfValues”绝对不是自我记录,想想binding="#{productsTable}" value="#{bean.products}")。
猜你喜欢
  • 2012-06-02
  • 2011-06-05
  • 2021-05-15
  • 2011-07-25
  • 1970-01-01
  • 2013-03-25
  • 2022-11-13
  • 2012-06-25
  • 2018-09-10
相关资源
最近更新 更多