前言
介绍MVC类型转换器、格式化器
1、使用场景
< form th: action= " @{/user/register}" method = " post" >
用户名:< input type = " text" name = " userName" /> < br/>
密码:< input type = " password" name = " password" /> < br>
生日:< input type = " date" name = " birthday" value = " " > < br/>
< button type = " submit" > 提交</ button>
< button type = " reset" > 重置</ button>
</ form>
@PostMapping ( value = "/register" )
public ModelAndView register ( User user) {
System . out. println ( user. getUserName ( ) ) ;
System . out. println ( user. getPassword ( ) ) ;
System . out. println ( user. getBirthday ( ) ) ;
ModelAndView modelAndView = new ModelAndView ( ) ;
modelAndView. addObject ( "userName" , "Tiger" ) ;
modelAndView. setViewName ( "success" ) ;
return modelAndView;
}
前端提交:
错误是日期类型转换异常。如何解决?
2、解决步骤
2.1、定义Convertor转换器
package com. hqyj. springmvc. common ;
import org. springframework. core. convert. converter. Converter ;
import java. text. ParseException ;
import java. text. SimpleDateFormat ;
import java. util. Date ;
public class StringDateConverter implements Converter < String , Date > {
public Date convert ( String source) {
String format = "yyyy-MM-dd" ;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( format) ;
Date parse = null ;
try {
parse = simpleDateFormat. parse ( source) ;
} catch ( ParseException e) {
e. printStackTrace ( ) ;
}
return parse;
}
}
2.2、springMVC.xml 配置转换器
< mvc: annotation-driven conversion-service = " conversionService" />
< bean id = " conversionService" class = " org.springframework.context.support.ConversionServiceFactoryBean" >
< property name = " converters" >
< set>
< bean class = " com.hqyj.springmvc.common.StringDateConverter" />
</ set>
</ property>
</ bean>
3、自定义类型转换器
接口 说明 Converter<S,T> 该接口使用了泛型,第一个类型 S 表示原类型,第二个类型 T 表示目标类型,里面定义了一个 convert() 方法,能够将原类型对象作为参数传入,进行转换之后返回目标类型对象。 ConverterFactory 如果我们希望将一种类型的对象转换为另一种类型及其子类对象,例如将 String 转换为 Number 以及 Number 的子类 Integer、Double 等类型的对象,那么就需要一系列的 Converter,如 StringToInteger、StringToDouble 等。ConverterFactory<S,R> 接口的作用就是将这些相同系列的多个 Converter 封装在一起。 GenericConverter 该接口会根据源类对象及目标类对象的上下文信息进行类型转换。
4、内置类型转换器
4.1、标量转换器
名称 作用 StringToBooleanConverter String 到 boolean 类型转换 ObjectToString ConverterObject 到 String 转换,调用 toString 方法转换 StringToNumberConverterFactory String 到数字转换(例如 Integer、Long 等) NumberToNumberConverterFactory 数字子类型(基本类型)到数字类型(包装类型)转换 StringToCharacterConverter String 到 Character 转换,取字符串中的第一个字符 NumberToCharacterConverter 数字子类型到 Character 转换 CharacterToNumberFactory Character 到数字子类型转换 StringToEnumConverterFactory String 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型 EnumToStringConverter 枚举类型到 String 转换,返回枚举对象的 name 值 StringToLocaleConverter String 到 java.util.Locale 转换 PropertiesToStringConverter java.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码 StringToPropertiesConverter String 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码
4.2、集合、数组相关转换器
名称 作用 ArrayToCollectionConverter 任意数组到任意集合(List、Set)转换 CollectionToArrayConverter 任意集合到任意数组转换 ArrayToArrayConverter 任意数组到任意数组转换 CollectionToCollectionConverter 集合之间的类型转换 MapToMapConverter Map之间的类型转换 ArrayToStringConverter 任意数组到 String 转换 StringToArrayConverter 字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim) ArrayToObjectConverter 任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换 ObjectToArrayConverter Object 到单元素数组转换 CollectionToStringConverter 任意集合(List、Set)到 String 转换 StringToCollectionConverter String 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim) CollectionToObjectConverter 任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换 ObjectToCollectionConverter Object 到单元素集合的类型转换
5、日期和数值格式化格式化注解
格式化注解 说明 @DateTimeFormat 注解 使用该注解,能够实现对日期类型数据的格式化 @NumberFormat 注解 使用该注解,能够实现对数值类型数据的格式化 2,000,777
5.1、@DateTimeFormat 注解主要包含以下 3 个属性。
属性 类型 说明 pattern String 用于指定解析或格式化日期时间的模式,其常用取值包括 yyyy-MM-dd、yyyy-MM-dd hh:mm:ss 等。 iso DateTimeFormat.ISO 用于指定解析或格式化日期时间的 ISO 模式,其取值有 4 种:DATE:yyyy-MM-dd TIME:hh:mm:ss:SSSZ DATE_TIME:yyyy-MM-dd hh:mm:ss:SSSZ NONE:无 style String 用于指定日期时间的格式。 该属性由两个字符组成,第一个字符表示日期的格式,第二个字符表示时间的格式。S:短日期/时间格式 M:中日期/时间格式 L:长日期/时间格式 F:完整日期/时间格式 其默认值为“SS”,即日期和时间都采用短格式。
描述 字符串值 示例输出 短格式(这是缺省值) SS 8/30/64 11:24 AM 中等格式 MM Aug 30, 1964 11:24:41 AM 长格式 LL August 30, 1964 11:24:41 AM CDT 完整格式 FF Sunday, August 30, 1964 11:24:41 AM CDT 使用短横线省略日期或时间 M- Aug 30, 1964
@NumberFormat 注解拥有两个互斥的属性,如下表。
属性 类型 说明 style NumberFormat.Style 该属性用于指定数值的样式类型,其取值有以下 4 种:DEFAULT:默认类型NUMBER:正常数值类型PERCENT:百分数类型CURRENCY:货币数值类型 pattern String 该属性用于自定义数值的样式星星,例如 #,###