SpringMVC学习七SpringMVC数据类型换

上传人:xy****7 文档编号:45537489 上传时间:2018-06-17 格式:DOCX 页数:17 大小:181.40KB
返回 下载 相关 举报
SpringMVC学习七SpringMVC数据类型换_第1页
第1页 / 共17页
SpringMVC学习七SpringMVC数据类型换_第2页
第2页 / 共17页
SpringMVC学习七SpringMVC数据类型换_第3页
第3页 / 共17页
SpringMVC学习七SpringMVC数据类型换_第4页
第4页 / 共17页
SpringMVC学习七SpringMVC数据类型换_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《SpringMVC学习七SpringMVC数据类型换》由会员分享,可在线阅读,更多相关《SpringMVC学习七SpringMVC数据类型换(17页珍藏版)》请在金锄头文库上搜索。

1、7.1、简介、简介在编写可视化界面项目时,我们通常需要对数据进行类型转换、验证及格式化。一、在一、在 Spring3 之前,我们使用如下架构进行类型转换、验证及格式化:之前,我们使用如下架构进行类型转换、验证及格式化:流程:流程:类型转换:首先调用 PropertyEditor 的 setAsText(String),内部根据需要调用setValue(Object)方法进行设置转换后的值;:数据验证:需要显示调用 Spring 的 Validator 接口实现进行数据验证;:格式化显示:需要调用 PropertyEditor 的 getText 进行格式化显示。使用如上架构的缺点是:使用如上架

