SpringMVC之数据绑定和自定义类型转换器

送分小仙女□ 提交于 2019-12-10 20:33:50

1、数据绑定流程

  1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象
  2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中
  3. 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
  4. 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中的浏览器点击超链接就出现了错误,在谷歌浏览器上就没有问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!