使用其它类型的命令控制器,命令对象(POJO JavaBean)只装载一次,使用向导控制器,用户没完成向导页面中的一步,都会有一个命令对象装载。使用向导,我们只做一次验证是不可行的,因为如果你检查的太早的话,找到的验证问题可能是由于用户没有完成向导而导致的,相反,在完成按钮按下后检查就太迟了,因为发现的问题可能跨越了多了页面,我们应该回退到哪个页面呢?
根据 http://blog.csdn.net/daryl715/archive/2007/06/11/1647870.aspx这篇心得的实现,我们进行修改,加入验证功能
首先编写JavaBean Vote的验证单元
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
<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方法,实现验证功能
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);
}
}