您现在的位置是:首页 >其他 >《Spring MVC》 第六章 MVC类型转换器、格式化器网站首页其他
《Spring MVC》 第六章 MVC类型转换器、格式化器
简介《Spring MVC》 第六章 MVC类型转换器、格式化器
前言
介绍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();
//给request对象设置一个属性
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 种:
|
style | String | 用于指定日期时间的格式。 该属性由两个字符组成,第一个字符表示日期的格式,第二个字符表示时间的格式。
|
描述 | 字符串值 | 示例输出 |
---|---|---|
短格式(这是缺省值) | 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 | 该属性用于自定义数值的样式星星,例如 #,### |
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。