在用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