【Java 高阶】一文精通 Spring MVC - 数据格式化器(六)

news2025/4/17 8:28:36

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • 1. 什么是数据格式化器
      • 2. 数据格式化器的应用场景
      • 3. DateFormatter
      • 4. NumberFormatter
      • 5. CurrencyFormatter
      • 6. DateFormatterRegistrar
      • 7.FormattingConversionServiceFactoryBean
      • 8. 自定义格式化器

1. 什么是数据格式化器

SpringMVC 内置数据格式化是指在 SpringMVC 框架中,可以自动将请求参数或响应数据进行格式化。这样可以方便地将数据从一种格式转换为另一种格式,例如将字符串转换为日期对象,或将数字格式化为货币形式等。

SpringMVC 内置了许多常见的数据格式化器,可以通过注解或配置文件进行配置和使用。以下是一些常见的内置数据格式化器:

  1. DateFormatter:用于将日期字符串转换为日期对象,或将日期对象格式化为指定的日期字符串格式。
  2. NumberFormatter:用于将数字字符串转换为数字对象,或将数字对象格式化为指定的数字字符串格式。
  3. CurrencyFormatter:用于将数字对象格式化为指定的货币字符串格式。
  4. DateFormatterRegistrar:用于注册自定义的日期格式化器。
  5. FormattingConversionServiceFactoryBean:用于配置和管理数据格式化器。

要使用内置数据格式化器,可以在 SpringMVC 的配置文件中进行相应的配置。例如,可以使用 <mvc:annotation-driven> 标签启用注解驱动的数据格式化支持,并在相应的字段或方法上使用 @DateTimeFormat@NumberFormat 等注解来指定数据格式化方式。

如果内置的数据格式化器无法满足需求,还可以自定义数据格式化器来处理特定的格式化需求。可以实现 SpringMVC 的 Formatter 接口,并将其注册到 SpringMVC 的配置中。

2. 数据格式化器的应用场景

数据格式化器在 SpringMVC 中有很多应用场景。以下是一些常见的应用场景:

  1. 表单提交:当用户提交表单数据时,可以使用内置数据格式化器将用户输入的数据转换为目标对象的属性类型。例如,将字符串转换为日期对象、将字符串转换为数字对象等。

  2. 数据展示:在将数据展示给用户时,可以使用内置数据格式化器将数据格式化为用户友好的形式。例如,将日期对象格式化为指定的日期字符串格式、将数字对象格式化为货币形式等。

  3. 数据校验:在进行数据校验时,可以使用内置数据格式化器来验证输入数据的格式是否符合要求。例如,验证日期字符串是否符合指定的日期格式、验证数字字符串是否符合指定的数字格式等。

  4. 数据持久化:在将数据持久化到数据库或其他存储介质时,可以使用内置数据格式化器将数据转换为存储介质所需的格式。例如,将日期对象转换为数据库支持的日期格式、将数字对象转换为数据库支持的数字格式等。

  5. 响应数据格式化:在返回响应数据给客户端时,可以使用内置数据格式化器将数据格式化为指定的格式。例如,将日期对象格式化为指定的日期字符串格式、将数字对象格式化为指定的数字字符串格式等。

3. DateFormatter

DateFormatter 是 SpringMVC 内置的数据格式化器之一,用于将日期字符串转换为日期对象,或将日期对象格式化为指定的日期字符串格式。以下是 DateFormatter 的使用案例:

  1. 在 SpringMVC 的配置文件中配置 DateFormatter:
<bean id="dateFormatter" class="org.springframework.format.datetime.DateFormatter">
    <property name="pattern" value="yyyy-MM-dd" />
</bean>
  1. 在控制器中使用 DateFormatter:
@Controller
public class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }

    @RequestMapping("/example")
    public String example(@RequestParam("date") Date date) {
        // 处理日期对象
        return "example";
    }
}

在上述示例中,配置了一个 DateFormatter 对象,并指定了日期格式为 “yyyy-MM-dd”。然后,在控制器的方法参数中使用了 @RequestParam 注解,将请求参数 “date” 自动转换为 Date 类型的对象。

通过这样的配置和使用,当请求中的 “date” 参数为符合指定格式的日期字符串时,SpringMVC 会自动将其转换为 Date 对象。反之,如果请求中的参数无法转换为 Date 对象,将会抛出异常或使用默认值。

4. NumberFormatter

NumberFormatter 是 SpringMVC 内置的数据格式化器之一,用于将数字字符串转换为数字对象,或将数字对象格式化为指定的数字字符串格式。以下是 NumberFormatter 的使用案例:

  1. 在 SpringMVC 的配置文件中配置 NumberFormatter:
