1. springmvc的数据绑定流程
如图,根据request参数和方法入参会生成一个DataBinder对象,然后会由ConversionService进行数据类型转换以及Validator进行数据校验最终生成BindingResult对象
(反正是这个意思吧,:-D)
2. 自定义数据转化器
2.1 编辑自定义转换器并实现Converter接口
/** * Created by pawn on 2017/9/23. */ @Component public class EmployeeConvertor implements Converter<String,Employee> { @Autowired DepartmentDao departmentDao ; @Override public Employee convert(String s) { //GG-gg@pawn.com-1-1 if(s != null){ String[] vals = s.split("-") ; if(vals != null || vals.length == 4){ String lastName = vals[0] ; String email = vals[1] ; int gender = Integer.parseInt(vals[2]) ; int departmentId = Integer.parseInt(vals[3]) ; Department department = departmentDao.getDepartment(departmentId); return new Employee(null,lastName,gender,email,department) ; } } return null; } }
2.2 spring-mvc中进行配置
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven> <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="employeeConvertor"></ref> </set> </property> </bean>
2.3 编写目标方法使用
@RequestMapping(value = "/savewithstring.do") public String savaWithString(@RequestParam("employee") Employee employee){ System.out.println("=========>Save"); employeeDao.save(employee) ; return "redirect:../page/emp/list.do" ; }
2.4 EmployeeConverter转换器会将string类型参数转换为Employee对象,有一点不明白的是,之前提到的目标方法参数没有@RequestParam注解,但是表单里面的各个字段能自动填充到Employee对象中,如果有大神能看到,求帮忙留言解惑!
3. <mvc:annotation-driven>作用
原理一窍不通,不过我想的是这个注解一定要加上,否则估计会生成很多奇怪的问题
4 . @InitBinder注解
5. 数据格式化
5.1 保证spring-mvc.xml中有<mvc:annotation-driven>注解
自定义conversion-service时需要使用 FormattingConversionServiceFactoryBean
5.2 在目标属性中添加@DateTimeFormat和@NumberFormat等注解
5.3 个人理解: 目标方法的入参如果有@ModelAttribute注解应该和无注解一样,是已经经过数据转换、数据绑定以及数据格式化后的最终产物,而加了@RequestParm注解的入参只是经过数据转换的中间产物,瞎想的,如果有误,麻烦留言更正