使用AbstractWizardFormController提交复杂表单

系统 1959 0

使用其它类型的命令控制器,命令对象(POJO JavaBean)只装载一次,使用向导控制器,用户没完成向导页面中的一步,都会有一个命令对象装载。使用向导,我们只做一次验证是不可行的,因为如果你检查的太早的话,找到的验证问题可能是由于用户没有完成向导而导致的,相反,在完成按钮按下后检查就太迟了,因为发现的问题可能跨越了多了页面,我们应该回退到哪个页面呢?

根据  http://blog.csdn.net/daryl715/archive/2007/06/11/1647870.aspx 这篇心得的实现,我们进行修改,加入验证功能

首先编写JavaBean Vote的验证单元

 

package  model;

import  org.springframework.validation.Errors;
import  org.springframework.validation.Validator;

public   class  FeedBackValidator  implements  Validator  ... {

    
public   boolean  supports(Class cls)  ... {
        
return  cls.equals(Vote. class );
    }


    
public   void  validate(Object object, Errors errors)  ... {
        
    }

    
    
public   void  validateName(String name,Errors errors) ... {
        
if (name == null || name.equals( "" )) ... {
            errors.rejectValue(
" name " " not null " , null " name必须输入 " );
        }

    }

    
public   void  validateOption(String option,Errors errors) ... {
        
if (option == null || option.equals( "" )) ... {
            errors.rejectValue(
" option " " not null " , null " option必须输入 " );
        }

    }

    
public   void  validateResult(String result,Errors errors) ... {
        
if (result == null || result.equals( "" )) ... {
            errors.rejectValue(
" result " " not null " , null " result必须输入 " );
        }

    }

    
public   void  validateId(String id,Errors errors) ... {
        
if (id == null || id.equals( "" )) ... {
            errors.rejectValue(
" id " " not null " , null " id必须输入 " );
        }

    }


}

 

修改train-servlet.xml,注入validator

 

< bean  id ="FeedbackController"  class ="Action.FeedBackWizardController" >
  
< property  name ="successView" >< value > formWizard/thankyou </ value >   </ property >
  
< property  name ="cancelView" >< value > formWizard/first </ value >   </ property >
  
< property  name ="commandClass" >< value > model.Vote </ value ></ property >
  
< property  name ="validator" >
    
< bean  class ="model.FeedBackValidator" />
  
</ property >
  
< property  name ="pages" >
    
< list >
      
< value > formWizard/first </ value >
      
< value > formWizard/id </ value >
      
< value > formWizard/name </ value >
      
< value > formWizard/option </ value >
      
< value > formWizard/result </ value >
    
</ list >
  
</ property >
</ bean >

 

修改页面,以id.jsp为例

<body>
  <spring:bind path="command.id">
   <form action="feedback.mvc" method="post">
     id: <input type="text" name="id" value="<c:out value="${status.value}"/>"/>
      <c:if test="${status.error}">
          <font color="#FF0000">
          错误:
           <c:forEach items="${status.errorMessages}" var="error">
                <c:out value="${error}"/>
           </c:forEach>
          </font>
        </c:if>
     <input type="submit" value="下一步" name="_target2" />

     <input type="submit" value="取消" name="_cancel"/> 
      <input type="submit" value="完成" name="_finish"/>
   </form>
   </spring:bind>
  </body>

 

其他页面和id.jsp类似

控制器:新覆盖了validatePage方法,实现验证功能

 

package  Action;

import  java.util.Enumeration;

import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

import  model.FeedBackValidator;
import  model.Vote;

import  org.springframework.validation.BindException;
import  org.springframework.validation.Errors;
import  org.springframework.web.servlet.ModelAndView;
import  org.springframework.web.servlet.mvc.AbstractWizardFormController;
import  org.springframework.web.util.WebUtils;

public   class  FeedBackWizardController  extends  AbstractWizardFormController  ... {

    
private  String successView;
    
private  String cancelView;

    
protected   void  validatePage(Object object, Errors errors,  int  page, boolean  isFinish)  ... {
        Vote vote
= (Vote)object;
        FeedBackValidator feedBackValidator
= (FeedBackValidator)getValidator();
        
if (page == 1 ) ... { // 检查第一页的id
            feedBackValidator.validateId(vote.getId(), errors);
        }

        
if (page == 2 ) ... { // 检查第二页的name
            feedBackValidator.validateName(vote.getName(), errors);
        }

        
if (page == 3 ) ... { // 检查第三页的option
            feedBackValidator.validateOption(vote.getOption(), errors);
        }

        
if (page == 4 ) ... { // 检查第四页的result
            feedBackValidator.validateResult(vote.getResult(), errors);
        }

        
if (isFinish) ... {
            
// 表单向导结束
            System.out.println( " form finished " );
        }

    }


    
public  String getCancelView()  ... {
        
return  cancelView;
    }


    
public   void  setCancelView(String cancelView)  ... {
        
this .cancelView  =  cancelView;
    }


    
public  String getSuccessView()  ... {
        
return  successView;
    }


    
public   void  setSuccessView(String successView)  ... {
        
this .successView  =  successView;
    }


    
protected  ModelAndView processCancel(HttpServletRequest request, HttpServletResponse response, Object object, BindException exception)  throws  Exception  ... {

       
return   new  ModelAndView( this .getCancelView());
    }

 

    
protected  ModelAndView processFinish(HttpServletRequest request,
            HttpServletResponse response, Object object, BindException exception)
            
throws  Exception  ... {
        Vote vote
= (Vote)object;
        
        
return   new  ModelAndView( this .getSuccessView(), " vote " ,vote);
    }


}



使用AbstractWizardFormController提交复杂表单的验证解决方案


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论