我在创建dataTable时遇到问题,其中每一行都有一个inputText和一个commandLink。单击链接时,仅提交行的inputText数据。
这样的东西?
<h:dataTable value="#{bean.items}" var="item">
<h:column>
<h:inputText value="#{bean.value}"/>
</h:column>
<h:column>
<h:commandLink action="#{bean.save}" value="save">
<f:setPropertyActionListener target="#{bean.item}" value="#{item}" />
</h:commandLink>
</h:column>
</h:dataTable>
豆:
@RequestScoped
public class Bean {
private Item item;
private String value;
现在,实际上,它正在使用最后一行的inputText
来填充value
。我包裹了另一个h:form
,但它破坏了其他东西,我已经知道嵌套的h:form
不是正确的方法嘿嘿
这样做的正确方法是什么?
感谢。
答案 0 :(得分:6)
您将所有HTML输入元素的值绑定到同一个bean属性。如果所有这些HTML输入元素都在同一个表单中,这当然不会起作用。随后,所有值都按照表格中输入的顺序设置在同一属性上。这就是你最后得到最后一个价值的原因。您希望将移动该表单移至<h:column>
内部(移动;因此不要添加/嵌套另一个)。
然而,通常的方法是将输入字段绑定到迭代对象。
<h:inputText value="#{item.value}"/>
另一种方法是,如果你真的需要在表格周围放置表单,那么将Map<K, V>
作为bean属性,其中K
表示{{1}后面对象的唯一标识符的类型}和#{item}
代表V
的类型。我们假设它是value
和Long
:
String
与
private Map<Long, String> transferredValues = new HashMap<Long, String>();
// +getter (no setter necessary)
这样你可以在action方法中获得它,如下所示:
<h:inputText ... value="#{bean.values[item.id]}" />
顺便说一下,如果您碰巧定位支持EL 2.2(Tomcat 7,Glassfish 3等)的Servlet 3.0容器,那么您也可以将String value = values.get(item.getId());
作为方法参数传递而无需#{req}
。
<f:setPropertyActionListener>