首先回顾了spring mvc中的表单验证和业务逻辑校验失败后,回到表单页面中显示错误信息的整个内部运行流程。
表单校验出错后回到表单注册页面是由默认的SimpleFormController的processFormSubmission方法自动完成的,王涛忘记这一点,他们覆盖了processFormSubmission方法,直接在processFormSubmission方法中执行业务逻辑校验,结果导致表单校验失败后不能回到表单注册页面。
查看帮助文档,可以了解到SimpleFormController的详细工作流程,特别是看onSubmit(Object command,BindException errors)这个方法的帮助,就知道怎样写业务逻辑校验失败的代码了。
protected ModelAndView onSubmit(Object command,
BindException errors)
{
errors.addError(new FieldError("name","用户名重复"));
return new ModelAndView(this.getFormView(),errors.getModel());
}
接着分析了onSubmit方法与doSubmitAction方法的应用区别。
讲解了如何将Validator框架集成到spring中的设计思想:
class MyValidator implements Validator
{
boolean supports(Class clazz)
{
为什么不能使用:UserCommand.class.equals(clazz);?
这主要是因为Class没有覆盖equals方法。
}
void validate(Object obj,Errors errors)
{
}
}
编写的校验方法的定义应该如下:
public static boolean validateFloatRange(java.lang.Object bean,
ValidatorAction va,
Field field,
Errors errors)
{
......
}
所以,MyValidator类的validate(Object obj,Errors errors)方法应编写成如下形式“
void validate(Object obj,Errors errors)
{
ValidateResources resources = new ValidateResources(Inputstream []);
Validator validator = new Validator(resources,"/logon");
valdiator.setParameter(Validator.PARAM_BEAN,obj);
validator.setParameter("org.springframework.validation.Errors",errors);
validator.validate();
}
我问魏奕东,相比他以前不用validator框架而编写的对表单信息进行校验的代码和这次使用validator框架编写的代码,哪个更复杂,他愿意采用哪个?显然,使用validator框架编写的代码更复杂、他更愿意用以前的方式进行表单校验,那我们为什么要使用validator框架呢?这是为了实现代码重用和校验逻辑的封装和配置使用。如果他想在公司做到更高的开发职位,他想拿到更多的工资,他就应该使用validator框架,这样,其他级别低的程序员可以不写校验代码了,而直接在validator框架中插入魏奕东写的校验方法,老板就会将从其他人身上省下的一部分工钱装入到魏奕东的口袋,呵呵!
魏奕东,别高兴得太早!你想干的这份工作,早就有人干了,这就是spring module,它模仿struts实现的validator框架,实现了调用validator框架的sring mvc的Validator,现在,我们就来看看如何使用spring module提供的validtor吧!
接着我为大家讲解了如何使用spring module提供的validtor来执行表单校验,不过,由于spring不支持动态command对象,所以,我们还无法象struts那样不写一行代码也玩个完整的view层。
杨松发现appfuse中带的spring module 1.0没有validateWhen这个校验规则,不过,我们现在用的是spring module 6.0,不用担心这个问题。
接着为大家讲了struts中的文件上传和spring mvc中的文件上传,strtus的文件上传很简单,而spring mvc中的文件上传稍微复杂一些,首先要在配置文件中配置CommonsMultipartResolver,spring mvc才会处理multipart的数据请求,接着就可以使用CommonsMultipartFile处理很大的上传文件了,不用担心数组越界的问题。王涛能够接着我讲解的思路说出ByteArrayMultipartFileEditor内部其实就是调用了CommonsMultipartFile的getByte方法来实现将上传的文件转换成字节数组的,真是不错,看来他已经有了自己的编程感觉了,呵呵。