Form提交时,只有CheckBox处于勾选状态,生成的HTTP Request中的查询字符串才会包含CheckBox对应的参数项;否则,生成的HTTP Request中的查询字符串中无CheckBox对应的参数项。
例如,对于以下这个HTML Form(使用了Struts HTML Tag):
<html:form action="/checkAction.do" method="GET">
<html:checkbox property="checked" value="true"/><br/>
<html:submit/><html:reset/>
</html:form>
当用户勾选页面上的checkbox并提交时,HTTP请求中的查询字符串是:"checked=true";如果用户没有勾选checkbox就提交,HTTP请求则无查询字符串(request.getQueryString()返回null)。这样就导致一个问题:每当用户取消checkbox选中状态并提交时,Struts不会调用ActionForm(设为CheckForm)中的setChecked(boolean bool)方法将checked属性设为false。
解决之道是在CheckForm中override其父类的reset(ActionMapping mapping, HttpServletRequest request)方法(父类ActionForm的reset(ActionMapping mapping, HttpServletRequest request)方法只是一个空实现):
public void reset(ActionMapping mapping, HttpServletRequest request) {
setChecked(false);
}
Struts在从HTTPRequest中获取参数值填充到ActionForm的各个属性之前会调用ActionForm的reset()方法。这样,我们就实现了“CheckForm的checked属性值为false,除非用户在页面上选中了checkbox并提交”的逻辑。