当前位置: 首页 > article >正文

springMVC-9数据格式化

数据格式化

学习目标:

理解在我们提交数据(比如表单时),SpringMVC怎样对提交的数据进行转换和处理的

Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作。

基本数据类型可以和字符串之间自动完成转换

应用实例-页面演示方式

1.创建com/stein/springMVC/entity/Monster.java

public class Monster {private Integer id;private String name;private Integer age;private String email;//构造器,setter and getter,toString
}

2.创建web/data_valid.jsp

<head><title>springMVC[数据格式/验证]</title>
</head>
<body><h1>springMVC[数据格式/验证]</h1><hr><a href="<%=request.getContextPath()%>/add">添加妖怪</a><br><br>
</body>

3.创建com/stein/springMVC/valid/MonsterHandler.java

@Controller
@Scope(value="prototype")//表示每次访问MonsterHandler的时候,会生成一个新的对象
public class MonsterHandler {@RequestMapping("/add")public String addMonster(Map<String, Object> map) {/*** 解读* 1. 这里的表单,我们使用springMVC的标签来完成* 2. SpringMVC 表单标签在显示之前必须在 request 中有一个 bean, 该 bean 的属性和表单标签的字段要对应!*      request 中的 key 为: form 标签的 modelAttrite 属性值, 比如这里的monster* 3. SpringMVC 的 form:form 标签的 action 属性值中的 / 不代表 WEB 应用的根目录.* 4. <form:form action="monster" method="POST" modelAttribute="monster">*     这里需要给request增加一个 monster, 因为jsp 页面 的modelAttribute="monster"需要*     这是springMVC的内部检测机制 即使是一个空的也需要, 否则报错*/map.put("monster", new Monster());return "datavalid/monster_addUI";}

4.创建web/WEB-INF/page/datavalid/monster_addUI.jsp

    <%--prefix可以指定命名空间的前缀名称,这儿自定义了s,表明是springMVC的标签库--%><%--记住几个关键词就行了,uri的值,会有自动提示--%>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>添加妖怪</title>
</head>
<body>
<h2>添加妖怪</h2>
<%--
1. 这里的表单,我们使用springMVC的标签来完成,主要目的是方便提示信息回显
2. SpringMVC 表单标签在显示之前必须在 request 中有一个 bean, 该 bean的属性和表单标签的字段要对应!request 中的 key 为: form 标签的 modelAttrite 属性值, 比如这里的monsters
3. SpringMVC 的 s:form 标签的 action 属性值中的 / 不代表 WEB 应用的根目录.
4. <s:form action=" ??" method="POST" modelAttribute="monster">// 这 里 需 要 给 request 增 加 一 个 monster , 因 为 jsp页面的modelAttribute="monster"是必要的//这 是springMVC 的内部的检测机制 即使是一个空的也需要,否则报错
--%>
<s:form action=""  method="post" modelAttribute="monster">妖怪姓名:<s:input path="name" /><br><br>妖怪年龄:<s:input path="age" /><br><br>电子邮件:<s:input path="email"/><br><br>
<%--    注意这儿的提交标签,还是用的原来的标签--%><input type="submit" value="添加妖怪">
</s:form>

5. 创建web/WEB-INF/page/success.jsp

<h1>恭喜, 操作成功~</h1>

6. 添加MonsterHandler的save方法

    @RequestMapping("/save")public String addMonster(Monster monster) {//这儿的monster,springMVC会进行自动装配System.out.println(monster);return "success";}

7. 完善monster_addUI.jsp的action

<s:form action="save"  method="post" modelAttribute="monster">

8. 测试 , 浏览器:http://localhost:8080/springmvc/data_valid.jsp

1)如果age 输入的是 数字,则通过, 说明SpringMVC可以将提交的字符串 数字,比如"28", 转成Integer/int

2) 如果不是数字,则给出400的页面

应用实例-Postman完成测试

小结

该实例体现了springMVC的自动转换功能,将String类型自动转换成了Integer/int类型。

特殊数据类型和字符串间的转换

应用实例-页面演示方式

1. 特殊数据类型和字符串之间的转换使用注解(比如日期,规定格式的小数比如货币形式 等)

2. 对于日期和货币可以使用 @DateTimeFormat 和 @NumberFormat 注解. 把这两个注 解标记在字段上即可

3.Monster.java增加生日和薪水字段

    @DateTimeFormat(pattern="yyyy-MM-dd")private Date birthday;@NumberFormat(pattern = "###,###,###.##")private float salary;

4.monster_addUI.jsp增加对应显示的字段

    妖怪生日:<s:input path="birthday"/>要求以"9999-11-11"的形式<br><br>妖怪薪水:<s:input path="salary"/>要求以"123,890.12"的形式<br><br>

