SpringMVC进阶(数据格式化以及数据校验)

news/2024/5/10 9:12:27

文章目录

    • 1.数据格式化
        • 1.基本介绍
          • 1.基本说明
          • 2.环境搭建
        • 2.基本数据类型和字符串转换
          • 1.需求分析
          • 2.环境搭建
            • 1.data_valid.jsp首页面
            • 2.Monster.java封装请求信息
            • 3.MonsterHandler.java处理请求信息
            • 4.monster_addUI.jsp添加妖怪界面
            • 5.单元测试
          • 3.保存妖怪信息
            • 1.MonsterHandler.java添加方法
            • 2.success.jsp添加成功跳转界面
            • 3.monster_addUI.jsp填写action
          • 4.结果展示
            • 1.基本介绍
            • 2.正确情况
            • 3.类型转换失败的情况
        • 3.特殊数据类型和字符串的转换
          • 1.基本介绍
          • 2.环境搭建
            • 1.Monster.java添加内容
            • 2.monster_addUI.jsp修改
          • 3.结果展示
            • 1.成功情况
            • 2.失败情况
    • 2.验证以及国际化
        • 1.基本介绍
          • 1.概述
          • 2.JSR303框架
          • 3.Hibernate Validator 扩展注解
        • 2.导入jar包
        • 3.具体实例
          • 1.修改MonsterHandler.java的save方法
          • 2.修改monster_addUI.jsp处理表单回显
          • 3.配置国际化springDispatcherServlet-servlet.xml
          • 4.i18n.properties
          • 5.结果展示
          • 6.细节和注意事项
            • 演示
        • 4.注解组合使用
          • 1.引出
          • 2.演示
        • 5.取消属性绑定
          • 1.基本介绍
          • 2.代码实例
            • 1.MonsterHandler.java添加方法
            • 2.Monster.java取消那两个字段的数据校验
            • 3.结果展示
        • 6.数据绑定机制总结

1.数据格式化

1.基本介绍
1.基本说明

image-20240228191333141

2.环境搭建

回到之前的springmvc项目下

2.基本数据类型和字符串转换
1.需求分析

image-20240228191723809

