1、数据绑定流程
- Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象
- DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中
- 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
- Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参
Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下:
数据绑定流程:
SpringMVC上下文中内建了很多转换器,可以完成大多是Java类型的转换工作。
ConversionService converters =
java.lang.Boolean -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@f874ca
java.lang.Character -> java.lang.Number : CharacterToNumberFactory@f004c9
java.lang.Character -> java.lang.String : ObjectToStringConverter@68a961
java.lang.Enum -> java.lang.String : EnumToStringConverter@12f060a
java.lang.Number -> java.lang.Character : NumberToCharacterConverter@1482ac5
java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory@126c6f
java.lang.Number -> java.lang.String : ObjectToStringConverter@14888e8
java.lang.String -> java.lang.Boolean : StringToBooleanConverter@1ca6626
java.lang.String -> java.lang.Character : StringToCharacterConverter@1143800
java.lang.String -> java.lang.Enum : StringToEnumConverterFactory@1bba86e
java.lang.String -> java.lang.Number : StringToNumberConverterFactory@18d2c12
java.lang.String -> java.util.Locale : StringToLocaleConverter@3598e1
java.lang.String -> java.util.Properties : StringToPropertiesConverter@c90828
java.lang.String -> java.util.UUID : StringToUUIDConverter@a42f23
java.util.Locale -> java.lang.String : ObjectToStringConverter@c7e20a
java.util.Properties -> java.lang.String : PropertiesToStringConverter@367a7f
java.util.UUID -> java.lang.String : ObjectToStringConverter@112b07f ……
如我有一个名为Book的JavaBean,属性有:bookName、author、price三个属性,我从前段传递过来一串字符串,如:西游记-吴承恩-120,这个字符串,我想将这个字符串根据名字作则价格封装进Book中,此时我们可以通过自定义类型转换器:
前段代码如下:
<form action="testMyConvert" method="get">
<input type="text" name = "infor" value="西游记-吴承恩-120">
<input type="submit" value="快速提交" >
</form>
控制器类中处理testMyConvert请求的代码如下:
@RequestMapping("/testMyConvert")
public String testMyConvert(@RequestParam("infor") Book book) {
System.out.println(book);
return "success";
}
1.创建一个类继承Converter接口,泛型中前一个是传递过来的数据类型,后一个是要转换的数据类型。代码如下:
public class MyStringToEmployeeConverter implements Converter<String, Book>{
//source就是我们传递过来的字符串
@Override
public Book convert(String source) {
Book book = new Book();
//根据“-”将字符串切割开
String[] splits = source.split("-");
//一一将传递过来的数据封装进Book中
book.setBookName(splits[0]);
book.setAuthor(splits[1]);
book.setPrice(Integer.parseInt(splits[2]));
return book;
}
}
2.在SpringMVC中进行配置,使我们的自己的类型转换组件生效。配置如下:
<!-- 配置使用自己的类型转换组件 -->
<mvc:annotation-driven
conversion-service="conversionService"
></mvc:annotation-driven>
<!-- 告诉springMVC别用默认的ConversionService,而用我们自定义的
converter
-->
<!--以后写自动类型转换器是,就是用FormattingConversionServiceFactoryBean
来注册;即有类型转换还有格式化的功能
-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.hist.controller.MyStringToEmployeeConverter"></bean>
</set>
</property>
</bean>
此事如果运行,点击快速提交,页面就会打印book信息。
解释一下配置文件中的配置:
ConversionService 是 Spring 类型转换体系的核心接口。
可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService. Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器。
需要注意的是,我们使用超链接传递字符串也可以,但是有的浏览器传递URL时,请求被tomcat认为存在不合法字符。如我在我eclipse中的浏览器点击超链接就出现了错误,在谷歌浏览器上就没有问题。
来源:CSDN
作者:技术无他,唯手熟尔
链接:https://blog.csdn.net/qq_43687990/article/details/103480587