在用struts框架开发的Web应用中,一般是一个业务操作(Action)对应一个ActionForm,但对于同一个ActionForm一般有CURD(添加,修改,删除,查询)四种操作,这意味着在通常情况下一个ActionForm可能会对应着四个Action,这样在一个系统中Action的数量很大,为了减少Action的个数,Struts引入了DispatchAction,对同一类业务的操作(CURD)只用了一个继承于DispatchAction的Action。
但在配置文件中mapping,validate属性配置了对ActionForm是否进行验证。而在一个DispatchAction中有些操作(添加,修改)需要validate,删除和查询不需要验证。
有两种方法解决:
1.(我以前用的方法)把配置文件中的validate属性设为false,表示不对ActionForm进行验证(当然在validation.xml文件还是要配置该form),对需要进行验证的操作如添加,修改,则在其action方法中的显示调用validate方法进行验证。
public ActionForward add(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
DynaValidatorForm adminForm = (DynaValidatorForm) form;
//显示进行验证
ActionErrors errors=adminForm.validate(mapping,request);
if(!errors.isEmpty()){
//不符合验证规则
this.saveErrors(request,errors);
return mapping.getInputForward();
}
//验证通过,其它的操作
return mapping.findForward("success");
} 2.
把配置文件中的validate属性设为true,表示对ActionForm进行验证,然后修改ActionForm里的validate方法(这种方法不适合于动态ActionForm,因其没有validate方法)
public ActionErrors validate(
ActionMapping mapping,
HttpServletRequest request) {
String param =request.getParameter("method");
//若是添加或者修改操作,则进行验证
if(param.equals("add")||param.equals("update"))
return super.validate(mapping,request);
else
return null;//否则不验证
} 总结:两种方法均能达到目的,但一种方法对要验证的操作需要分别在其Action方法开始前显式进行验证,相比第二种方法,代码较多,而第二种方法较为简洁,但不能用于动态ActionForm中。
注:第二种来自
http://blog.csdn.net/Arqui/archive/2004/10/12/133761.aspx