<bean id="numberFormatter" class="org.springframework.format.number.NumberFormatter">
    <property name="pattern" value="#,##0.00" />
</bean>
  1. 在控制器中使用 NumberFormatter:
@Controller
public class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new NumberFormatter("#,##0.00"));
    }

    @RequestMapping("/example")
    public String example(@RequestParam("amount") BigDecimal amount) {
        // 处理金额对象
        return "example";
    }
}

在上述示例中,配置了一个 NumberFormatter 对象,并指定了数字格式为 “#,##0.00”。然后,在控制器的方法参数中使用了 @RequestParam 注解,将请求参数 “amount” 自动转换为 BigDecimal 类型的对象。

通过这样的配置和使用,当请求中的 “amount” 参数为符合指定格式的数字字符串时,SpringMVC 会自动将其转换为 BigDecimal 对象。反之,如果请求中的参数无法转换为 BigDecimal 对象,将会抛出异常或使用默认值。

5. CurrencyFormatter

CurrencyFormatter 是 SpringMVC 内置的数据格式化器之一,用于将数字对象格式化为指定的货币字符串格式。以下是 CurrencyFormatter 的使用案例:

  1. 在 SpringMVC 的配置文件中配置 CurrencyFormatter:
<bean id="currencyFormatter" class="org.springframework.format.number.CurrencyFormatter">
    <property name="currencyCode" value="USD" />
</bean>
  1. 在控制器中使用 CurrencyFormatter:
@Controller
public class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new CurrencyFormatter());
    }

    @RequestMapping("/example")
    public String example(@RequestParam("amount") BigDecimal amount) {
        // 处理金额对象
        return "example";
    }
}

在上述示例中,配置了一个 CurrencyFormatter 对象,并指定了货币代码为 “USD”(美元)。然后,在控制器的方法参数中使用了 @RequestParam 注解,将请求参数 “amount” 自动转换为 BigDecimal 类型的对象。

通过这样的配置和使用,当请求中的 “amount” 参数为数字时,SpringMVC 会自动将其格式化为指定货币格式的字符串。例如,将数字 1000 转换为 “$1,000.00”。

6. DateFormatterRegistrar

DateFormatterRegistrar 是 SpringMVC 内置的日期格式化注册器,用于注册自定义的日期格式化器。以下是 DateFormatterRegistrar 的使用案例:

  1. 创建自定义的日期格式化器:
public class CustomDateFormatter implements Formatter<Date> {

    private String pattern;

    public CustomDateFormatter(String pattern) {
        this.pattern = pattern;
    }

    @Override
    public Date parse(String text, Locale locale) throws ParseException {
        SimpleDateFormat dateFormat = createDateFormat(locale);
        return dateFormat.parse(text);
    }

    @Override
    public String print(Date date, Locale locale) {
        SimpleDateFormat dateFormat = createDateFormat(locale);
        return dateFormat.format(date);
    }

    private SimpleDateFormat createDateFormat(Locale locale) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, locale);
        dateFormat.setLenient(false);
        return dateFormat;
    }
}

在上述示例中,我们创建了一个自定义的日期格式化器 CustomDateFormatter,实现了 Formatter 接口,并重写了 parse() 和 print() 方法来进行日期的解析和格式化。

  1. 在 SpringMVC 的配置文件中配置 DateFormatterRegistrar:
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>
            <bean class="com.example.CustomDateFormatter">
                <constructor-arg value="yyyy-MM-dd" />
            </bean>
        </set>
    </property>
</bean>

在上述示例中,我们使用 FormattingConversionServiceFactoryBean 配置了自定义的日期格式化器 CustomDateFormatter,并指定了日期格式为 “yyyy-MM-dd”。

通过这样的配置,SpringMVC 将会注册我们自定义的日期格式化器,并在需要进行日期格式化或解析的地方使用它。

7.FormattingConversionServiceFactoryBean

FormattingConversionServiceFactoryBean 是 SpringMVC 内置的数据格式化器注册器,用于配置和管理数据格式化器。以下是 FormattingConversionServiceFactoryBean 的使用案例:

  1. 在 SpringMVC 的配置文件中配置 FormattingConversionServiceFactoryBean:
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>
            <bean class="org.springframework.format.datetime.DateFormatter">
                <property name="pattern" value="yyyy-MM-dd" />
            </bean>
            <bean class="org.springframework.format.number.NumberFormatter">
                <property name="pattern" value="#,##0.00" />
            </bean>
            <!-- 添加其他的数据格式化器 -->
        </set>
    </property>
</bean>

在上述示例中,我们配置了一个 FormattingConversionServiceFactoryBean 对象,并在其中添加了内置的日期格式化器 DateFormatter 和数字格式化器 NumberFormatter。可以根据需要添加其他的数据格式化器。

  1. 在控制器中使用 FormattingConversionServiceFactoryBean:
