使用Struts2中的复选框删除多行

时间:2014-01-22 18:33:20

标签: java checkbox struts2 delete-row

我在HTML表格中显示行,表格的每一行中都有一个复选框,如下所示。

<s:iterator value="objects" status="loopStatus">

    <td>
        <s:label for="%{id}" value="%{#loopStatus.index+1}"/>
        <s:checkbox id="%{id}" name="chk" fieldValue="%{id}" value="false"/>
    </td>

    <!--Other columns-->

</s:iterator>

objects是在动作类中初始化的JPA实体List<Entity>的对象列表。 id是类型Long的值,对应于数据库中的主键列。


提交表单时,这些复选框的值将设置为操作类中的相应属性。

private List<Long>chk;

//setters & getters.

所选复选框的值已正确设置为此属性chk。然后使用此值列表从数据库中删除行。


这很好用。如果表中只有一行,则会出现问题。在这种情况下,执行不必要的转换错误,同时执行删除以外的操作(如更新/插入行),这需要选中此复选框,这是非常不必要的,只有在执行删除时才会发生。

  

字段“chk”的字段值无效。

如果我故意添加一个名为chk的额外复选框,则此转换错误会消失。

据推测,单个复选框似乎未正确映射到LongList<Long>类型的值列表。

当HTML表格中只显示一行时,有什么方法可以消除此错误?

2 个答案:

答案 0 :(得分:1)

试试这个明确引用数组索引的那个:

<s:iterator value="objects" status="loopStatus">

    <td>
        <s:label for="%{id}" value="%{#loopStatus.index+1}"/>
        <s:checkbox id="%{id}" name="chk[%{#loopStatus.count}]" fieldValue="%{id}" value="false"/>
    </td>

    <!--Other columns-->

</s:iterator>

答案 1 :(得分:1)

如果您不选中单个复选框,则默认设置为false。您可以在checkbox拦截器uncheckedValue属性中设置默认值。

此外,您可以考虑添加隐藏字段,以便checkbox拦截器在只有一个时会认为有多个chekbox,并且不会添加默认值。

对于您的复选框,隐藏的字段名称将为__checkbox_chk

<s:hidden name="__checkbox_chk"/>