如何保存h:dataTable的h:inputText值?我的尝试只保存最后一行的值

时间:2012-03-17 04:07:25

标签: jsf input datatable

我在创建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不是正确的方法嘿嘿

这样做的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:6)

您将所有HTML输入元素的值绑定到同一个bean属性。如果所有这些HTML输入元素都在同一个表单中,这当然不会起作用。随后,所有值都按照表格中输入的顺序设置在同一属性上。这就是你最后得到最后一个价值的原因。您希望将移动该表单移至<h:column>内部(移动;因此不要添加/嵌套另一个)。

然而,通常的方法是将输入字段绑定到迭代对象。

<h:inputText value="#{item.value}"/>

另一种方法是,如果你真的需要在表格周围放置表单,那么将Map<K, V>作为bean属性,其中K表示{{1}后面对象的唯一标识符的类型}和#{item}代表V的类型。我们假设它是valueLong

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>

另见: