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

erc*_*iou 1 datatable jsf input

我在创建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>
Run Code Online (Sandbox Code Playgroud)

豆:

@RequestScoped
public class Bean {

    private Item item;
    private String value;
Run Code Online (Sandbox Code Playgroud)

现在,就像它一样,它正在使用最后一行inputText填充value.我包裹了另一个h:form,但它破坏了其他东西,我已经知道嵌套h:form不是正确的方法来做它

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

谢谢.

Bal*_*usC 6

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

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

<h:inputText value="#{item.value}"/>
Run Code Online (Sandbox Code Playgroud)

另一种方法是,如果你真的需要在表格周围Map<K, V>放置表单,那就是有一个as bean属性,K表示后面对象的唯一标识符的类型,#{item}V表示其类型value.让我们假设它是LongString:

private Map<Long, String> transferredValues = new HashMap<Long, String>();

// +getter (no setter necessary)
Run Code Online (Sandbox Code Playgroud)

<h:inputText ... value="#{bean.values[item.id]}" />
Run Code Online (Sandbox Code Playgroud)

这样你就可以在action方法中得到它,如下所示:

String value = values.get(item.getId());
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果碰巧指定的Servlet容器3.0支持EL 2.2(Tomcat的7,Glassfish的3等),则也可以只通过#{req}作为而不需要一个一个方法参数<f:setPropertyActionListener>.

<h:commandLink ... action="#{bean.save(item)}" />
Run Code Online (Sandbox Code Playgroud)

也可以看看: