spring数据绑定流程
ConversionService接口
方法:
1、boolean canConvert(Class<?> sourceType,Class<?> targetType) 判断两个java对象是否可以转化
2、boolean canConvert(TypeDescriptor sourceType,TypeDescriptor targetType)需要转换的类将已程远变量的方式出现,TypeDescriptor不仅描述了需要转换类的新奇,还描述了上下文等所有信息
3、《T》 T convert(Object source,Class<?> targetType) 将原类型对象转换为目标类型对象
4、Obect convert(Object source,TypeDescriptor sourceType,TypeDescriptor targetType)经目标从元对象转换为目标对象,通常会用到类中的上下文信息
自定义一个ConversionService
可以配置多个类型转换器
< bean id=“conversionService” class=“org.springframework.context.support.ConversionServiceFactoryBean”>
spring支持的了转换器
- Converter< S ,T>将S类型转换为T类型,不考虑上下文信息不能完成复杂的转换,只有一个方法 T converter( S source)
- ConverterFacory<S , R >将S类型转化为R类型或者R 的子类 只提供一个方法
- GenericConverter接口,根据源类对象和目标了对象的上下文信息,完成转化,有2个接口方法Set<GenericConverter.ConvertiblePair> getConvertiblePairs()
Object convert(Object source,TypeDescriptor sourceType,TypeDescriptor targetType) ConvertiblePair封装了原类型和对象类型 TypeDescriptor封装了对象的上下文信息
实现编辑器方式
1、开发自定义转换器实现Converter接口,并在XML文件中声明Bean
2、自定义编辑器实现父类PropertyEditorSupport,在controller调用注解@initBinder在指定方法(不是url的目标方法)上,调用自定义编辑器类
3、使用WebBindingInitializer注册全局的编辑器(XML中声明),使用方式类似@initBinder
调用优先级
同一个类型的对象来说,即在ConversionService中装配了自定转换器,有通过WebBindingInitializer接口装配了全局的,又在控制器中同过@initBinder装配了自定义转换器 springMVC会按一下优先级
1、@initBinder 2、ConversionService @WebBindingInitializer
数据格式化
1、Printer 接口
将T类型的对象根据Local信息以某种格式转化,返回字符换类型数据,该接口定义了一个print方法
2、Parser 接口
解析接口 ,根据Local信息 解析字符串到T类型数据 该接口定义了一个 parse方法
3、Formatter 接口
格式化接口继承自 Printer 接口 Parser 接口 它完成T类型的格式化和解析功能
4、FormatterResgistrer ★★★接口 可自定义转换类★★
注册格式化转换器,定义了一个resgistrerFormatters 参数为FormatterResgistrers 用于注册多个格式化转换器
AnnotationFormatterFacor 接口
注解驱动的字段格式化工厂,用于创建带注解的字段的Printer和Parser ,
定义的方法,
1、Set<Class<?>> getFieldTypes **注解A的应用范围,**即哪些属性类可以标注A注解
2、Priner<?>getPrintert(A annotation,Class<?> fieldType)根据注解S获取特定属性类型的Printer
3、Parser<?>getParser(A annotation,Class<?> fieldType)根据注解S获取特定属性类型的Parser
Spring的org.springframework.datetime 对时间的格式化
Spring的org.springframework.number
NumberFormatter 对数字类型对象的格式化
CurrencyFormatter 对货币类型对象的格式化
PercentFormatter 对百分比类型对象的格式化
AnnotationFormatterFacor 接口
org.springframework.annotation
1、@DateTimeFormatter可以对java.util.Date 、java.util.Calendar等时间格式化
1-iso 类型为DateTimeFormatter,ISO 一下长选值
1--DateTimeFormatter.ISO.DATE :格式化为yyyy-MM-dd
2--DateTimeFormatter.ISO.DATE_TIME :格式化为yyyy-MM-dd hh:mm:ss.SSSZ
3--DateTimeFormatter.ISO.TIME :格式化为hh:mm:ss.SSSZ
4--DateTimeFormatter.ISO.NONE:表示不使用ISO的时间
2-patten 类型为String 使用自定义的时间格式化字符串 如“yyyy-MM-dd”字符串
3-style 类型为String 使用样式指定日期时间的格式 可选值
S:短日期/时间的样式
L:中日期/时间的样式
M:长日期/时间的样式
F:完整日期/时间的样式
-:忽略日期/时间的样式
2、@NumberFormatter(style=Style.Number,pattern="#.###")
1、pattern 类型为String 使用自定义的时间格式化字符串 如“yyyy-MM-dd”字符串
2、style 使用样式指定日期时间的格式 可选值
NumberFormatter.CURRENCY 货币类型
NumberFormatter.NUMBER 正常数字剋行
NumberFormatter.PERCENT 百分比类型
数据校验
表 1. Bean Validation 中内置的 constraint
Constraint 详细信息
被注释的元素必须为 null
被注释的元素必须为 true
被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
表 2. Hibernate Validator 附加的 constraint
Constraint 详细信息
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
扩展的注解
@NotBlank
TYPE | ASCII |
---|---|
@Null | 验证对象是否为null |
@NotNull | 验证对象是否不为null,无法验证字符串长度为0,用于验证基本类型 |
@AssertTrue | `被注释的元素必须为 true |
@AssertFalse | `被注释的元素必须为 false |
@AssertTrue | `被注释的元素必须为 true |
@Min(value) | `验证Number和String对象,其值必须不小于等于指定的最值 |
@Max(value) | 验证Number和String对象,其值必须不大于等于指定的最值 |
@DecimalMin(value) | 被标注的值必须不小于指定的值,是通过BigDecimal定义的字符串标示,小数存在精度 |
@DecimalMax(value) | 被标注的值必须不大于指定的值,是通过BigDecimal定义的字符串标示,小数存在精度 |
@Digits (integer, fraction) | 验证字符串是否符合指定格式的数字,inetger指定整数精度,fraction指定小数精度 |
@Size(max, min) | 验证(Array、collection、Map、String)长度必须在指定单位内 |
@Past | 验证Date 和Calendai对象必须在当前时间之前 |
@Futhre | 验证Date和Calendar对象是否在当前时间之后 |
@pattern | 验证Strinf对象hi否符合正则表达式规则如@Pattern(regex=“内容”) |
@NotBlank | `字符串不能为null,被trim()的长度必须大于0,只对字符串且去掉前后空格 |
@URL | `验证是否合法的RUL |
被注释的元素必须是电子邮箱地址 | |
@Length(min,max) | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 检查验证(Array、collection、Map、String)是否为null或者empty |
@Range(min,max,message) | 验证属性值必需在合适范围内如@Range(min=18,max=60,message=“学生年龄必须在18-60之间”) |
@CreditCardNumver | 必须是合法的信用卡号码 |