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

news2024/11/17 11:32:21

文章目录

    • 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/28
  Time: 19:22
  User: 孙显圣
  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;
    }

    @Override
    public 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的key
        map.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/28
  Time: 19:25
  User: 孙显圣
  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/28
  Time: 20:10
  User: 孙显圣
  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/28
  Time: 19:25
  User: 孙显圣
  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.一旦取消的属性绑定,则应该把对应属性的信息校验注解去掉,要不然进入数据校验时可能会出错,因为数据校验这个环节是正常执行的
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.setDisallowedFields("name", "email");
    }
2.Monster.java取消那两个字段的数据校验

image-20240229113942129

3.结果展示

image-20240229114347001

image-20240229114408916

6.数据绑定机制总结

image-20240229120649146

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630199.html

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

相关文章

【面经】汇总

面经 Java基础集合都有哪些面向对象的三大特点ArrayList和LinkedList的区别&#xff1f;ArrayList底层扩容是怎么实现的&#xff1f;讲一讲HashMap、以及put方法的过程讲一讲HashMap的扩容过程Hashmap为什么要用红黑树而不用其他的树&#xff1f;Java8新特性有哪些LoadFactor负…

ASP.NET企业投资价值分析系统

摘 要 本文将影响股票投资价值的宏观因素、行业因素、企业内部等诸多因素予以量化分析&#xff0c;对钢铁板块和汽车板块各上市公司进行综合评估&#xff0c;为广大股民的投资方向和资金安全提供了有力的支持。本文还阐述了企业投资价值分析的必要性&#xff0c;说明了企业投…

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

通过Cmake官网下载.gz文件安装最新版本的CMAKE、适用于debian

1.前往官网下载最新版本debian https://cmake.org/download/ 2.选他 3. 通过XFTP传输到服务器 4. 解压文件 #cd 进入对应目录&#xff0c;然后执行下面命令解压 $ tar -zxvf cmake-3.29.2.tar.gz5.执行这个文件 $ ./bootstrap6.完成之后再执行这个 $ make7.然后&#xff…

Java高阶私房菜:JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…

NeRF项目代码详解

1 项目结构 开源代码&#xff1a;https://github.com/yenchenlin/nerf-pytorch 在上述框架图中&#xff0c;首先重config_parse 中读取文件参数&#xff0c; 然后通过load_blender加载数据&#xff0c;加载的数据包括训练集、验证集和测试集以及摄像机的内外参数&#xff1b; …

淘宝、京东、拼多多纷争:“造节”过气,“制剧”当红

经过多年发展&#xff0c;消费者对国内电商三巨头形成了固有印象&#xff1a;拼多多价格低、京东物流快、淘宝生态完善。 消费者的固有印象是淘宝、京东、拼多多在市场上建立的“安全区”&#xff0c;安全区之内已没有挑战&#xff0c;安全区之外才是它们想要征服的新领地。而…

计算机视觉——使用OpenCV GrabCut算法从图像中移除背景

GrabCut算法 GrabCut算法是一种用于图像前景提取的技术&#xff0c;由Carsten Rother、Vladimir Kolmogorov和Andrew Blake三位来自英国剑桥微软研究院的研究人员共同开发。该技术的核心目标是在用户进行最少交互操作的情况下&#xff0c;自动从图像中分割出前景对象。 在Gra…

每日一题:视频拼接

你将会获得一系列视频片段&#xff0c;这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠&#xff0c;也可能长度不一。 使用数组 clips 描述所有的视频片段&#xff0c;其中 clips[i] [starti, endi] 表示&#xff1a;某个视频片段开始于 starti 并于 …

LeetCode39题: 组合总和(原创)

【题目描述】 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复…

技术速递|利用 Redis 使 AI 驱动的 .NET 应用程序更加一致和智能

作者&#xff1a;Catherine Wang 排版&#xff1a;Alan Wang Redis 是一种流行的内存数据存储&#xff0c;可用于解决构建和扩展智能应用程序的关键挑战。在本文中&#xff0c;你将了解如何使用 Redis 的 Azure 缓存来提高使用 Azure OpenAI 的应用程序的效率。 Redis 的 Azur…

聚观早报 | 生数科技推出Vidu;2024款欧拉好猫正式上市

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月28日消息 生数科技推出Vidu 2024款欧拉好猫正式上市 雷诺与小米汽车洽谈技术合作 微软张祺谈未来AI如何发展 …

机器学习/算法工程师面试题目与答案-数学基础部分

机器学习/算法工程师面试题目--数学基础部分 一、数学基础1、微积分SGD,Momentum,Adagard,Adam原理L1不可导的时候该怎么办sigmoid函数特性 2、统计学&#xff0c;概率论求 Max(a, b) 期望拿更长的玫瑰花的最好策略最大化工作天数的员工数切比雪夫不等式随机截成三段组成三角形…

基于MSP430F249的电子钟仿真(源码+仿真)

目录 1、前言 2、仿真 3、程序 资料下载地址&#xff1a;基于MSP430F249的电子钟仿真(源码仿真&#xff09; 1、前言 基于MSP430F249的电子钟仿真&#xff0c;数码管显示时分秒&#xff0c;并可以通过按键调节时间。 2、仿真 3、程序 #include <MSP430x24x.h> #def…

Jenkins集成Terraform实现阿里云CDN自动刷新

在互联网业务中&#xff0c;CDN的应用已经成了普遍&#xff0c;SRE的日常需求中&#xff0c;CDN的刷新在前端需求逐渐中占了很大比例&#xff0c;并且比较琐碎。做为合格的SRE&#xff0c;把一切自动化是终极使命&#xff0c;而今天就分享通过JenkinsTerraform实现阿里云的CDN自…

java-动态代理

为什么需要代理&#xff1f; 如何创建代理 注意&#xff1a;实现类和代理需要实现同一个接口 接口 public interface Star {String sing(String song);void dance(); }实现类 public class BigStar implements Star {private String name;public BigStar(String name) {this.…

2024Mac系统热门游戏排行榜 Mac支持的网络游戏有哪些?mac能玩哪些大型网游 苹果电脑Mac游戏资源推荐 Mac玩Windows游戏

“游戏是这个世界上唯一能和女性争夺男朋友的东西&#xff08;/滑稽&#xff0c;有不少女生也喜欢玩游戏&#xff09;。” 虽然只是一句玩笑话&#xff0c;不过也可以看出游戏对大多数男生来说是必不可少的一项娱乐活动了。而网络游戏是游戏中的一大分支&#xff0c;能让玩家们…

uniapp问题归类

最近使用uniapp中&#xff0c;遇到了一些问题&#xff0c;这边mark下。 1. 启动页变形 设置启动页的时候发现在部分android手机上启动页被拉伸了&#xff0c;最后看了下官方建议使用9.png图 生成9.png地址&#xff0c;推荐图片大小为1080x2340 uniapp推荐官方地址传送门 我…

Thread类的基本用法

1.线程创建 这里介绍线程创建常用的五种方法 1.继承Thread&#xff0c;重写run class MyThread extends Thread{public void run(){//这里写的代码就是线程要完成的任务while (true){System.out.println("hello thread");try {Thread.sleep(1000);//线程会休眠一秒…

Springboot+Vue项目-基于Java+MySQL的家政服务平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…