数据绑定流程
- 使用springmvc框架有诸多好处,其中较为突出的就是它的数据绑定。
- 当我们的前端传过来一个表单的时候,我们只需要使用一个类对象(如Student对象)就接收,springmvc将帮我们把属性一一对应的填充进去。这就是数据绑定。
- 数据绑定过程中,springmvc帮我们把前端传来的字符串,转化为属性对应的数据类型(如String->Integer)
- 那么,springmvc是如何实现数据绑定的呢,我们来简单分析一下。
- springmvc将request对象以及目标方法的参数传给
WebDataBinderFactory
实例,得到一个DataBinder
DataBinder
调用ConversionService
组件来完成数据类型的转换,数据格式化。- 调用
Validator
组件对数据进行合法性校验,并最终生成数据绑定结果BindingData
对象- Spring MVC 抽取
BindingResult
中的入参对象和校验错误对象,将它们赋给处理方法的响应入参
下面配上一张示意图(该图来自尚硅谷)
自定义类型转换器
控制层
@RequestMapping("/testConverter")
public String testConverter(@RequestParam("student")Student student){
StudentDao.add(student);
return "redirect:/student";
}
前端
界面中只有一个input,输入一串字符串
<form action="testConverter" method="post">
<input type="text" name="student" />
<input type="submit" value="add"/>
</form>
springmvc如何将String转化为Student对象
写一个自己的类型转换器
package com.zj.converter;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;
import com.zj.model.Address;
import com.zj.model.Student;
@Component
public class StudentConverter implements Converter<String, Student> {
@Override
public Student convert(String source) {
//将String类型转化为Student类型
//source形式: 123-tom-男-福建省-泉州市
Student student = null;
if(source!=null){
String[] values = source.split("-");
if(values!=null && values.length==5){
student = new Student();
student.setStudentId(Integer.parseInt(values[0]));
student.setName(values[1]);
student.setSex(values[2]);
student.setAddress(new Address(values[3], values[4]));
}
}
return student;
}
}
这个类实现了spring的Converter,记得给它加上
@Component
注解,让springmvc帮我们创建bean
在springmvc配置文件中配置
<!-- 在这里启用转换器 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 定义自定义类型转换器的bean -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 这里是我们自己定义的类型转换器 -->
<!-- 注意,这里首字母要小写,因为springmvc帮我们创建bean的时候,是以类名首字母小写命名 -->
<ref bean="studentConverter"/>
</set>
</property>
</bean>
按以上的方法,就可以轻松的实现自定义类型转换器啦。