SimpleFormController以上两种主要能力,没有传授打通“经脉之法”。还好,BaseCommandController后继有人,AbstractFormController在BaseCommandController
的“武功基础上,发展了一套模板化的form处理流程。至此,从数据封装、验证、再到处理流程的模板化,整个规范化即建立成功
SimpleFormController专门面向单一的表单处理,而AbstractWizardFormController则提供多页面向导的交互能力。
要让SimpleFormController帮助简化Web请求处理工作,下面来看一下SimpleForm与生俱来的三种主要能力!
1、数据绑定
在web应用程序中使用数据绑定的最主要好处,我们再也不用自己通过request.getParameter(String)方法遍历获取每个请求参数,然后
根据需要转型为自己需要的类型了。SpringMVC提供的数据绑定功能帮助我们自动提取HttpServletResuqest中相应的参数,然后转型为
需要的对象类型。唯一要做的就是为数据绑定提供一个目标对象,在spring中称为Command对象,此后的Web处理逻辑直接同
数据绑定完成的Command对象打交道即可。
可以通过commandClass属性设置数据绑定的目标Command对象类型,如下:
<property name="commandClass">
<value>com.web.springMVC.model.UserModel</value>
</property>
<property name="commandName">
<value>command</value>
</property>
或者直接在子类的构造方法中直接设定,如下:
public Login() {
//设置数据绑定的目标Command对象类型,这里直接实现了将请求参数绑定到对象上
setCommandClass(UserModel.class);
setCommandName("user");
//对象的名称setCommandName("user");
}
有了即将绑定到目标Command对象的数据来源之后,我们即可将这些数据根据Command对象各个域属性定义的类型进行数据转型,然后设置到Command对象上
从参数获取到参数转型并绑定到Command对象上,这整个流程最终以org.springframwork.web.bind.ServletRequestDataBinder的形式进行了封装
该类常见的使用的代码如下:
UserModel user=new UserModel();
ServlerRequestDataBinder dataBinder=new ServletRequestDataBinder(user);
dataBinder.bind(request);
Errors errors=binder.getErrors();
而之后,我们只需要使用数据绑定完成的Command对象进行后继处理就可以了。
2、Spring框架数据验证简介
Spring 数据验证框架核心类为org.springframework.validation.Validator和org.springframework.validation.Errors,Validator负责
具体的验证逻辑,而Errors负责承载验证过程中出现的错误信息,二者之间的纽带则是Validator接口定义的主要验证方法validato(target,errors)
把验证工作全部交给Validator的实现类去完成。下面是一个Validator的一个实现类:
public class UserValidator implements Validator{
//support(Class)方法定义,是为了进一步限定Validator实现类的职责,界定验证的范围
@Override
public boolean supports(Class clazz) {
return clazz.equals(UserModel.class);
}
@Override
public void validate(Object obj, Errors err) {
UserModel user=(UserModel)obj;
if(user.getPhone().length()<7){
user.setCreateTime(null);
err.reject("phoneErr", "电话号码位数要大于7");
}
else if(user.getAge()<=0){
user.setCreateTime(null);
err.reject("ageErr", "年龄要大于0");
}
}
}
在SpringMVC中,Validator的执行以及后继的错误信息处理,将由BaseCommandController或者其子类接管,我们通常不需要操心这些
实现细节,唯一要做的就是通过相应的setter方法,注入需要使用的Validator实现类,如下使用IoC注入:
<!-- 这里直接实现了数据验证 -->
<property name="validator" ref="userValidator"></property>
3、深入表单处理流程
在Web请求到达SimpleFormController之后,SimpleFormController将首先通过方法isFormSubmission(request)判明当前请求
是否为表单提交请求,isFormSubmission(request)的默认实现如下:
protected boolean isFormSubmission(HttpServletRequest request){
return "POST".equals(request.getMethod());
}
整个表单处理流程将以isFormSubmission(request)的判定结果为标准,划分为”表单显示阶段“和”处理表单提交阶段“两个逻辑处理阶段。如果isFormSubmission(request)返回false,通常表示初次请求,这时我们需要为用户显示相应的交互表单,这也是表单显示阶段将要
做的事情。否则,认为用户已经在表单中编辑完数据,需要处理,SimpleFormController将启用"处理表单提交阶段"流程处理逻辑。
表单显示阶段流程分析
(1)创建或者获取表单对应的Command对象
此时formBackingObject()将默认通过反射实例化我们为SimpleFormController指定的Command对象实例。某些时候formBackingObject()
的默认行为不能符合当前场景要求,比如要更新一下实体的信息,那么在为用户显示表单的时候,就应该将要更新的实体的数据加载
到表单中,以便用户在原有数据的基础上进行更改,这时就要覆写formBackingObject(),改为自己管理Command对象的初始化
(2)初始化DataBinder
在执行请求参数到Command对象的数据绑定之前,初始化一个可用的DataBinder实例,就是ServletRequestDataBinder
有了可用的ServletRequestDataBinder之后,可以对其进行定制,比如添加自定义的PropertyEditor以支持特殊数据类型的数据绑定,或者排除
某些不想绑定的请求参数,这些定制行为通过initBinder()方法引入
(3)执行数据绑定
这一步只有在bindOnNewForm属性被设置为true的情况下才会触发执行,bindOnNewForm默认属性是false,所以