《Spring MVC》 第六章 MVC类型转换器、格式化器

系列文章目录

第一章 MVC模式
第二章 让程序run起来
第三章 @Controller、@RequestMapping 注解和获取请求参数
第四章 域对象、视图、转发和重定向
第五章 第五章 实现RESTful
第六章 MVC类型转换器、格式化器
第七章 JSON数据交互
第八章 拦截器实现权限验证、异常处理
第九章 文件上传、下载
第十章 使用logback+Slf4j打印日志
第十一章 单体架构任务调度



在这里插入图片描述


前言

介绍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、标量转换器

名称作用
StringToBooleanConverterString 到 boolean 类型转换
ObjectToStringConverterObject 到 String 转换,调用 toString 方法转换
StringToNumberConverterFactoryString 到数字转换(例如 Integer、Long 等)
NumberToNumberConverterFactory数字子类型(基本类型)到数字类型(包装类型)转换
StringToCharacterConverterString 到 Character 转换,取字符串中的第一个字符
NumberToCharacterConverter数字子类型到 Character 转换
CharacterToNumberFactoryCharacter 到数字子类型转换
StringToEnumConverterFactoryString 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型
EnumToStringConverter枚举类型到 String 转换,返回枚举对象的 name 值
StringToLocaleConverterString 到 java.util.Locale 转换
PropertiesToStringConverterjava.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码
StringToPropertiesConverterString 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码

4.2、集合、数组相关转换器

名称作用
ArrayToCollectionConverter任意数组到任意集合(List、Set)转换
CollectionToArrayConverter任意集合到任意数组转换
ArrayToArrayConverter任意数组到任意数组转换
CollectionToCollectionConverter集合之间的类型转换
MapToMapConverterMap之间的类型转换
ArrayToStringConverter任意数组到 String 转换
StringToArrayConverter字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim)
ArrayToObjectConverter任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换
ObjectToArrayConverterObject 到单元素数组转换
CollectionToStringConverter任意集合(List、Set)到 String 转换
StringToCollectionConverterString 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim)
CollectionToObjectConverter任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换
ObjectToCollectionConverterObject 到单元素集合的类型转换

5、日期和数值格式化格式化注解

格式化注解说明
@DateTimeFormat 注解使用该注解,能够实现对日期类型数据的格式化
@NumberFormat 注解使用该注解,能够实现对数值类型数据的格式化 2,000,777

5.1、@DateTimeFormat 注解主要包含以下 3 个属性。

属性类型说明
patternString用于指定解析或格式化日期时间的模式,其常用取值包括 yyyy-MM-dd、yyyy-MM-dd hh:mm:ss 等。
isoDateTimeFormat.ISO用于指定解析或格式化日期时间的 ISO 模式,其取值有 4 种:
  • DATE:yyyy-MM-dd
  • TIME:hh:mm:ss:SSSZ
  • DATE_TIME:yyyy-MM-dd hh:mm:ss:SSSZ
  • NONE:无
styleString用于指定日期时间的格式。
该属性由两个字符组成,第一个字符表示日期的格式,第二个字符表示时间的格式。
  • S:短日期/时间格式
  • M:中日期/时间格式
  • L:长日期/时间格式
  • F:完整日期/时间格式
  • 其默认值为“SS”,即日期和时间都采用短格式。
描述字符串值示例输出
短格式(这是缺省值)SS8/30/64 11:24 AM
中等格式MMAug 30, 1964 11:24:41 AM
长格式LLAugust 30, 1964 11:24:41 AM CDT
完整格式FFSunday, August 30, 1964 11:24:41 AM CDT
使用短横线省略日期或时间M-Aug 30, 1964

@NumberFormat 注解拥有两个互斥的属性,如下表。

属性类型说明
styleNumberFormat.Style该属性用于指定数值的样式类型,其取值有以下 4 种:DEFAULT:默认类型NUMBER:正常数值类型PERCENT:百分数类型CURRENCY:货币数值类型
patternString该属性用于自定义数值的样式星星,例如 #,###
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青花锁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值