0

我有一个非常简单的问题。下面是我的 JSP 代码,其中我在行中显示多个复选框。默认情况下,所有复选框都被选中,如果用户想忽略某些行,他取消选中该行的复选框。

我的问题是,如果未选中行的复选框并且由于某些其他字段,如果 Struts 在屏幕上引发表单验证错误,则未选中的复选框将显示为选中状态。我错过了什么吗?如果没有 struts 验证,那么一切看起来都是正确的。

<c:forEach var="map" items="${form.displayList}" varStatus="index"> 
    <html-el:checkbox styleId="someCheckbox_${index.index}" property="someCheckboxes[${index.index}]"  />
     <td> .....</td>
     <td> .....</td>
     <td> .....</td>
</c:forEach>
4

1 回答 1

1

当您向 Struts 提交数据时,会发生以下情况:

  • Struts 有一个前端控制器,所有请求都通过这个控制器。这是ActionServlet类,然后根据配置的内容struts-config.xml将请求传递给适当的Action类。
  • 在此之前,如果ActionForm实例是会话保存的表单,则它会被构造或重用;
  • reset()在 ActionForm 上调用。这是您将复选框属性重置为 false 的地方。这是必需的,因为当您提交时,未选中的 HTML 复选框不会在请求中发送,因此 Struts 不会为它们请求数据绑定(如果它们在您加载页面时被选中,即使用户在提交时未选中它们,它们仍然处于选中状态);
  • ActionForm 填充了请求数据(现在已选中任何选中的复选框,未在提交时发送的复选框由于先前的重置而保持未选中);
  • validate()如果在中指定,则调用ActionForm 的方法struts-config.xml
  • 如果验证失败,如果在中指定,则将控件返回给输入 JSP struts-config.xml(提交的数据是页面将显示的内容,因为它在 ActionForm 上);
  • 如果验证成功,execute()则调用 Action 类上的方法;
  • Action 类完成它的工作并转发给一些 JSP。

这就是你使用 Struts 的方式吗?我的猜测是您正在 Action 类中进行一些填充/重置/验证,当验证失败时,您使用默认数据重新加载 ActionForm。

检查你的 ActionForm 的代码reset()validate()你的 Action 类execute(),看看数据在哪里被检查回来。

于 2012-07-17T20:08:59.257 回答