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/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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件开发规范篇】Git分支使用规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

windows驱动开发-中断(一)

中断是windows中最难的一部分&#xff0c;这是因为中断本身属于操作系统的一部分&#xff0c;理解了中断和内存&#xff0c;对整个系统也就了解了。 中断部分会先从中断优先级、中断处理、中断服务例程入手&#xff0c;大概讲述一下中断的概念&#xff1b;接着从中断的一般实现…

springboot 集成 activemq

文章目录 一&#xff1a;说明二&#xff1a;e-car项目配置1 引入activemq依赖2 application启动类配置消息监听3 application.yml配置4 MQConfig.java 配置类5 ecar 项目中的监听6 junit 发送消息 三&#xff1a;tcm-chatgpt项目配置5 MQListener.java 监听消息 三 测试启动act…

Docker② —— Cgroups详解

1. 概述 Cgroups 的全称是control groups&#xff0c;cgroups为每种可以控制的资源定义了一个子系统。Cgroups分为三个部分&#xff1a; cgroup 本身&#xff1a;对进程进行分组hierarchy&#xff1a;将 cgroup 形成树形结构subsystem&#xff1a;真正起到限制作用的部组件 cp…

【vscode】2024最新!vscode云端配置同步方案:code settings sync

小tian最近对电脑进行了系统重装&#xff0c;结果vscode相关配置和插件都没有保存记录&#xff0c;还好公司电脑里还有。痛定思痛&#xff0c;决定写一篇vscode云端同步配置方案&#xff0c;以作记录和分享~ 步骤一&#xff1a;安装vscode插件&#xff1a;code settings sync …

云贝餐饮连锁V2-2.9.9源码

云贝餐饮连锁V2独立版、版本更新至2.9.9&#xff0c;小程序、公众号版本&#xff0c;全插件&#xff0c;公众号小程序端&#xff0c;独立版&#xff1b; 带商家端&#xff0c;修复收银台、排队点餐、堂食点餐&#xff1b;最新版更新 搭建环境教程: 系统环境&#xff1a;CentO…

【04】JAVASE-循环语句【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

算法学习笔记Day9——动态规划基础篇

一、介绍 本文解决几个问题&#xff1a;动态规划是什么&#xff1f;解决动态规划问题有什么技巧&#xff1f;如何学习动态规划&#xff1f; 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法&#xff0c;只不过在计算机问题上应用比较多&#xff…

微信小程序小游戏开发,微信开发者工具提示该目录下的项目(wxapp2)已在工具中创建,怎么办

微信小程序小游戏开发&#xff0c;微信开发者工具提示该目录下的项目&#xff08;wxapp2&#xff09;已在工具中创建&#xff0c;怎么办 情况描述&#xff0c; 导入一个项目的时候&#xff0c;导入成了小游戏项目了 想换成小游戏项目&#xff0c;变不了了&#xff0c;提示 “…

未来已来:解锁AGI的无限潜能与挑战

未来已来&#xff1a;解锁AGI的无限潜能与挑战 引言 假设你有一天醒来&#xff0c;发现你的智能手机不仅提醒你今天的日程&#xff0c;还把你昨晚做的那个奇怪的梦解释了一番&#xff0c;并建议你可能需要减少咖啡摄入量——这不是科幻电影的情节&#xff0c;而是人工通用智能…

解决Milvus官网提供的单机版docker容器无法启动,以及其它容器进程与Milvus容器通信实现方案【Milvus】【pymilvus】【Docker】

文章目录 问题预备知识方案获取pymilvus获取milvus 实例多容器通信 问题 我的需求是做混合检索单机版可以满足&#xff0c;要走Docker容器部署&#xff0c;还需要和另一个容器中的程序做通信。官方文档提供的Milvus安装启动Milvus方案&#xff0c;见文档&#xff1a;传送门 我…

wlan二层直连组网实验(ensp)

目录 1. VLAN 端口类型及参数设计2. IP 地址规划3. WLAN数据规划(1) DHCP服务器配置(2) AC 源接口地址、认证方式配置(3) AP 组的创建(4) 创建域管理模板、国家码认证(5) 创建安全模板(6) 创建SSID模板(7) 创建VAP模板(8) AP组绑定模板(9) 查看&#xff1a; 1. VLAN 端口类型及…

以太网LAN双向透明传输CH9120透传芯片实现以太网转232串口转485转TTL串口

网络串口透传芯片 CH9120 1、概述 CH9120 是一款网络串口透传芯片。CH9120 内部集成 TCP/IP 协议栈&#xff0c;可实现网络数据包和串口数据的双向透明传输&#xff0c;具有 TCP CLIENT、TCP SERVER、UDP CLIENT 、UDP SERVER 4 种工作模式&#xff0c;串口波特率最高可支持到…

03 Docker入门Dockerfile详解及镜像创建

1.1 使用 Dockerfile 构建镜像 新建一个 Dockerfile 文件vi Dockerfile 将下面的内容复制粘贴进去:## Base Images ## 从天池基础镜像构建(from的base img 根据自己的需要更换,建议使用天池open list镜像链接:https://tianchi.aliyun.com/forum/postDetail?postId=67720) F…

【Unity动画系统】动画状态基本属性与相关API、IK简单概述

动画状态基本属性与相关API Tag&#xff1a;判断是否当前播放着相对应Tag的动画&#xff0c;如果是&#xff0c;那么玩家的输入就是无效的。 using UnityEngine.InputSystem;public AnimatorStateInfo stateInfo;void State(){//stateInfo animator.GetCurrentAnimatorStateIn…

AcrelEMS-MH民航机场智慧能源管平台解决方案【可靠供电/降低能耗/高效运维】

民航机场行业背景 自2012年以来&#xff0c;我国民航运输规模出现了显著增长&#xff0c;旅客运输量&#xff1a;从2012年的3.19亿人次上升至2019年的6.6亿人次&#xff08;注&#xff1a;为剔除疫情影响&#xff0c;此处采取疫情前2019年的数据&#xff0c;下同&#xff09;&…

数据结构七:线性表之链式栈的设计

在上篇博客&#xff0c;学习了用数组实现链的顺序存储结构&#xff0c;那是否存在用单链表实现栈的链式存储结构&#xff0c;答案是当然的&#xff0c;相比于顺序栈&#xff0c;用数组实现的栈效率很高&#xff0c;但若同时使用多个栈&#xff0c;顺序栈将浪费很多空间。用单链…

用NuGet安装 Oracle ODP.NET

oracle官网原文&#xff1a;Using NuGet to Install and Configure Oracle Data Provider for .NET Using NuGet to Install and Configure Oracle Data Provider for .NET In this section, you will install ODP.NET NuGet packages from nuget.org. Select View > Solut…

PDF 正确指定页码挂载书签后,书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另做一篇原因是一篇文章附带一个与该文章主题不相关的问题时&#xff0c;不利于被遇到该问题的人快速搜索发现以解决其遇到的…

8_手眼标定总结_auboi5机械臂与海康平面相机

经过不断地学习与调试&#xff0c;不断地学习网络上其他同志分享的资料&#xff0c;opencv手眼标定迎来了阶段性结束。实际测试结果在机械臂坐标系中X方向差5mm左右。 代码参考《https://blog.csdn.net/wanggao_1990/article/details/81435660》 注意事项&#xff1a; ①标定…