@Controller
public class MyController {

    @Autowired
    private FormattingConversionServiceFactoryBean conversionService;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.setConversionService(conversionService.getObject());
    }

    @RequestMapping("/example")
    public String example(@RequestParam("date") Date date, @RequestParam("amount") BigDecimal amount) {
        // 处理日期对象和金额对象
        return "example";
    }
}

在上述示例中,我们注入了 FormattingConversionServiceFactoryBean 对象,并在控制器的 initBinder() 方法中将其设置为 WebDataBinder 的 ConversionService。这样,在控制器的方法参数中使用了 @RequestParam 注解时,SpringMVC 会自动使用配置的数据格式化器进行参数的转换和格式化。

通过这样的配置和使用,我们可以方便地管理和使用多个数据格式化器,以满足不同类型的数据格式化需求。

8. 自定义格式化器

SpringMVC 提供了自定义格式化器的功能,可以根据特定的需求创建自定义的格式化器。以下是 SpringMVC 自定义格式化器的代码案例:

  1. 创建自定义格式化器:
public class CustomFormatter implements Formatter<CustomObject> {

    @Override
    public CustomObject parse(String text, Locale locale) throws ParseException {
        // 解析字符串并返回自定义对象
        CustomObject customObject = new CustomObject();
        // 解析逻辑...
        return customObject;
    }

    @Override
    public String print(CustomObject customObject, Locale locale) {
        // 将自定义对象格式化为字符串
        String formattedString = "";
        // 格式化逻辑...
        return formattedString;
    }
}

在上述示例中,我们创建了一个自定义的格式化器 CustomFormatter,实现了 Formatter 接口,并重写了 parse() 和 print() 方法来进行格式化和解析。

  1. 注册自定义格式化器:
<mvc:annotation-driven conversion-service="conversionService" />

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>
            <bean class="com.example.CustomFormatter" />
        </set>
    </property>
</bean>

在 SpringMVC 的配置文件中,我们使用 <mvc:annotation-driven> 标签启用注解驱动的数据格式化支持,并配置了一个 FormattingConversionServiceFactoryBean 对象。在该对象中,我们将自定义的格式化器 CustomFormatter 添加到 formatters 集合中。

通过这样的配置,SpringMVC 将会注册我们自定义的格式化器,并在需要进行格式化或解析的地方使用它。

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python - 编程中【工厂模式】和【单例模式】区别以及代码示例详解

一. 概念 工厂模式和单例模式都是面向对象编程中常用的设计模式。 工厂模式&#xff08;FactoryPattern&#xff09;&#xff1a;是一种创建型模式&#xff0c;它提供了一种方法来创建对象&#xff0c;而不需要暴露对象的创建逻辑。这种模式通过定义一个工厂类&#xff0c;通…

优化生产流程:数字化工厂中的OPC UA分布式IO模块应用

背景 近年来&#xff0c;为了提升在全球范围内的竞争力&#xff0c;制造企业希望自己工厂的机器之间协同性更强&#xff0c;自动化设备采集到的数据能够发挥更大的价值&#xff0c;越来越多的传统型工业制造企业开始加入数字化工厂建设的行列&#xff0c;实现智能制造。 数字化…

归一化的作用,sklearn 安装

目录 归一化的作用&#xff1a; 应用场景说明 sklearn 准备工作 sklearn 安装 sklearn 上手 线性回归实战 归一化的作用&#xff1a; 归一化后加快了梯度下降求最优解的速度; 归一化有可能提高精度(如KNN) 应用场景说明 1&#xff09;概率模型不需要归一化&#xff…

强化历程5-Java并发系列(2023.8.23)

文章目录 强化历程5-Java并发系列(2023.8.23)1 Java多线程1.1 Java中多线程有几种实现方式&#xff1f;1.2 那么Runnable和Callable都可以实现多线程&#xff0c;他们有什么区别?1.3 采用实现Runnable和Callable接口方式和采用继承Thread类方式各有什么好处?1.4 Java如何停止…

【数据结构与算法】—— 手撕红黑树

目录 &#xff08;一&#xff09;红黑树的定义 1、红黑树的引入 2、红黑树的概念 3、红黑树的性质 &#xff08;二&#xff09;红黑树的操作 1、红黑树节点的定义 2、红黑树的插入操作 1️⃣ 思路 2️⃣ 代码实现 3、红黑树的删除操作&#xff08;了解&#xff09; …

Compose - 基本使用