2.环境搭建
1.data_valid.jsp首页面
<%--Date: 2024/2/28Time: 19:22User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<a href="<%=request.getContextPath()%>/addMonsterUI">添加妖怪</a>
</body>
</html>
2.Monster.java封装请求信息
package com.sun.web.datavalid.entity;/*** @author 孙显圣* @version 1.0*/
public class Monster {private Integer id;private String email;private Integer age;private String name;//无参构造器public Monster() {}public Monster(Integer id, String email, Integer age, String name) {this.id = id;this.email = email;this.age = age;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Monster{" +"id=" + id +", email='" + email + '\'' +", age=" + age +", name='" + name + '\'' +'}';}
}
3.MonsterHandler.java处理请求信息
package com.sun.web.datavalid;import com.sun.web.datavalid.entity.Monster;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.Map;/*** @author 孙显圣* @version 1.0*/
@Controller
@Scope(value = "prototype") //是多例类型的,每次请求到这里都会创建一个实例
public class MonsterHandler {@RequestMapping("/addMonsterUI")public String addMonsterUI(Map<String, Object> map) {//向这个map中添加bean会自动封装到request域中//springmvc标签如果想要正常显示,需要在request域中有一个bean,并且modelAttribute必须是bean的keymap.put("monster", new Monster());//返回给视图解析器,默认视图解析器根据前缀和后缀路径拼接return "datavalid/monster_addUI";}}
4.monster_addUI.jsp添加妖怪界面
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--Date: 2024/2/28Time: 19:25User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><form:form action="?" method="post" modelAttribute="monster">妖怪名字:<form:input path="name"/><br>妖怪年龄:<form:input path="age"/><br>电子邮件:<form:input path="email"/><br><input type="submit" value="添加妖怪">
</form:form>
</body>
</html>
5.单元测试

image-20240228201014749

image-20240228201023460

3.保存妖怪信息
1.MonsterHandler.java添加方法
    @RequestMapping(value = "/save")public String save(Monster monster) { //自动封装数据System.out.println("monster=" + monster);return "datavalid/success";}
2.success.jsp添加成功跳转界面
<%--Date: 2024/2/28Time: 20:10User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h3>添加成功!</h3>
</body>
</html>
3.monster_addUI.jsp填写action

image-20240228202054825

4.结果展示
1.基本介绍

image-20240228202632368

2.正确情况

image-20240228202806973

image-20240228202814293

image-20240228202823774

3.类型转换失败的情况

image-20240228202924346

image-20240228202943952

image-20240228203053325

3.特殊数据类型和字符串的转换
1.基本介绍

image-20240228203158046

2.环境搭建
1.Monster.java添加内容
    @DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;@NumberFormat(pattern = "###,###.##") //如果填充的是123,122.12则会转换成123122.12的浮点数private float salary;public void setBirthday(Date birthday) {this.birthday = birthday;}public void setSalary(float salary) {this.salary = salary;}public Date getBirthday() {return birthday;}public float getSalary() {return salary;}

image-20240228204831208

2.monster_addUI.jsp修改

image-20240228204905055

3.结果展示
1.成功情况

image-20240228204941236

image-20240228204956222

image-20240228205007680

2.失败情况

image-20240228205130826

image-20240228205113487

image-20240228205156791

2.验证以及国际化

1.基本介绍
1.概述

image-20240228205449474

2.JSR303框架

image-20240228205514792

image-20240228205525399

3.Hibernate Validator 扩展注解

image-20240228205611930

2.导入jar包

image-20240229084629096

3.具体实例
1.修改MonsterHandler.java的save方法
    @RequestMapping(value = "/save")public String save(@Valid Monster monster, Errors errors, Map<String, Object> map) {//在将请求信息封装到monster里的时会进行校验,如果有错误则封装到errors中,//在map中封装了monster对象,以及错误信息System.out.println("monster=" + monster);System.out.println("===========map===========");for (Map.Entry<String, Object> entry : map.entrySet()) {System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());}System.out.println("===========errors===========");List<ObjectError> allErrors = errors.getAllErrors();for (ObjectError allError : allErrors) {System.out.println(allError);}return "datavalid/monster_addUI";}
2.修改monster_addUI.jsp处理表单回显
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--Date: 2024/2/28Time: 19:25User: 孙显圣Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><form:form action="save" method="post" modelAttribute="monster">妖怪名字:<form:input path="name"/><form:errors path="name"/> <br>妖怪年龄:<form:input path="age"/><form:errors path="age"/> <br>电子邮件:<form:input path="email"/><form:errors path="email"/> <br>妖怪生日:<form:input path="birthday"/><form:errors path="birthday"/> 要求以3333-33-33的形式<br>妖怪薪水:<form:input path="salary"/><form:errors path="salary"/> 要求以111,222,12的形式<br><input type="submit" value="添加妖怪">
</form:form>
</body>
</html>
3.配置国际化springDispatcherServlet-servlet.xml
    <!--配置国际化错误信息的资源处理bean--><bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!--这里是默认到src下的properties文件中去读取的basename配置的就是文件名,所以他会读取src的i18n.properties文件--><property name="basename" value="i18n"></property></bean>
4.i18n.properties
NotEmpty.monster.name=\u540d\u5b57\u4e0d\u80fd\u4e3a\u7a7a
typeMismatch.monster.age=\u5e74\u9f84\u8303\u56f4\u57281\u5230100
typeMismatch.monster.salary=\u85aa\u8d44\u683c\u5f0f\u662f###,###.##
typeMismatch.monster.birthday=\u751f\u65e5\u683c\u5f0f\u662fyyyy-MM-dd
5.结果展示

image-20240229102340481

6.细节和注意事项

image-20240229103417758

image-20240229103428692

演示

image-20240229104006824

4.注解组合使用
1.引出

image-20240229104223531

2.演示

image-20240229104727679

image-20240229104904610

5.取消属性绑定
1.基本介绍

image-20240229111929465

2.代码实例
1.MonsterHandler.java添加方法
    /*1.使用这个注解标识的方法会在封装信息到monster对象之前执行2.可以取消对某个属性的绑定3.setDisallowedFields接收的是可变参数,可以填写多个字段4.一旦取消的属性绑定,则应该把对应属性的信息校验注解去掉,要不然进入数据校验时可能会出错,因为数据校验这个环节是正常执行的*/@InitBinderpublic void initBinder(WebDataBinder webDataBinder) {webDataBinder.setDisallowedFields("name", "email");}
2.Monster.java取消那两个字段的数据校验

image-20240229113942129

3.结果展示

image-20240229114347001

image-20240229114408916

6.数据绑定机制总结

image-20240229120649146


http://www.mrgr.cn/p/54664007

相关文章

什么因素可以影响到代理IP稳定性?爬虫代理IP有哪些作用?

一、什么因素可以影响到代理IP稳定性 代理IP的稳定性受到多种因素的影响&#xff0c;以下是一些主要的因素&#xff1a; 代理IP的质量&#xff1a;不同的代理IP提供商提供的代理IP质量参差不齐&#xff0c;一些低质量的代理IP可能经常出现连接问题或速度慢的情况&#xff0c;…

5、Flink事件时间之Watermark详解

1&#xff09;生成 Watermark 1.Watermark 策略简介 为了使用事件时间语义&#xff0c;Flink 应用程序需要知道事件时间戳对应的字段&#xff0c;即数据流中的每个元素都需要拥有可分配的事件时间戳。 通过使用 TimestampAssigner API 从元素中的某个字段去访问/提取时间戳。…

linux2-ls

lsls , list directory contents, 在命令行中, 以平铺的形式, 展示当前工作目录(默认为/home/用户名 目录)下的内容(文件和文件夹)ls # 默认为ls /home/用户名 lsls -h -h, human-readable, 表示以易于阅读的形式, 列出文件的大小(如K,M,G) 不能单独使用, 要和-l混合使用 ls -h…

穿越物联网的迷雾:深入理解MQTT协议

目录标题 1、MQTT简介核心特性 2、MQTT的工作原理通信过程 3、MQTT的消息质量&#xff08;QoS&#xff09;4、安全机制5、实践应用环境准备示例项目发布者客户端订阅者客户端 6、最佳实践7、结论8、参考资料 在物联网&#xff08;IoT&#xff09;的海洋中&#xff0c;数据像水流…

架构师系列- 消息中间件(12)-kafka基础

1、应用场景 1.1 kafka场景 Kafka最初是由LinkedIn公司采用Scala语言开发&#xff0c;基于ZooKeeper&#xff0c;现在已经捐献给了Apache基金会。目前Kafka已经定位为一个分布式流式处理平台&#xff0c;它以 高吞吐、可持久化、可水平扩展、支持流处理等多种特性而被广泛应用…

ubutu ac68

1、直接去 https://github.com/morrownr/8814au 下载编译,运行 install-driver.sh,重启后 2、 3、 断开再连,然后usb拔掉再插,选择 虚拟机的系统 4 抓 https://blog.csdn.net/weixin_41856150/article/details/102327913

《痞子衡嵌入式半月刊》 第 98 期

痞子衡嵌入式半月刊: 第 98 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

刷题训练之前缀和

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握前缀和算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

瑞士轮——结构体(快速排序 or 归并排序?)

瑞士轮——结构体&&(快速排序 or 归并排序?)题目链接:https://www.luogu.com.cn/problem/P1309 题意应该非常明确了(这里就不细讲了):有2*N个人,首先根据成绩进行排序,相邻的两个人进行比赛,强的人成绩+1,输的人成绩不变,最后又根据成绩进行排序,进行r次操作,…

管理集群工具之LVS

管理集群工具之LVS 集群概念 将很多机器组织在一起&#xff0c;作为一个整体对外提供服务集群在扩展性、性能方面都可以做到很灵活集群分类 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing …

pytest系列——allure之在测试用例添加标题(@allure.title())

前言 通过使用装饰器allure.title可以为测试用例自定义一个更具有阅读性的易读的标题。 allure.title的三种使用方式&#xff1a; 直接使用allure.title为测试用例自定义标题&#xff1b;allure.title支持通过占位符的方式传递参数&#xff0c;可以实现测试用例标题参数化&a…

C++|stack-queue-priority_queue(适配器+模拟实现+仿函数)

目录 一、容器适配器 1.1容器适配器概念的介绍 1.2stack和queue的底层结构 1.3deque容器的介绍 1.3.1deque的缺陷及为何选择他作为stack和queue的底层默认实现 二、stack的介绍和使用 2.1stack的介绍 2.2stack的使用 2.3stack的模拟实现 三、queue的介绍和使用 …

练习安装Python扩展库

(三)、练习安装Python扩展库 【实验截图】 1、在资源管理器中进入 Python 安装目录的 scripts 子目录,然后按下 Shift 键,在空 白处单击鼠标右键,在弹出来的菜单中选择“在此处打开命令窗口”进入命令提示符环境2.使用 pip 命令在线安装 Python 扩展库 numpy、pandas、sci…

Spark-机器学习(3)回归学习之线性回归

在之前的文章中&#xff0c;我们了解我们的机器学习&#xff0c;了解我们spark机器学习中的特征提取和我们的tf-idf&#xff0c;word2vec算法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你…

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

4.25日团队开发第六天

今天进行了晨会晨会成员:董茂欣、龚涵彬、刘雪超 主要进行了团队内容完成分析,以及不会点的讨论,调用后端接口完成视频的播放

企业网架构与安全设备部署

在现代网络中,为了满足不同规模和需求的组织和企业的通信需求,网络架构通常会划分为多个层次,其中包括接入层、汇聚层和核心层。目录企业网三层架构常见安全设备网络区域划分网络架构拓扑示例 企业网三层架构 在现代网络中,为了满足不同规模和需求的组织和企业的通信需求,…

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器&#xff0c;它以其简洁的界面和强大的功能&#xff0c;成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式&#xff0c;用户无需关心复杂的M…

Ubuntu部署jmeter与ant

为了整合接口自动化的持续集成工具&#xff0c;我将jmeter与ant都部署在了Jenkins容器中&#xff0c;并配置了build.xml 一、ubuntu部署jdk 1&#xff1a;先下载jdk-8u74-linux-x64.tar.gz&#xff0c;上传到服务器&#xff0c;这里上传文件用到了ubuntu 下的 lrzsz。 ubunt…