数据绑定流程
1.mvc主框架将ServletRequest对象及目标方法入参实例传递给WebDataBinderFactory实例
以创建DataBinder实例对象
2.DataBinder调用装配在Springmvc上下文中的ConversionService组件进行数据类型转换。
数据格式化工作。将Servlet中的请求信息填充到入参对象中
3.调用Validate组件对已经绑定的请求消息入参对象进行数据合法性校验,并最终生成数据绑定
结果BindingData对象
4.Springmvc抽取BindingResult中入参对象和校验错误对象,将它们赋给处理方法的响应入参
package com.hous.crud.converter;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import com.hous.crud.bean.Department;
import com.hous.crud.bean.Employee;
@Component
public class EmployeeConverter implements Converter<String, Employee> {
@Override
public Employee convert(String source) {
if(source != null) {
String[] values = source.split("/");
//hous/me@125.com/1/103
if (values != null && values.length == 4) {
String lastName = values[0];
String email = values[1];
Integer gender = Integer.parseInt(values[2]);
Department department = new Department();
department.setId(Integer.parseInt(values[3]));
Employee employee = new Employee(null, lastName, email, gender, department);
return employee;
}
}
return null;
}
}
<mvc:annotation-driven conversion-service="conversionService"/> <!-- 将自定义的转换器注册到springmvc上下文中 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="employeeConverter"/> </set> </property> </bean>
<form action="emp/add" method="post">
<input name="employee" type="text" value="hous/me@125.com/1/103">
<input type="submit" value="提交"/>
</form>
@RequestMapping(value={"/emp","/emp/add"}, method=RequestMethod.POST)
private String add(Employee employee){
employeeDao.save(employee);
return "redirect:/list";
}
@InitBinder
由@InitBinder标识的方法,可以对WebDataBinder对象进行初始化。
WebDataBinder是DataBinder的子类,用来完成由表单字段到JavaBean属性绑定
@InitBinder方法不能有返回值,必须声明为void
@InitBinder方法参数通常是WebDataBinder
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
dataBinder.setDisallowedFields("lastName");
}
关于mvc:annotation-driven
<mvc:annotation-driven/>会自动注册
RequestMappingHandlerMapping,
RequestMappingHandlerAdapter,
ExceptionHandlerExceptionResolver三个bean
还提供以下支持:
-支持ConversionService实例对表单参数进行类型转换
-支持使用@NumberFormat、@DataTimeFormat注解完成数据类型的格式化
-支持使用@valid注解对JavaBean实例JSR303验证
-支持使用@RequestBody和@ResponseBody注解
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;
@NumberFormat(pattern="#,###,###.#")
private Float salary;