Spring MVC的参数类型转换
数据绑定流程
• 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象
• 2. DataBinder 调用装配在 Spring MVC 上下文中的ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中
• 3. 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData 对象
• 4. Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参
Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作 ,也可以进行自定义的转化
自定义参数类型转换
//首先实现Convert接口
@Component public class Sting2StudentConvert implements Converter<String, Student>{ @Override public Student convert(String s) { if(s==null) return null; String arg[]=s.split("@"); return new Student(Integer.parseInt(arg[0]),arg[1]); } }
//这里一定加上RequestParam的注解,要不系统就直接用默认的转换器,找int赋值给id,String赋值给name //加了注解之后,name对应的Sting就是要给Student,就变为String->Student的转换,使用的就是自定义的转换器 @RequestMapping("/TestMyConvert") public String TestMyConvert(@RequestParam("name") Student student){ System.out.println(student); //输出Student{id=12, name='lzzz'} return SUCCESS; }
配置,ConversionServiceFactoryBean里面的set中加入要配置的转换器,然后将其注册到annotation-driven中
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="sting2StudentConvert"></ref> </set> </property> </bean>
InitBinder注解,用于初始化weddatabind的一些数据,对于同一个controller中起作用
/*
* 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类,用
* 于完成由表单字段到 JavaBean 属性的绑定
* @InitBinder方法不能有返回值,它必须声明为void。
* @InitBinder方法的参数通常是是 WebDataBinder
* */
@InitBinder
void testInibinder(WebDataBinder binder){
System.out.println(binder.getFieldDefaultPrefix());
System.out.println(binder.getFieldMarkerPrefix());
binder.setDisallowedFields("name"); //这里设置的是对于name的属性不进行赋值
}