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

文章目录

    • 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.mzph.cn/web/4353.shtml

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

相关文章

路由嵌套是什么?怎么进行路由嵌套

路由嵌套&#xff1a; 此时我们从一个组件切换到另一个组件时&#xff0c;会直接跳转页面&#xff0c;所以我们需要一个东西让组件们可以在一个页面显示&#xff0c;这时候就需要进行路由嵌套。我们要找到组件之间的关系&#xff0c;大组件嵌套小组件&#xff0c;从大组件中打…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242.有效的字母异位词 字符串仅包含小写字母&#xff0c;那么可以使用数组声明26位大小&#xff0c;遍历其中一个字符串&#xff0c;记录字符的个数&#xff0c;然后遍历另一个字符串&#xff0c;减去相应字符&#xff0c;最后都为0则符合条件 class Solution:def isAnagram(…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

构建数据驱动的文化价值体系,还得靠数据分析

在您的业务中创建以数据为中心的文化需要思维方式的转变&#xff0c;这不会在一夜之间发生。但是&#xff0c;这是一个目标变得越来越容易实现&#xff0c;这是由您的员工以激情和热情朝着这个目标努力的驱动力所驱使的&#xff0c;而不是高层要求他们这样做的目标。 有多种因…

Redis面试题超详细(2024最新)

1、Redis是单线程执行还是多线程执行&#xff1f;它有线程安全问题吗&#xff1f;为什么吗&#xff1f; Redis版本在6.0之前都是使用的单线程运行的。所有的客户端的请求处理、命令执行以及数据读写操作都是在一个主线程中完成得。这种设计目的就是为了防止多线程环境下的锁竞争…

git变更远端仓库名之后如何修改本地仓库配置的另一种方法?(删remote指针、添加、绑定master)

背景 如果某个远端的仓库地址变化后&#xff0c;本地仓库可以修改对应的remote。 之前谈过几种方法&#xff0c;比如重新设置一个新的remote的指针&#xff0c;绑定到新地址。然后删除origin&#xff0c;然后把新指针mv到origin。比如直接seturl修改&#xff08;git remote se…

深度学习从入门到精通——词向量介绍及应用

词向量介绍 词向量&#xff08;Word embedding&#xff09;&#xff0c;即把词语表示成实数向量。“好”的词向量能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能&#xff0c;例如语法分析和情感分析。词向量与词嵌入技术的提出是为了解决onehot的缺陷。它把…

ESP32-S3的MQTT实战

昨天&#xff0c;我们讲了socket通信&#xff0c;当服务器和客户端建立起连接时&#xff0c;就可以互相通信了。在互联网应用大多使用WebSocket接口来传输数据。而在物联网的应用中&#xff0c;常常出现这种情况&#xff1a;海量的传感器&#xff0c;需要时刻保持在线&#xff…

微信小程序[黑马笔记]

简介 常用组件 视图组件 <!--pages/list/list.wxml--><scroll-view class"container1" scroll-y><view>A</view><view>B</view><view>A</view></scroll-view><!--pages/list2/list.wxml--><swiper …

❤mac使用Idea工具

❤mac使用Idea工具 1、安装 直接跳过&#xff0c;文章有 &#xff08;点击跳转&#xff09; 给自己的mac系统上安装java环境 2、使用 快捷键 Command , 系统首选项 设置Idea连接数据库 打开右侧的database&#xff08;或菜单里&#xff09;连接数据库&#xff0c;根据提…

ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types]

编译环境 Apple M1 Pro Sonoma 14.1.2 编译的时候出现如下报错&#xff1a; libavcodec/aarch64/h264dsp_init_aarch64.c:84:38: error: incompatible function pointer types assigning to h264_weight_func (aka void (*)(unsigned char *, long, int, int, int, int)) from…

Ubuntu中的 Everything 搜索软件 ==> fsearch

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 在 Windows 中&#xff0c;我经常使用 Everything 来进行文件搜索&#xff0c;搜索效率比 Windows 自带的高出千百倍。 那么在 Ubuntu 系统中&#xff0c;有没有类似的软件呢&#xff1f;那必须有&#xff0c;它就是 FSearch 。…

安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲配置流程

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

libVLC 制作一款精美的播放器

1.简介 本文将简单介绍使用libVLC制作一款精美的播放器。 开发环境:Visual Studio + Qt插件。 Qt版本:Qt5.9。 libVLC版本:3.0.20。 以下是运行界面效果图:截取其中几张。 右键菜单,功能还是比较齐全。 2.ui界面构成 接下来简单介绍一下ui界面构成。 主界面由播放树…

Mac下使用homebrew管理多版本mysql同时启动

Mac下使用homebrew管理多版本mysql同时启动 思路 给每个版本分配不同的数据目录和配置文件即可 本文尝试了使用 brew 安装管理多个MySQL版本&#xff0c;同时运行、直接切换 安装 如果已有数据文件请自行备份以及使用 安装 mysql 5.7 brew install mysql5.7在 /opt/home…

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务&#xff0c;例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件&#xff0c;你需要掌握以下&#xff1a; 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

Spring 2.x整合Activiti 7

https://www.cnblogs.com/dw3306/p/16121810.html 整合在线编辑 https://blog.csdn.net/weixin_41039677/article/details/117947327 引入依赖 <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId…

Git系列:Git Branch 用法总结

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Docker数据管理与Dockerfile镜像创建

前言 在容器化环境中&#xff0c;如何有效地管理和持久化数据成为了开发人员和运维团队面临的挑战之一&#xff1b;另一方面&#xff0c;镜像的创建是构建容器化应用的基础。优化的镜像设计可以提高部署效率和应用性能&#xff0c;减少资源消耗和运行成本。本文将介绍 Docker …

纯血鸿蒙APP实战开发——预渲染实现Web页面瞬开效果

介绍 为了便于大家在使用本案例集时能够更详细的了解各个案例&#xff0c;本案例基于Web预渲染实现了案例介绍功能&#xff0c;即应用右下角的问号icon。 效果图预览 使用说明 因为直接加载的线上README&#xff0c;因此本功能需联网使用点击icon&#xff0c;即会弹出对应案…