一、概念 1.1 Compose优势 由一个个可以组合的Composable函数拼成界面&#xff0c;方便维护和复用。布局模型不允许多次测量&#xff0c;提升了性能。Compose可以和View互操作&#xff08;相互包含对方&#xff09;。 1.2 声明式UI APP展示的数据绝大多数不是静态数据而是会…

An easy problem

一、题目 we define f(A) 1, f(a) -1, f(B) 2, f(b) -2, … f(Z) 26, f(z) -26; Give you a letter x and a number y , you should output the result of yf(x). Input On the first line, contains a number T.then T lines follow, each line is a case.each case …

多线程基础篇(包教包会)

文章目录 一、第一个多线程程序1.Jconsole观察线程2.线程休眠-sleep 二、创建线程三、Thread类及常见方法1. Thread 的常见构造方法2. Thread 的几个常见属性3. 启动线程 - start4. 中断线程5. 等待一个线程 四、线程状态五、线程安全问题(synchronized)&#xff08;重点&#…

基于React实现日历组件详细教程

前言 日历组件是常见的日期时间相关的组件&#xff0c;围绕日历组件设计师做出过各种尝试&#xff0c;展示的形式也是五花八门。但是对于前端开发者来讲&#xff0c;主要我们能够掌握核心思路&#xff0c;不管多么奇葩的设计我们都能够把它做出来。 本文将详细分析如何渲染一…

windows系统activemq一键安装启动

前言 官网下载的mq提供了启动和卸载服务器的脚本&#xff0c;但是安装的时候不会自动启动服务&#xff0c;需要去手动比较麻烦&#xff0c;执行脚本的时候也需要去右键选择管理员执行做起来比较啰嗦。 优化方案 修改脚本权限为自动判断并获取 在脚本开头加入下面的代码 …

店铺收款系统开源_商城收款分账系统_OctShop

近来&#xff0c;很多客户对OctShop店铺收款分账系统有很大的需求&#xff0c;下面详细介绍一下&#xff0c;门店收款分账系统是什么&#xff0c;以及其作用与意义是什么&#xff1f; 店铺收款分账系统实质上是一个解决门店各种收款场景&#xff0c;如&#xff1a;扫码付款&…

零基础学习,初学者也能轻松制作高质量母婴行业小程序

现如今&#xff0c;随着移动互联网的发展&#xff0c;小程序成为了各行各业的新宠。对于母婴行业来说&#xff0c;拥有一个功能完善、用户友好的小程序&#xff0c;无疑是提升企业形象和服务质量的重要一环。然而&#xff0c;对于初学者来说&#xff0c;如何轻松掌握母婴行业小…

微服务中间件--http客户端Feign

http客户端Feign http客户端Feigna.Feign替代RestTemplateb.自定义Feign的配置c.Feign的性能优化d.Feign的最佳实践分析e.Feign实现最佳实践(方式二) http客户端Feign a.Feign替代RestTemplate 以前利用RestTemplate发起远程调用的代码&#xff1a; String url "http:…

【面试题】你理解中JS难理解的基本概念是什么?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 作用域与闭包 作用域 作用域是当前的执行上下文&#xff0c;值和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中&#xff0…

SpringBoot利用ConstraintValidator实现自定义注解校验

一、前言 ConstraintValidator是Java Bean Validation&#xff08;JSR-303&#xff09;规范中的一个接口&#xff0c;用于实现自定义校验注解的校验逻辑。ConstraintValidator定义了两个泛型参数&#xff0c;分别是注解类型和被校验的值类型。在实现ConstraintValidator接口时&…

【业务功能篇77】微服务-OSS对象存储-上传下载图片

3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了&#xff0c;这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件&#xff0c;图片&#xff0c;文本等…

JavaSE 数组

定义&#xff1a; int []arr; int arr[]; 初始化 // 完整格式 int arr[] new int[]{1, 2, 3}; // 简单格式 int arr[] {1, 2, 3}; 数组的元素访问、遍历 按照下标访问即可。数组的长度函数为 arr.length()。idea快速生成遍历的方法&#xff1a;数组名.fori 静态初始化 &a…

9.Sentinel哨兵

1.Sentinel Sentinel&#xff08;哨兵&#xff09;是由阿里开源的一款流量控制和熔断降级框架&#xff0c;用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分&#xff0c;用于保护服务不被异常流量冲垮&#xff0c;从而提高系统的稳定…

【神州数码】BGP路由器案例

SwitchB、SwitchC和SwitchD位于AS200中&#xff0c;SwitchA位于AS100中。SwitchA和SwitchB共享一个相同的网络段11.0.0.0。而SwitchB和SwitchD彼此物理上不相邻。 则SwitchA的配置如下&#xff1a; SwitchA(config)#router bgp 100SwitchA(config-router-bgp)#neighbor 11.1.1…

指针(初阶)

1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 2. 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&…