5.测试

后台输出结果:

Monster{id=null, name='stein', age=12, email='steine985@gmail.com', birthday=Thu Nov 23 00:00:00 CST 1989, salary=456799.44}

可以看到:

1. 生日显示的方式是国际化的,需要接下来进行调整。
2. 薪水字段我输入的小数部分是45,然而后台输出的是44。所以涉及金钱这些对精度要求比较高的字段,还是要用double才行。

对DeepSeek的提问:

@DateTimeFormat(pattern="yyyy-MM-dd")private Date birthday;@NumberFormat(pattern = "###,###,###.##")private float salary;
这儿的pattern是一个字段,还是正则表达式?里面的yyyy这些,可以换成xxxx吗?#可以换$吗?

回答摘要:

1. pattern 的本质

  • @DateTimeFormat(pattern = "yyyy-MM-dd")
    这里的模式字符串遵循 java.text.SimpleDateFormat 的规则,用于定义日期格式。yyyyMM 等是预定义的格式符号(占位符),不可随意替换。

  • @NumberFormat(pattern = "###,###,###.##")
    这里的模式字符串遵循 java.text.DecimalFormat 的规则,用于定义数字格式。#, 等是预定义的格式符号。

2. 能否替换格式符号?

✅ 日期格式 (@DateTimeFormat)

  • yyyy 能否换成 xxxx
    不能yyyy 表示四位年份(如 2023),而 xxxx 不是合法的格式符号。日期格式符必须使用 SimpleDateFormat 支持的符号,符号详见 SimpleDateFormat 文档。

