数据绑定流程如下:
1.springmvc主框架将servletRequest对象及目标方法的实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象
2.DataBinder调用装配在spring mvc上下文中的ConversionService组件进行数据类型转换,格式化工作,将servlet中的请求信息填充到入参对象中
3.调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象
4.spring mvc 抽取BindingResult中的入参对象和校验错误对象,将他们赋给处理方法的响应入参
一.数据转换
1.springmvc 会按请求参数的属性名和POJO的属性名,进行自动匹配。支持级联属性。
2.自定义转换器
2.1自定义转换器实现Converter<S,T>
@Component public class EmployeeConverter implements Converter<String, Employee> { @Override public Employee convert(String source) { System.out.println("EmployeeConverter.."); if(source != null){ String[] args = source.split(","); Integer id = Integer.parseInt(args[0]); String username = args[1]; String email = args[2]; Employee employee = new Employee(id, username, email); System.out.println(source+"----convert----"+employee); return employee; } return null; } }
2.2 在springmvc的配置文件中,配置如下
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters" ref="employeeConverter"></property> </bean>
二.数据格式化
将前台的输入数据都是通过String类型传给后台的,如果entity的属性是基本类型,那么是可以正常转换的,
但是如果某些属性是java.util.Date或者是float,则不知道按什么何种格式来转换,这个是则需要如下注解标记,告诉服务器按什么格式来转换
@DateTimeFormat(pattern="yyyy-MM-dd") private Date birth; @NumberFormat(pattern="#,###,###.#") private float salary;
当前台输入的数据不满足以上格式的时候,其转换结果可以在目标方法的方法参数中,注入BindingResult result来获取,示例如下
@RequestMapping(value="testConverter",method={RequestMethod.POST}) public String testConverter(Employee employee, BindingResult result){ System.out.println("SpringmvcTest.testConverter"); if(result.getErrorCount() > 0){ List<FieldError> fieldErrors = result.getFieldErrors(); for(FieldError error : fieldErrors){ System.out.println(error.getField() + ":" + error.getDefaultMessage()); } } System.out.println(employee); return "success"; }
三.数据校验
JSR303是一个JAVA BEAN校验的规范,但是springmvc 没有对其进行实现,hibernate validator对齐进行了实现。
具体流程如下:
1.加入 hibernate validator 的jar包
2.在对应需要验证的bean上就注解
3.后台的到错误消息,BindingResult
4.前台得到错误消息,<form:errors path="属性名"></form:errors>
5.如何定制消息,
在springmvc的配置文件中中配置
<bean class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean>
src下面添加i18n.properties属性文件,键值对如何写(验证用的注解.entity名.属性名=消息)
注意事项,
springmvc的配置文件中,必须已经配置了
<mvc:annotation-driven ></mvc:annotation-driven>
还有就是目标方法的验证对象前面加@Valid,才会验证