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

文章目录

1.数据格式化

1.基本介绍
1.基本说明
2.环境搭建

回到之前的springmvc项目下

2.基本数据类型和字符串转换
1.需求分析
2.环境搭建
1.data_valid.jsp首页面
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封装请求信息
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处理请求信息
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添加妖怪界面
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.单元测试
3.保存妖怪信息
1.MonsterHandler.java添加方法
java 复制代码
    @RequestMapping(value = "/save")
    public String save(Monster monster) { //自动封装数据
        System.out.println("monster=" + monster);
        return "datavalid/success";
    }
2.success.jsp添加成功跳转界面
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
4.结果展示
1.基本介绍
2.正确情况
3.类型转换失败的情况
3.特殊数据类型和字符串的转换
1.基本介绍
2.环境搭建
1.Monster.java添加内容
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;
    }
2.monster_addUI.jsp修改
3.结果展示
1.成功情况
2.失败情况

2.验证以及国际化

1.基本介绍
1.概述
2.JSR303框架
3.Hibernate Validator 扩展注解
2.导入jar包
3.具体实例
1.修改MonsterHandler.java的save方法
java 复制代码
    @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处理表单回显
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
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
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.结果展示
6.细节和注意事项
演示
4.注解组合使用
1.引出
2.演示
5.取消属性绑定
1.基本介绍
2.代码实例
1.MonsterHandler.java添加方法
java 复制代码
    /*
    1.使用这个注解标识的方法会在封装信息到monster对象之前执行
    2.可以取消对某个属性的绑定
    3.setDisallowedFields接收的是可变参数,可以填写多个字段
    4.一旦取消的属性绑定,则应该把对应属性的信息校验注解去掉,要不然进入数据校验时可能会出错,因为数据校验这个环节是正常执行的
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.setDisallowedFields("name", "email");
    }
2.Monster.java取消那两个字段的数据校验
3.结果展示
6.数据绑定机制总结
相关推荐
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck1 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei1 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师2 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端