2012-07-13 58 views
0

我有一个非常简单的问题。以下是我的JSP代码,其中我显示了多个行中的复选框。默认情况下,所有复选框都被选中,如果用户想忽略某一行,他将取消选中该行的复选框。html-el:在Struts验证错误显示后检查复选框

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

<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> 
+0

你的表单的setSomeCheckboxes属性是做什么的?如果可能的话,发布此代码和getSomeCheckboxes,并在您的操作中显示验证的代码。 – 2012-07-16 09:22:23

回答

1

当你提交的数据和Struts以下的事情发生:

  • Struts有一个front controller,所有的请求都在经历这种控制器。这是ActionServlet类,然后根据在struts-config.xml中配置的内容将请求传递给相应的Action类。
  • 在此之前,如果是会话保存表单,则会构建或重用一个ActionForm实例;
  • reset()在ActionForm上被调用。 This is where you reset checkbox properties to false。这是必需的,因为未提交的HTML复选框在提交时不会在请求上发送,所以Struts不会为它们请求数据绑定(如果在加载页面时检查了它们,即使用户在提交时未选中它们,也会检查它们);
  • ActionForm中填充了请求数据(任何选中的复选框现在都被选中,那些没有被提交的提交者因为前面的重置而未被选中);
  • ActionForm的validate()方法被调用,如果在struts-config.xml中被指定的话;
  • 如果验证失败,则控件返回到输入JSP,如果在struts-config.xml中这样指定的(提交的数据是页面将显示的内容,因为它在ActionForm上);
  • 如果代替验证成功,则调用Action类的​​方法;
  • Action类执行它的任务并转发给某个JSP。

这是你如何使用Struts?我的猜测是你在Action类中做了一些填充/重置/验证,当验证失败时,你用默认数据重新加载ActionForm。

检查您的ActionForm的reset()validate()代码和您的Action类​​并查看数据正在检查的位置。