`

Spring MVC 学习笔记 十一 data binding

 
阅读更多

Servlet中的输入参数为都是string类型,而spring mvc通过data bind机制将这些string 类型的输入参数转换为相应的command object(根据view和controller之间传输数据的具体逻辑,也可称为model attributes, domain model objects)。在这个转换过程中,spring实际是先利用java.beans.PropertyEditor中的 setAdText方法来把string格式的输入转换为bean属性,
亦可通过继承java.beans.PropertyEditorSupport来实现自定义的PropertyEditors,具体实现方式可参考spring reference 3.0.5 第 5.4节中的 Registering additional custom PropertyEditors部分。
自定义完毕propertyEditor后,有以下几种方式来注册自定义的customer propertyEditor.
1:直接将自定义的propertyEditor放到需要处理的java bean相同的目录下
名称和java Bean相同但后面带Editor后缀。
例如需要转换的java bean 名为User,则在相同的包中存在UserEditor类可实现customer propertyEditor的自动注册。
2:利用@InitBinder来注册customer propertyEditor
这个在之前的笔记中已经介绍过了,即在controller类中增加一个使用@InitBinder标注的方法,在其中注册customer Editor

 

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(
				dateFormat, false));
	}

 3:继承 WebBindingInitializer 接口来实现全局注册
使用@InitBinder只能对特定的controller类生效,为注册一个全局的customer Editor,可以实现接口WebBindingInitializer 。

public class CustomerBinding implements WebBindingInitializer {
	@Override
	public void initBinder(WebDataBinder binder, WebRequest request) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(
				dateFormat, false));

	}

 并修改 servlet context xml配置文件

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="webBindingInitializer">
			<bean class="net.zhepu.web.customerBinding.CustomerBinding" />
		</property>
	</bean>

 但这样一来就无法使用mvc:annotation-driven  了。

使用conversion-service来注册自定义的converter
DataBinder实现了PropertyEditorRegistry, TypeConverter这两个interface,而在spring mvc实际处理时,返回值都是return binder.convertIfNecessary(见HandlerMethodInvoker中的具体处理逻辑)。因此可以使用customer conversionService来实现自定义的类型转换。

	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<list>
			    <bean class="net.zhepu.web.customerBinding.CustomerConverter" />
			</list>
		</property>
		
	</bean>

 需要修改spring service context xml配置文件中的annotation-driven,增加属性conversion-service指向新增的conversionService bean。

<mvc:annotation-driven validator="validator" conversion-service="conversionService" />

 实际自定义的converter如下。

 public class CustomerConverter implements Converter<String, Date> {
	@Override
	public Date convert(String source) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(false);
		try {
			return dateFormat.parse(source);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		return null;
	}

 对于requestBody或httpEntity中数据的类型转换
Spring MVC中对于requestBody中发送的数据转换不是通过databind来实现,而是使用HttpMessageConverter来实现具体的类型转换。
例如,之前提到的json格式的输入,在将json格式的输入转换为具体的model的过程中,spring mvc首先找出request header中的contenttype,再遍历当前所注册的所有的HttpMessageConverter子类, 根据子类中的canRead()方法来决定调用哪个具体的子类来实现对requestBody中的数据的解析。如果当前所注册的httpMessageConverter中都无法解析对应contexttype类型,则抛出HttpMediaTypeNotSupportedException (http 415错误)。
那么需要如何注册自定义的messageConverter呢,很不幸,在spring 3.0.5中如果使用annotation-driven的配置方式的话,无法实现自定义的messageConverter的配置,必须老老实实的自己定义AnnotationMethodHandlerAdapter的bean定义,再设置其messageConverters以注册自定义的messageConverter。
在3.1版本中,将增加annotation-driven对自定义的messageConverter的支持 (SPR-7504),具体格式如下

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

 

分享到:
评论

相关推荐

    spring MVC学习笔记

    **Spring MVC 学习笔记** Spring MVC 是 Spring 框架的一个模块,专门用于构建 Web 应用程序。它提供了一种模型-视图-控制器(Model-View-Controller)架构,帮助开发者处理请求、控制应用程序流程,并实现业务逻辑...

    最全最经典spring-mvc教程

    另外,Spring MVC与Spring框架的其他组件无缝集成,如Spring AOP(面向切面编程)用于实现日志、事务管理等功能,Spring JDBC和MyBatis等持久层框架用于数据库操作,以及Spring Data JPA、Hibernate等ORM工具,使得...

    spring MVC .docx

    13. **Spring Data Access**: Spring MVC可以与Spring Data、Hibernate、MyBatis等数据访问框架配合,简化数据库交互。 14. **Asynchronous Request Processing**: Spring MVC支持异步请求处理,可以通过`@Async`...

    Spring mvc5.0.3 所有jar包

    **Spring MVC 5.0.3 知识点详解** Spring MVC是Spring框架的一个核心模块,专注于构建Web应用程序。在Spring MVC 5.0.3版本中,它提供了丰富的功能和改进,使得开发者能够更高效地开发RESTful服务、处理HTTP请求、...

    Spring MVC学习指南 中文版

    **Spring MVC 学习指南中文版** Spring MVC 是 Spring 框架的重要组成部分,它是一个用于构建 Web 应用程序的模型-视图-控制器(MVC)框架。本指南将深入探讨 Spring MVC 的核心概念、工作原理以及如何在实际项目中...

    spring mvc demo

    在这个"spring mvc demo"中,我们可以期待学习到关于如何设置和运行一个基本的Spring MVC应用程序的所有关键要素。 首先,要搭建Spring MVC项目,我们需要以下基础: 1. **环境准备**:确保安装了Java Development...

    spring mvc学习视频相关资料

    在本学习资源中,你将深入理解 Spring MVC 的核心概念和实践技巧。 1. **Spring MVC 概述** Spring MVC 提供了一种组织和控制 Web 应用程序逻辑的方式,它通过分离关注点,使得开发者可以更专注于业务逻辑,而不是...

    Spring MVC 配套资料

    本配套资料包含 SpringMvc 学习笔记与代码示例,是学习 Spring MVC 的宝贵资源。 一、Spring MVC 概述 Spring MVC 作为 Spring 框架的一部分,为开发可测试、模块化的 Web 应用提供了强大的支持。它简化了处理 ...

    Spring MVC 框架学习总结

    **Spring MVC 框架学习总结** Spring MVC 是 Spring 框架的重要组成部分,它是一个用于构建 Web 应用程序的轻量级、模型-视图-控制器(MVC)框架。Spring MVC 提供了优雅的编程模型和高度模块化的架构,使得开发者...

    Spring MVC 实例

    **Spring MVC 框架详解** Spring MVC 是 Spring 框架的重要组成部分,它是一个用于构建 Web 应用程序的模型-视图-控制器(MVC)架构。Spring MVC 提供了灵活的处理机制,包括处理器映射、视图解析、数据绑定、本地...

    Spring MVC资料

    通过提供的文件列表,我们可以深入学习Servlet和JSP的基础,理解Spring MVC的实现方式,以及通过源代码分析提升对Spring MVC深层次的理解。同时,结合企业应用实战和精通指南,可以进一步掌握在实际项目中的应用技巧...

    spring MVC配置,六步简单搞定

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。这篇博客“spring MVC配置,六步简单搞定”可能介绍了如何快速且有效地设置Spring MVC项目。下面...

    Spring MVC A Tutorial Second Edition

    本书《Spring MVC A Tutorial Second Edition》是一本易于跟随的学习Spring MVC的入门指南。书中涵盖了关于Spring MVC的诸多知识点,包括Spring框架的基本概念、依赖注入、XML配置、控制器以及Spring MVC的特定内容...

    spring mvc项目后端源码

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 ...这个"spring mvc项目后端源码"可能包含了上述部分或全部概念的实现,通过学习和分析这些代码,可以加深对 Spring MVC 框架的理解,并提升 Web 开发技能。

    Spring mvc小程序

    7. **Validation**:Spring MVC提供验证机制,通过`@Valid`和`BindingResult`可以对模型对象进行校验。 8. **ExceptionHandler**:通过定义`@ExceptionHandler`方法,可以集中处理全局的异常,提高代码的可维护性。...

Global site tag (gtag.js) - Google Analytics