✅ 数字格式 (@NumberFormat)

  • # 能否换成 $
    不能# 表示数字占位符(可选位,不足时不补零),而 $ 是字面量字符(直接显示为 $)。例如:

    • 合法模式:"$###,###.##" → 显示如 $1,234.56

    • 非法替换:"$$$,$$$,$$$.$$" → 会报错($ 不能替代 # 的功能)。

经测试,都报错了,看来DP说得对。

        日期报错x非法,Illegal pattern character 'x';

        数字转换失败,NumberFormatException

应用实例-Postman完成测试

日期要在取值范围内,数字按规范,否则无法转换,页面报错400

相关文章:

springMVC-9数据格式化

数据格式化 学习目标&#xff1a; 理解在我们提交数据(比如表单时)&#xff0c;SpringMVC怎样对提交的数据进行转换和处理的 Spring MVC 上下文中内建了很多转换器&#xff0c;可完成大多数 Java 类型的转换工作。 基本数据类型可以和字符串之间自动完成转换 应用实例-页面…...

Kafka 和Redis 在系统架构中的位置

Kafka 位置&#xff1a;位于应用层和数据存储层之间&#xff0c;作为消息队列和数据传输中间件。作用&#xff1a; 数据收集与传输&#xff1a;收集应用层产生的数据&#xff0c;传输到后端数据存储系统。消息队列&#xff1a;实现应用层各服务之间的异步通信和解耦。与应用层…...

【Spring AI】如何实现文生图功能

在人工智能与软件开发深度融合的当下&#xff0c;Spring AI 作为构建 AI 驱动应用的有力框架&#xff0c;能够便捷集成各类 AI 能力。 文生图技术可将文本描述转化为图像&#xff0c;极具应用价值。接下来&#xff0c;我给大家详细讲解一下如何使用 Spring AI 调用文生图功能。…...

【ISAQB大纲解读】Kafka消息总线被视为“自下而上设计”?

Kafka消息总线被视为“自下而上设计”的典型案例&#xff0c;核心在于其设计路径和演化逻辑完全符合自下而上方法的本质特征&#xff1a; 自下而上设计的核心逻辑 #mermaid-svg-pDSqW0S2h0bj15iN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...

ISBN书号查询接口如何用PHP实现调用?

一、什么是ISBN书号查询接口 ISBN数据查询接口是一项图书信息查询服务。它基于全球通用的ISBN编码系统&#xff0c;帮助用户快速获取图书的详细信息&#xff0c;包括书名、作者、出版社、出版时间、价格、封面等关键字段。 该接口广泛应用于电商平台、图书馆管理系统、二手书…...

什么是 Docker Compose 的网络(network),为什么你需要它,它是怎么工作的

Docker Compose 的网络就是&#xff1a;让多个容器之间能像“连上同一个局域网”一样互相通信&#xff0c;不用管 IP&#xff0c;用服务名就能访问彼此。 就像家里连接到同一个 WiFi 的手机、电脑、电视&#xff0c;它们都能互相发现对方&#xff0c;Docker 里的容器也是一样 …...

嵌入式Linux 期末复习指南(上)

鉴于互联网上针对本科目相关复习视频及资料过少&#xff0c; 撰写本篇期末复习指南用作期末复习知识点扫盲&#xff0c;以应对本科期末考试及格之用。 由于任课老师并透露考试范围或任何有关试卷的相关信息&#xff0c;本篇指南基于教材、上机实验报告及作者经验编写&#xff0…...

SpringBoot3.2新特性:JdbcClient

文章目录 一、简介二、使用1、支持隐式位置参数2、通过索引设置位置参数3、支持 Name / Value 对命名参数4、通过 Map 设置命名参数5、使用 JdbClient 执行更新操作6、使用示例 参考资料 一、简介 Spring 6.1 中新添加了 JdbcClient 接口&#xff0c;它提供了 Fluent 风格的 A…...

Dify:启动 Web 服务的详细指南

1. 进入 web 目录 cd web解释&#xff1a; cd 是 “change directory” 的缩写&#xff0c;用于切换当前工作目录。您需要进入项目的 web 目录&#xff0c;这是前端代码所在的位置。在这个目录下&#xff0c;您可以执行构建和启动 Web 服务的相关命令。 2. 安装依赖 pnpm in…...

3.1 HarmonyOS NEXT分布式数据管理实战:跨设备同步、端云协同与安全保护

HarmonyOS NEXT分布式数据管理实战&#xff1a;跨设备同步、端云协同与安全保护 在万物互联的时代&#xff0c;数据的跨设备流转与安全共享是全场景应用的核心需求。HarmonyOS NEXT通过分布式数据管理技术&#xff0c;实现了设备间数据的实时同步与端云协同&#xff0c;为开发…...

Aop + 注解实现数据字典类型转换 EasyExcel导出

Aop 注解 实现数据字典类型转换 文章目录 Aop 注解 实现数据字典类型转换一、基础方式✅字典转换简介&#x1f449;实现步骤✅ 1. 定义自定义注解Dict ✅ 2. 定义查询字典项的两个方法✅ 3. 定义Aop拦截我们查询的方法✅ 4. VO映射类✅ 5. Controller层✅ 6. serviceImpl✅ 7. …...

Python 元组方法全集详解

Python 元组方法全集详解 在 Python 中,元组(tuple)是不可变序列类型,因此支持的操作比列表少。以下是元组支持的所有方法和操作: 一、元组核心方法 1. 创建元组 # 标准创建 t = (1, 2, 3) # (1, 2, 3) t = tuple(...

Selenium 中 JavaScript 点击操作的原理及应用

在 Selenium 中使用 JavaScript 执行点击操作&#xff08;如 driver.execute_script("arguments[0].click();", element)&#xff09;的原理涉及 WebDriver 架构、浏览器事件机制以及 JavaScript 对 DOM 的直接操作&#xff0c;以下是详细解释&#xff1a; 1. Selen…...

Xilinx超过256m bit flash固件跳转失败问题

问题描述 按照 链接: Xilinx 7系列fpga在线升级和跳转 这个方式跳转失败 问题排查 进一步排查现象如下 上面这个现象呈现出明显的以16m为周期的规律。感觉很大概率是因为flash超过了16m&#xff08;256bit&#xff09;导致的地址越界问题。另外我在CSDN上也找到类似的问题…...

SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入

可重入 Redisson 的锁支持 可重入性&#xff0c;这意味着同一个线程在获取锁后&#xff0c;如果再次尝试获取该锁&#xff0c;它可以成功地获得锁&#xff0c;而不会被阻塞。 每次一个线程成功获取锁后&#xff0c;它的持有次数会增加。当线程再次获取该锁时&#xff0c;Redi…...

02 APP 自动化-Appium 运行原理详解

环境搭建见 01 APP 自动化-环境搭建 文章目录 一、Appium及Appium自动化测试原理二、Appium 自动化配置项三、常见 ADB 命令四、第一个 app 自动化脚本 一、Appium及Appium自动化测试原理 Appium 跨平台、开源的 app 自动化测试框架&#xff0c;用来测试 app 应用程序&#x…...

由docker引入架构简单展开说说技术栈学习之路

想象一下&#xff0c;你开了一家线上小卖部&#xff08;单机版&#xff09;&#xff0c;突然爆单了怎么办&#xff1f;别急&#xff0c;技术架构的升级打怪之路&#xff0c;可比哆啦A梦的口袋还神奇&#xff01; 第1关&#xff1a;单枪匹马的创业初期&#xff08;单机架构&…...

linux 1.0.5

环境变量到底是什么 也就是windows上面的环境变量 就是这个东东&#xff0c;用户变量和系统变量&#xff0c;那这些到底是啥呢&#xff1f; 主包只是用过&#xff0c;配置来配置去的&#xff0c;就是不知道是啥意思 windows上面的环境变量 windows的ls命令是dir 输入calc可有…...

强化学习的前世今生(五)— SAC算法

书接前四篇 强化学习的前世今生&#xff08;一&#xff09; 强化学习的前世今生&#xff08;二&#xff09; 强化学习的前世今生&#xff08;三&#xff09;— PPO算法 强化学习的前世今生&#xff08;四&#xff09;— DDPG算法 本文为大家介绍SAC算法 7 SAC 7.1 最大熵强化…...

SQL进阶之旅 Day 8:窗口函数实用技巧

【SQL进阶之旅 Day 8】窗口函数实用技巧 在现代数据库开发中&#xff0c;处理复杂的业务逻辑和大规模数据时&#xff0c;仅仅依靠传统的GROUP BY和JOIN操作已经无法满足需求。**窗口函数&#xff08;Window Function&#xff09;**作为SQL标准的一部分&#xff0c;为开发者提供…...

生成对抗网络(GAN)基础原理深度解析:从直观理解到形式化表达

摘要 本文详细解析 生成对抗网络&#xff08;GAN&#xff09; 的 核心原理&#xff0c;从通俗类比入手&#xff0c;结合印假钞与警察博弈的案例阐述生成器 与 判别器 的对抗机制&#xff1b;通过模型结构示意图&#xff0c;解析 噪声采样、样本生成 及判别流程&#xff1b;基于…...

ubuntu 安装redis-6.2.9 源码安装和相关配置详解

目录 1 查看redis 软件列表 2 操作系统信息 3 redis软件下载并编译安装 4 redis 配置文件 5 启动redis 6 redis登录测试 7 设置redis开机启动 8 redis 配置详解 1 查看redis 软件列表 https://download.redis.io/releases/ 2 操作系统信息 rootu24-redis-120:~# cat /…...

c++之数组

目录 C数组基础概念 数组常见操作 二维数组定义与初始化 二维数组遍历方法 二维数组与函数 C数组基础概念 数组是C中用于存储相同类型元素的连续内存结构。通过索引访问元素&#xff0c;索引从0开始。数组大小必须在编译时确定&#xff0c;属于静态数据结构。 #include &…...

torch.distributed.launch 、 torchrun 和 torch.distributed.run 无法与 nohup 兼容

问题现象&#xff1a; 使用nohup 启动torch的分布式训练后&#xff0c; 由于ssh断开与服务器的连接&#xff0c; 导致训练过程出错&#xff1a; WARNING:torch.distributed.elastic.agent.server.api:Received 1 death signal, shutting down workers WARNING:torch.distribu…...

[SC]C++ 中 struct vs. class 的唯一区别

SystemC中 struct vs. class 的唯一区别 一、背景: 在 SystemC 示例里你会常看到这样的写法:SC_MODULE(Top) {// … ports, signals, 进程注册 … };而如果你展开宏 SC_MODULE(Top),它本质上就是:struct Top : sc_core::sc_module {// public:// Top(sc_core::sc_module_…...

React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术

React设计模式&#xff1a;提升代码架构的艺术 引言 在React开发中&#xff0c;设计模式是构建可维护、可扩展和高性能应用的关键。随着应用复杂性的增加&#xff0c;掌握高级设计模式不仅是技术上的挑战&#xff0c;更是打造优雅架构的艺术。对于有经验的开发者而言&#xf…...

【GitHub开源AI精选】WhisperX:70倍实时语音转录、革命性词级时间戳与多说话人分离技术

系列篇章&#x1f4a5; No.文章1【GitHub开源AI精选】LLM 驱动的影视解说工具&#xff1a;Narrato AI 一站式高效创作实践2【GitHub开源AI精选】德国比勒费尔德大学TryOffDiff——高保真服装重建的虚拟试穿技术新突破3【GitHub开源AI精选】哈工大&#xff08;深圳&#xff09;…...

【leetcode】459.重复的子字符串

文章目录 题目题解枚举 题目 459.重复的子字符串 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入…...

华为OD机试真题——文件目录大小(2025 A卷:100分)Java/python/JavaScript/C++/C语言/GO六种语言最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《文件目录大小》: 目录 题…...

【Java】mybatis-plus乐观锁与Spring重试机制

上一篇【Java】mybatis-plus乐观锁-基本使用 讲到了mybatis-plus的基本使用&#xff0c;简单的使用Version和一个基础配置类即可实现乐观锁。 但是mybatis-plus本身并没有自带重试机制。 即当我们带上版本号去更新数据&#xff0c;但是由于另一个线程已经将版本号修改了&#x…...