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