~~
记得项目中有好多地方是wizard模式的交互。我常常建议组员按照SpringMVC提供的参考来开发。但当时比较紧张,《spring开发参考》也没有太多的说明,又没有时间去研究AbstractWizardFormController的用法。所以无法给他们太多的指导,任由他们自己想办法实现功能再说。毕竟按时完成任务还是主要的!
wizard模式一般都分几步,其中我们至少有两步需要跟数据库交互。如果第一次和数据库交互失败则要跳到错误页面,问题是出现在这里。我们错误认为wizard是一走到底,中间出现问题就不知道怎么处理了。故用很多普通controller来实现。
今天看了spring的源代码,发现我们的思维有点问题。把思维放宽一点来看,不管和数据库交互多少次,只要失败就认为是校验不通过。spring提供现成的校验接口,如果校验不通过,想去那个页面就很简单了。基本不用我们操心。
参考代码如下(摘自jpetstore):
protected
void
validatePage(Object command, Errors errors,
int
page)
...
{
OrderForm orderForm = (OrderForm) command;
OrderValidator orderValidator = (OrderValidator) getValidator();
errors.setNestedPath("order");
switch (page) ...{
case 0:
orderValidator.validateCreditCard(orderForm.getOrder(), errors);
orderValidator.validateBillingAddress(orderForm.getOrder(), errors);
break;
case 1:
orderValidator.validateShippingAddress(orderForm.getOrder(), errors);
}
errors.setNestedPath("");
}
OrderForm orderForm = (OrderForm) command;
OrderValidator orderValidator = (OrderValidator) getValidator();
errors.setNestedPath("order");
switch (page) ...{
case 0:
orderValidator.validateCreditCard(orderForm.getOrder(), errors);
orderValidator.validateBillingAddress(orderForm.getOrder(), errors);
break;
case 1:
orderValidator.validateShippingAddress(orderForm.getOrder(), errors);
}
errors.setNestedPath("");
}