• Spring MVC数据绑定和响应——简单数据绑定(四)自定义类型转换器


    一、自定义类型转换器使用场景

            Spring MVC默认提供了一些常用的类型转换器,这些类型转换器,可以将客户端提交的参数自动转换为处理器形参类型的数据。然而默认类型转换器并不能将提交的参数转换为所有的类型。此时,就需要开发者自定义类型转换器,来将参数转换为程序所需要的类型。

    二、Converter接口的使用

            Spring框架提供了org.springframework.core.convert.converter.Converter接口作为类型转换器,开发者可以通过实现Converter接口来自定义类型转换器。Converter接口的代码如下所示。

    1. public interface Converter {
    2. T convert(S source);
    3. }

            在上述代码中,泛型参数中的S表示源类型,T表示目标类型,而convert( )方法将源类型转换为目标类型返回,方法内的具体转换规则可由开发者自行定义。

            下面通过案例演示自定义类型转换器转换特殊数据类型并完成数据绑定,该案例要求实现Date类型的数据绑定,案例具体实现步骤如下所示。

    1、创建DateConverter类,并在类中定义convert()方法, 实现String类型转到Date类型的转换。

    1. public class DateConverter implements Converter {
    2. private String datePattern = “yyyy-MM-dd";// 定义日期格式
    3. @Override
    4. public Date convert(String source) {
    5. SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
    6. try { return sdf.parse(source);
    7. } catch (Exception e) {
    8. throw new IllegalArgumentException(
    9. “无效的日期格式,请使用这种格式:"+datePattern);} }
    10. }

    2、为了让Spring MVC知道并使用DateConverter转换器类,还需要在配置文件spring-mvc.xml中配置类型转换器。

    1. "com.test.controller"/>
    2. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    3. "prefix" value="/WEB-INF/pages/"/>
    4. "suffix" value=".jsp"/>
    5. "converterService" class=
    6. "org.springframework.context.support.ConversionServiceFactoryBean">
    7. "converters">"com.test.convert.DateConverter"/>
    8. "converterService"/>

    三、配置类型转换器工厂或配置格式化工厂

            要将自定义类型转换器注册到程序中,除了可以将自定义转换器配置在类型转换器工厂ConversionServiceFactoryBean中,也可以将自定义转换器配置在格式化工厂org.springframework.format.support.FormattingConversionServiceFactoryBean中,通过格式化工厂对数据格式化。

    3、在UserController.java类中定义方法getBirthday(),用于绑定客户端请求中的日期数据,getBirthday()方法代码如下所示。 

    1. /**
    2. * 使用自定义类型数据绑定日期数据
    3. */
    4. @RequestMapping("/getBirthday")
    5. public void getBirthday(Date birthday) {
    6. System.out.println("birthday="+birthday);
    7. }

    4、启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/getBirthday?birthday=2020-11-11,访问后,控制台打印信息如图所示。 

    birthday=Wed Nov 11 00:00:00 CST 2020

    四、日期类型的格式转换

            在上述案例中,日期类型的格式转换是基于XML配置自定义转换器实现的。除了XML方式之外,还可以通过@DateTimeFormat注解来简化日期类型的格式转换。使用@DateTimeFormat注解完成日期类型的格式转换无需自定义转换器,也无需在配置文件中定义转换器工厂或格式化工厂,只需将@DateTimeFormat定义在方法的形参前面或成员变量上方,就可以为当前参数或变量指定类型转换规则。

            接下来使用@DateTimeFormat注解修改上述案例,完成Date类型的数据绑定,具体实现步骤如下。

    1、修改UserController.java类中getBirthday()方法,修改后getBirthday()方法的具体代码如下所示。

    1. /**
    2. * 使用@DateTimeFormat注解绑定日期数据
    3. */
    4. @RequestMapping("/getBirthday")
    5. public void getBirthday(@DateTimeFormat(
    6. pattern = "yyyy-MM-dd")Date birthday) {
    7. System.out.println("birthday="+birthday);
    8. }

    2、删除spring-mvc.xml中的转换器工厂,删除后spring-mvc.xml保留的元素如下所示。

    1. package="com.itheima.controller"/>
    2. "org.springframework.web.servlet.view
    3. .InternalResourceViewResolver">
    4. "prefix" value="/WEB-INF/pages/"/>
    5. "suffix" value=".jsp"/>

    3、启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/getBirthday?birthday=2020-11-11,使用@DateTimeFormat注解时控制台打印信息如图所示。

    birthday=Wed Nov 11 00:00:00 CST 2020

            如果getBirthday()方法的形参是User类型,且birthday是User类的属性,也可以将形参上的@DateTimeFormat注解改写在birthday属性的上方,数据绑定效果是一样的,格式如下。

    1. @DateTimeFormat(pattern = "yyyy-MM-dd")
    2. private Date birthday;

  • 相关阅读:
    卷积神经网络工作原理的直观理解
    全流程TOUGH系列软件实践技术应用
    Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)
    springboot集成canal,将数据发送至接口
    计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
    HTTP常见的状态码
    【SpringBoot高级篇】SpringBoot集成Mybatis实现多数据源配置+跨数据源事务
    R语言使用substr函数、paste函数或str_c函数提取并生成输出文件名
    HDU 2612 - Find a way(两遍广搜)
    学会 Python yield 关键词,此文就够了
  • 原文地址:https://blog.csdn.net/W_Fe5/article/details/139903200