SpringMVC学习笔记--SimpleFormController

SimpleFormController继承了BaseCommandController的自动数据绑定和通过Validator的数据验证功能,不过BaseCommandController也只传授
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();


当然我们不用自己去写这些几乎固定套路的代码,BaseCommandController及其子类将负责调用该类完成整个绑定过程,并返回已经绑定数据的Command对象
而之后,我们只需要使用数据绑定完成的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,所以

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值