我在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
的额外复选框,则此转换错误会消失。
据推测,单个复选框似乎未正确映射到Long
,List<Long>
类型的值列表。
当HTML表格中只显示一行时,有什么方法可以消除此错误?
答案 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"/>