【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 内置了许多常见的数据格式化器,可以通过注解或配置文件进行配置和使用。以下是一些常见的内置数据格式化器:
DateFormatter
:用于将日期字符串转换为日期对象,或将日期对象格式化为指定的日期字符串格式。NumberFormatter
:用于将数字字符串转换为数字对象,或将数字对象格式化为指定的数字字符串格式。CurrencyFormatter
:用于将数字对象格式化为指定的货币字符串格式。DateFormatterRegistrar
:用于注册自定义的日期格式化器。FormattingConversionServiceFactoryBean
:用于配置和管理数据格式化器。
要使用内置数据格式化器,可以在 SpringMVC 的配置文件中进行相应的配置。例如,可以使用 <mvc:annotation-driven>
标签启用注解驱动的数据格式化支持,并在相应的字段或方法上使用 @DateTimeFormat
、 @NumberFormat
等注解来指定数据格式化方式。
如果内置的数据格式化器无法满足需求,还可以自定义数据格式化器来处理特定的格式化需求。可以实现 SpringMVC 的 Formatter
接口,并将其注册到 SpringMVC 的配置中。
2. 数据格式化器的应用场景
数据格式化器在 SpringMVC 中有很多应用场景。以下是一些常见的应用场景:
-
表单提交
:当用户提交表单数据时,可以使用内置数据格式化器将用户输入的数据转换为目标对象的属性类型。例如,将字符串转换为日期对象、将字符串转换为数字对象等。 -
数据展示
:在将数据展示给用户时,可以使用内置数据格式化器将数据格式化为用户友好的形式。例如,将日期对象格式化为指定的日期字符串格式、将数字对象格式化为货币形式等。 -
数据校验
:在进行数据校验时,可以使用内置数据格式化器来验证输入数据的格式是否符合要求。例如,验证日期字符串是否符合指定的日期格式、验证数字字符串是否符合指定的数字格式等。 -
数据持久化
:在将数据持久化到数据库或其他存储介质时,可以使用内置数据格式化器将数据转换为存储介质所需的格式。例如,将日期对象转换为数据库支持的日期格式、将数字对象转换为数据库支持的数字格式等。 -
响应数据格式化
:在返回响应数据给客户端时,可以使用内置数据格式化器将数据格式化为指定的格式。例如,将日期对象格式化为指定的日期字符串格式、将数字对象格式化为指定的数字字符串格式等。
3. DateFormatter
DateFormatter 是 SpringMVC 内置的数据格式化器之一,用于将日期字符串转换为日期对象,或将日期对象格式化为指定的日期字符串格式。以下是 DateFormatter 的使用案例:
- 在 SpringMVC 的配置文件中配置 DateFormatter:
<bean id="dateFormatter" class="org.springframework.format.datetime.DateFormatter"><property name="pattern" value="yyyy-MM-dd" />
</bean>
- 在控制器中使用 DateFormatter:
@Controller
public class MyController {@InitBinderpublic 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 的使用案例:
- 在 SpringMVC 的配置文件中配置 NumberFormatter:
<bean id="numberFormatter" class="org.springframework.format.number.NumberFormatter"><property name="pattern" value="#,##0.00" />
</bean>
- 在控制器中使用 NumberFormatter:
@Controller
public class MyController {@InitBinderpublic 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 的使用案例:
- 在 SpringMVC 的配置文件中配置 CurrencyFormatter:
<bean id="currencyFormatter" class="org.springframework.format.number.CurrencyFormatter"><property name="currencyCode" value="USD" />
</bean>
- 在控制器中使用 CurrencyFormatter:
@Controller
public class MyController {@InitBinderpublic 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 的使用案例:
- 创建自定义的日期格式化器:
public class CustomDateFormatter implements Formatter<Date> {private String pattern;public CustomDateFormatter(String pattern) {this.pattern = pattern;}@Overridepublic Date parse(String text, Locale locale) throws ParseException {SimpleDateFormat dateFormat = createDateFormat(locale);return dateFormat.parse(text);}@Overridepublic 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() 方法来进行日期的解析和格式化。
- 在 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 的使用案例:
- 在 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。可以根据需要添加其他的数据格式化器。
- 在控制器中使用 FormattingConversionServiceFactoryBean:
@Controller
public class MyController {@Autowiredprivate FormattingConversionServiceFactoryBean conversionService;@InitBinderpublic 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 自定义格式化器的代码案例:
- 创建自定义格式化器:
public class CustomFormatter implements Formatter<CustomObject> {@Overridepublic CustomObject parse(String text, Locale locale) throws ParseException {// 解析字符串并返回自定义对象CustomObject customObject = new CustomObject();// 解析逻辑...return customObject;}@Overridepublic String print(CustomObject customObject, Locale locale) {// 将自定义对象格式化为字符串String formattedString = "";// 格式化逻辑...return formattedString;}
}
在上述示例中,我们创建了一个自定义的格式化器 CustomFormatter,实现了 Formatter 接口,并重写了 parse() 和 print() 方法来进行格式化和解析。
- 注册自定义格式化器:
<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 初阶
相关文章:

【Java 中级】一文精通 Spring MVC - 数据格式化器(六)
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…...

Linux内核学习(十二)—— 页高速缓存和页回写(基于Linux 2.6内核)
目录 一、缓存手段 二、Linux 页高速缓存 三、flusher 线程 Linux 内核实现了一个被叫做页高速缓存(page cache)的磁盘缓存,它主要用来减少对磁盘的 I/O 操作。它是通过把磁盘中的数据缓存到内存中,把对磁盘的访问变为对物理内…...

大数据-玩转数据-Flink窗口函数
一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…...

Docker网络-探索容器网络如何相互通信
当今世界,企业热衷于容器化,这需要强大的网络技能来正确配置容器架构,因此引入了 Docker Networking 的概念。Docker 是一种容器化平台,允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能&#x…...

ESP32-CAM模块Arduino环境搭建测试
ESP32-CAM模块Arduino环境搭建测试 一.ESP32OV2640摄像头模块CameraWebServer视频查看 二.测试ESP32-CAM(后续称cam模块)代码是否上传执行成功测试 const int led0 12; const int led1 13;void setup() {// put your setup code here, to run once:pinMode(led0, OUTPUT);pin…...

webassembly001 webassembly简述
WebAssembly 官方地址:https://webassembly.org/相关历史 https://en.wikipedia.org/wiki/WebAssembly https://brendaneich.com/2015/06/from-asm-js-to-webassembly/WebAssembly(缩写为Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编…...

vue 使用C-Lodop打印小票
先从官网下载js文件 https://www.lodop.net/LodopDemo.html 打开安装程序,一直下一步既可,我这边已经安装过就不演示了。 // 引入 import { getLodop } from /utils/CLodopfuncs.js;// 使用 let LODOP getLodop()let Count LODOP.GET_PRINTER_COUNT…...

【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:C从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学习C 🔝🔝 vector 1. 前言2. 熟悉vector的接口函数2.1 vec…...

1. import pandas as pd 导入库
【目录】 文章目录 1. import pandas as pd 导入库1. pandas库的概念2. 导入pandas库2.1 常规导入2.2 别名导入 3. 别名的作用4. 课堂练习 【正文】 1. import pandas as pd 导入库 【学习时间】 10分钟 1. pandas库的概念 pandas:熊猫panda的复数, …...

DMK5框选变量之后不显示其他位置的此变量高亮
使用软件MDK5.3.8版本 如下在2的位置选择之后,其他同样的变量没有高亮,因为1的原因折叠了; 展开折叠之后就可以了...
0061__Appium
Appium Documentation - Appium Documentation APP自动化测试(3)-Appium Inspector介绍_六天测试工程师的博客-CSDN博客 https://github.com/appium/appium-inspector https://github.com/appium/appium-desktop https://github.com/appium/appium...
【DEVOPS】需求跟踪管理全面落地
0. 目录 1. 现状/背景2. 需求管理存在的问题3. 改进思路/措施4. 所谓"禅道尚未普及/铺开"5. 最后6. 相关 1. 现状/背景 近期又被领导问到"如何对项目过程中的需求进行量化和跟踪管理"。这真是一个狗皮膏药似的问题,反反复复地,隔一…...
算法修炼Day57|647. 回文子串 ● 516.最长回文子序列
LeetCode:647. 回文子串 647. 回文子串 - 力扣(LeetCode) 1.思路 暴力思路见对应代码… 动规解法:画图推导动规公式,当前状态由左侧和左下角推出,所以首层应该采用倒序的方式,内部采用正序的方式。 2.…...

呈现数据的精妙之道:选择合适的可视化方法
在当今数据时代,数据可视化已成为理解和传达信息的重要手段。然而,选择适合的数据可视化方法对于有效地呈现数据至关重要。不同的数据和目标需要不同的可视化方法,下面我们将探讨如何选择最佳的数据可视化方法来呈现数据。 1. 理解数据类型&a…...

数据结构(Java实现)-java对象的比较
元素的比较 基本类型的比较 在Java中,基本类型的对象可以直接比较大小。 对象比较的问题 Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较 默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的…...

Wolfram Mathematica 13 for Mac 数学计算工具
Wolfram Mathematica for Mac是一款功能强大、划时代的科学计算软件。它结合了数字和符号计算引擎、图形系统、编程语言、文本系统以及与其他应用程序的高级连接,在许多功能方面处于世界领先地位,截至2009年,它是使用最广泛的数学软件之一。人…...

系统架构设计高级技能 · Web架构
现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 Web架构 一、Web架构介绍1.1 Web架构涉及技术1.2 单台服务…...

再写CentOS7升级OpenSSL-1.0.1U
本文在CentOS7.4以及TencentOS 2.4上测试通过。 原系统自带OpenSSL 1.0.2k-fips。 编译安装方法跟之前的没啥区别。 从官网下载1.0.1u版https://www.openssl.org/source/ 使用tar解包 tar xfz openssl-1.0.1u.tar.gz 依次执行如下: cd openssl-1.0.1u ./con…...

HBase--技术文档--基本概念--《快速扫盲》
官网 Apache HBase – Apache HBase™ Home 阿里云hbase 云数据库HBase_大数据存储_订单风控_数据库-阿里云 云数据库 HBase-阿里云帮助中心 基本概念 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。它基于Hadoop,采用列式存储方式,可…...

如何利用SFTP协议远程实现更安全的文件传输 ——【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 文章目录 1. 安装openSSH1.1 安装SSH1.2 启动ssh 2. 安装cpolar2.1 配置termux服务 3. 远程SFTP连接配置3.1 查看生成的随机公…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...