2、构的缺点是:(1、PropertyEditor 被设计为只能 StringObject 之间转换,不能任意对象类型任意类型,如我们常见的 Long 时间戳到 Date 类型的转换是办不到的;(2、PropertyEditor 是线程不安全的,也就是有状态的,因此每次使用时都需要创建一个,不可重用;(3、PropertyEditor 不是强类型的,setValue(Object)可以接受任意类型,因此需要我们自己判断类型是否兼容;(4、需要自己编程实现验证,Spring3 支持更棒的注解验证支持;(5、在使用 SpEL 表达式语言或 DataBinder 时,只能进行 StringObject

3、之间的类型转换;(6、不支持细粒度的类型转换/格式化,如 UserModel 的 registerDate 需要转换/格式化类似“2012-05-01”的数据,而 OrderModel 的 orderDate 需要转换/格式化类似“2012-05-0115:11:13”的数据,因为大家都为 java.util.Date类型,因此不太容易进行细粒度转换/格式化。在在 SpringSpring WebWeb MVCMVC 环境中,数据类型转换、验证及格式化通常是这样使用的:环境中,数据类型转换、验证及格式化通常是这样使用的:流程:流程:、类型转换:首先表单数据(全部是字符串)通过 WebDataB

4、inder 进行绑定到命令对象,内部通过 PropertyEditor 实现;:数据验证:在控制器中的功能处理方法中,需要显示的调用 Spring 的 Validator 实现并将错误信息添加到 BindingResult 对象中;:格式化显示:在表单页面可以通过如下方式展示通过PropertyEditor格式化的数据和错误信息:Java 代码 1. 2. 首先需要通过如上 taglib 指令引入 spring 的两个标签库。Java 代码 1./1、格式化单个命令/表单对象的值(好像比较麻烦,真心没有好办法) 2.$status.valueJava 代码 1./2、通过 form 标签,内部

5、的表单标签会自动调用命令/表单对象属性对应的PropertyEditor 进行格式化显示 2. 3. 4. Java 代码 1./3、显示验证失败后的错误信息 2. 如上 PropertyEditor 和验证 API 使用起来比较麻烦,而且有许多缺点,因此 Spring3 提供了更强大的类型转换(Type Conversion)支持,它可以在任意对象之间进行类型转换,不仅仅是 StringObject;也提供了强大的数据验证支持;同时提供了强大的数据格式化支持。二、从二、从 Spring3 开始,我们可以使用如下架构进行类型转换、验证及格式化:开始,我们可以使用如下架构进行类型转换、验证及格式

6、化:流程:流程:类型转换:内部的 ConversionService 会根据 S 源类型/T 目标类型自动选择相应的Converter SPI 进行类型转换,而且是强类型的,能在任意类型数据之间进行转换;:数据验证:支持 JSR-303 验证框架,如将Valid 放在需要验证的目标类型上即可;:格式化显示:其实就是任意目标类型-String 的转换,完全可以使用 Converter SPI完成。Spring 为了更好的诠释格式化/解析功能提供了 Formatter SPI,支持根据 Locale 信息进行格式化/解析,而且该套 SPI 可以支持字段/参数级别的细粒度格式化/解析,流程如下:流程

7、如下:类型解析(转换):String-T 类型目标对象的解析,和 PropertyEditor 类似;:格式化显示:任意目标类型-String 的转换,和 PropertyEditor 类似。Formatter SPI 最大特点是能进行字段/参数级别的细粒度解析/格式化控制,即使是Converter SPI 也是粗粒度的(到某个具体类型,而不是其中的某个字段单独控制),目前Formatter SPI 还不是很完善,如果您有好的想法可以到 Spring 官网提建议。Formatter SPI 内部实现实际委托给 Converter SPI 进行转换,即约束为解析/格式化String任意目标类型。

8、在在 Spring Web MVC 环境中,数据类型转换、验证及格式化通常是这样使用的:环境中,数据类型转换、验证及格式化通常是这样使用的:、类型转换:首先表单数据(全部是字符串)通过 WebDataBinder 进行绑定到命令对象,内部通过 Converter SPI 实现;:数据验证:使用 JSR-303 验证框架进行验证;:格式化显示:在表单页面可以通过如下方式展示通过内部通过 Converter SPI格式化的数据和错误信息:Java 代码 1. 2. 首先需要通过如上 taglib 指令引入 spring 的两个标签库。Java 代码 1./1、格式化单个命令/表单对象的值(好像比较

9、麻烦,真心没有好办法) 2.$status.valueJava 代码 1./2、标签,自动调用 ConversionService 并选择相应的Converter SPI 进行格式化展示 2. 如上代码能工作的前提是在 RequestMappingHandlerMapping 配置了ConversionServiceExposingInterceptor,它的作用是暴露 conversionService 到请求中以便如标签使用。Java 代码 1./3、通过 form 标签,内部的表单标签会自动调用命令/表单对象属性对应的PropertyEditor 进行格式化显示 2. 3. 4. Jav

10、a 代码 1./4、显示验证失败后的错误信息 2. 接下来我们就详细学习一下这些知识吧。7.2、数据类型转换、数据类型转换7.2.1、Spring3 之前的之前的 PropertyEditorPropertyEditor 介绍请参考【4.16.1、数据类型转换】。一、测试之前我们需要准备好测试环境:一、测试之前我们需要准备好测试环境:(1、模型对象,和【4.16.1、数据类型转换】使用的一样,需要将 DataBinderTestModel模型类及相关类拷贝过来放入 cn.javass.chapter7.model 包中。(2、控制器定义: Java 代码 1.package cn.javass

11、.chapter7.web.controller; 2./省略 import 3.Controller 4.public class DataBinderTestController 5. RequestMapping(value = “/dataBind“) 6. public String test(DataBinderTestModel command) 7. /输出 command 对象看看是否绑定正确 8. System.out.println(command); 9. model.addAttribute(“dataBinderTest“, command); 10. return

12、 “bind/success“; 11. 12. (3、Spring 配置文件定义,请参考 chapter7-servlet.xml,并注册DataBinderTestController:Java 代码 1. (4、测试的 URL:http:/localhost:9080/springmvc-chapter7/dataBind?username=zhang 7. CustomDateEditor dateEditor = new CustomDateEditor(df, true); 8. /表示如果命令对象有 Date 类型的属性,将使用该属性编辑器进行类型转换 9. binder.reg

13、isterCustomEditor(Date.class, dateEditor); 10. /自定义的电话号码编辑器(和【4.16.1、数据类型转换】一样) 11. binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEditor(); 12. 和【4.16.1、数据类型转换】一节类似,只是此处需要通过InitBinder 来注册自定义的PropertyEditor。2、使用、使用WebBindingInitializerWebBindingInitializer 批量注册批量注册PropertyEditor和

14、【4.16.1、数据类型转换】不太一样,因为我们的注解式控制器是 POJO,没有实现任何东西,因此无法注入 WebBindingInitializer,此时我们需要把 WebBindingInitializer 注入到我们的 RequestMappingHandlerAdapter 或 AnnotationMethodHandlerAdapter,这样对于所有的注解式控制器都是共享的。Java 代码 1. 2. 3. 4. 5. 此时我们注释掉控制器级别通过InitBinder 注册 PropertyEditor 的方法。3、全局级别注册、全局级别注册 PropertyEditor(全局共享)

15、(全局共享)和【4.16.1、数据类型转换】一节一样,此处不再重复。请参考【4.16.1、数据类型转换】的【全局级别注册 PropertyEditor(全局共享)】。接下来我们看一下 Spring3 提供的更强大的类型转换支持。7.2.2、Spring3 开始的类型转换系统开始的类型转换系统Spring3 引入了更加通用的类型转换系统,其定义了 SPI 接口(Converter 等)和相应的运行时执行类型转换的 API(ConversionService 等),在 Spring 中它和 PropertyEditor 功能类似,可以替代 PropertyEditor 来转换外部 Bean 属性的值到 Bean 属性需要的类型。该类型转换系统是 Spring 通用的,其定义在 org.springframework.core.convert 包中,不仅仅在 Spring Web MVC 场景下。目标是完全替换 PropertyEditor,提供无状态、强类型且可以在任意类型之间转换的类型转换系统,可以用于任何需要的地方,如 SpEL、数据绑定。Converter SPI 完成通用的类型转换逻辑,如 java.util.Datejava.lang.Long 或java.lang.String-PhoneNumberModel 等。7.2.2.1、架构、架构1、类型

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号