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

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有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.mfbz.cn/a/87268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口经典题目

​ White graces&#xff1a;个人主页 &#x1f649;专栏推荐:《Java入门知识》&#x1f649; &#x1f649; 内容推荐:继承与组合&#xff1a;代码复用的两种策略&#x1f649; &#x1f439;今日诗词:人似秋鸿来有信&#xff0c;事如春梦了无痕。&#x1f439; 目录 &…

供应链安全和第三方风险管理:讨论如何应对供应链中的安全风险,以及评估和管理第三方合作伙伴可能带来的威胁

第一章&#xff1a;引言 在当今数字化时代&#xff0c;供应链的安全性越来越受到重视。企业的成功不仅仅依赖于产品和服务的质量&#xff0c;还取决于供应链中的安全性。然而&#xff0c;随着供应链越来越复杂&#xff0c;第三方合作伙伴的参与也带来了一系列安全风险。本文将…

RPC和HTTP协议

RPC 全称&#xff08;Remote Procedure Call&#xff09;&#xff0c;它是一种针对跨进程或者跨网络节点的应用之间的远程过程调用协议。 它的核心目标是&#xff0c;让开发人员在进行远程方法调用的时候&#xff0c;就像调用本地方法一样&#xff0c;不需要额外为了完成这个交…

[JavaWeb]【十】web后端开发-SpringBootWeb案例(配置文件)

目录 一、参数配置化 1.1 问题分析 1.2 问题解决&#xff08;application.properties&#xff09; 1.2.1 application.properties 1.2.2 AliOSSUtils 1.2.3 启动服务-测试 二、yml配置文件 2.1 配置格式 2.1.1 新增 application.yml 2.1.2 启动服务 2.2 XML与prope…

linux 同时kill杀死多进程实践

使用场景 当程序中有使用到多进程且进程数较多的情况&#xff0c;如下图&#xff0c;且需要通过控制台杀死所有的 GSM_run.py 的进程时&#xff0c;利用 kill 命令一个一个的去结束进程是及其耗时且繁琐的&#xff0c;这时就需要我们的kill多进程的命令工作了。 批量 Kill 进程…

【ARM】Day9 cortex-A7核I2C实验(采集温湿度)

1. 2、编写IIC协议&#xff0c;采集温湿度值 iic.h #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "led.h" /* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_S…

WiFi天线和NB-IoT天线不通用

表面看起来完全一样。但是把WiFi天线插到NB-IoT设备后&#xff0c;信号弱了很多。还导致设备反复重启

轮转数组——C语言

题目&#xff1a; 解法1&#xff1a;把最后一位数字移动到数组的第一位&#xff0c;然后将第二位开始的每一位往前移动一位 这种方法的时间复杂度O&#xff08;N^2&#xff09; 空间复杂度O&#xff08;1&#xff09; rotate(int* arr, int n, int k) {k % n;int i 0;for (i …

Prompt本质解密及Evaluation实战(一)

一、基于evaluation的prompt使用解析 基于大模型的应用评估与传统应用程序的评估不太一样&#xff0c;特别是基于GPT系列或者生成式语言模型&#xff0c;因为模型生成的内容与传统意义上所说的内容或者标签不太一样。 以下是借用了ChatGPT官方的evaluation指南提出的对结果的具…

Star History 月度开源精选|Llama 2 及周边生态特辑

7 月 18 日&#xff0c;Meta 发布了 Llama&#xff0c;大语言模型 Llama 1 的进阶版&#xff0c;可以自由免费用于研究和商业&#xff0c;支持私有化部署。 所以本期 Star History 的主题是&#xff1a;帮助你快速把 Llama 2 在自己机器上跑起来的开源工具&#xff0c;无论你的…

多环境开发

多环境 1、多环境开发&#xff08;YAML版&#xff09; 小结&#xff1a; 多环境开发需要设置若干种常用环境&#xff0c;例如开发、生产、测试环境yaml格式中设置多环境使用—区分环境设置边界每种环境的区别在于加载的配置属性不同启用某种环境时需要指定启动时使用该环境 …

高手进阶之路---pyqt自定义信号

高手进阶之路—pyqt自定义信号 1.思考问题为什么要自定义信号&#xff0c;qt5本身已有信号槽函数 # pushButton 被clicked的时候connect 函数print self.pushButton.clicked.connect(self.print)def print(self):print("我被点击了")或者使用 # 需要引入 pyqtSlo…

使用ffmpeg将WebM文件转换为MP4文件的简单应用程序

tiktok网上下载的short视频是webm格式的&#xff0c;有些程序无法处理该程序&#xff0c;比如roop程序&#xff0c;本文介绍了如何使用wxPython库创建一个简单的GUI应用程序&#xff0c;用于将WebM文件转换为MP4文件。这个应用程序使用Python编写&#xff0c;通过调用FFmpeg命令…

docker: /lib64/libc.so.6: version `GLIBC_2.32‘ not found (required by docker)

Linux环境 Ubuntu 22.04 docker 最新版 jenkins docker 版本(以下版本都会报错 jenkins/jenkins:centos7 jenkins/jenkins:lts-centos7 jenkins/jenkins:ltsdocker-compose.yml配置 version: 3.6 services:gitlab:image: twang2218/gitlab-ce-zhrestart: alwayscontainer_nam…

C#实现简单TCP服务器和客户端网络编程

在C#中进行网络编程涉及许多类和命名空间&#xff0c;用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间&#xff1a; System.Net 命名空间&#xff1a;这个命名空间提供了大部分网络编程所需的类&#xff0c;包括&#xff1a; IPAddress&#xff1a;用于…

第七章:借阅管理【基于Servlet+JSP的图书管理系统】

借阅管理 1. 借书卡 1.1 查询借书卡 借书卡在正常的CRUD操作的基础上&#xff0c;我们还需要注意一些特殊的情况。查询信息的时候。如果是管理员则可以查询所有的信息&#xff0c;如果是普通用户则只能查看自己的信息。这块的控制在登录的用户信息 然后就是在Dao中处理的时候需…

Linux 挂载局域网内共享目录

Linux 挂载局域网内共享目录 1、安装samba服务端2、samba服务端配置3、添加samba服务访问账户4、防火墙5、重启服务6、windows访问7、linux访问 1、安装samba服务端 sudo apt-get install -y samba yum install -y samba2、samba服务端配置 vim /etc/samba/smb.conf在文档尾部…

按钮权限控制

搜索关键字&#xff1a; 自定义指令传参| "自定义指令""dataset"|自定义指令dataset| "Vue""directives"|vue按钮权限实现 1、完整代码&#xff1a; <template> <div> <el-breadcrumb separator-class"el-icon…

常见前端面试之VUE面试题汇总五

13. assets 和 static 的区别 相同点&#xff1a; assets 和 static 两个都是存放静态资源文件。项目中所 需要的资源文件图片&#xff0c;字体图标&#xff0c;样式文件等都可以放在这两个文件 下&#xff0c;这是相同点 不相同点&#xff1a;assets 中存放的静态资源文件在…

IoTDB 集群环境搭建

什么是IoTDB IoTDB&#xff08;Internet of Things Database&#xff09;是一个专门设计用于存储和管理大规模物联网&#xff08;IoT&#xff09;数据的开源时序数据库系统。它专注于高效地存储、查询和分析时间序列数据&#xff0c;特别适用于物联网应用中的大量实时数据。 Io…