• SpringBoot入门 (十一) 数据校验


    本文记录学习在SpringBoot中做数据校验。

    一 什么是数据校验

      数据校验就是在应用程序中,对输入进来得数据做语义分析判断,阻挡不符合规则得数据,放行符合规则得数据,以确保被保存得数据符合我们得数据存储规则。

      在SpringMvc中做数据校验有2中方式:一种是 Spring 自带的验证框架,另外一种是利用 JSR 实现。JSR 是一个规范,提供了完整得一套 API,通过标注给对象属性添加约束。Hibernate Validator 就是 对JSR 规范所有注解的具体实现,以及一些附加的约束注解。用户还可以自定义约束注解。Hibernate Validator提供得注解如下:

      注解    作用目标    检查规则
     @Length(min=, max=)  属性(String)  检查字符串长度是否符合范围
     @Max(value=)  属性(以 numeric 或者 string 类型来表示一个数字)  检查值是否小于或等于最大值
     @Min(value=)  属性(以 numeric 或者 string 类型来表示一个数字)  检查值是否大于或等于最小值
     @NotNull  属性  检查值是否非空(not null)
     @Future  属性(date 或 calendar)  检查日期是否是未来
     @Pattern(regex="regexp", flag=)  属性(string)  检查属性是否与给定匹配标志的正则表达式相匹配
     @Range(min=, max=)  属性(以 numeric 或者 string 类型来表示一个数字)  检查值是否在最小和最大值之间(包括临界值)
     @Size(min=, max=)  属性(array,collection,map)  检查元素大小是否在最小和最大值之间(包括临界值)
     @AssertFalse  属性  检查方法的演算结果是否为 false(对以代码方式而不是注解表示的约束很有用)
     @AssertTrue  属性  检查方法的演算结果是否为 true(对以代码方式而不是注解表示的约束很有用)
     @Valid  属性(object)  对关联对象递归进行验证。如果对象是集合或数组,就递归地验证其元素;如果对象是 Map,则递归验证其值元素
     @Email  属性(String)  检查字符串是否符合有效的 email 地址规范
     @Past  属性(date 或 calendar)  检查日期是否是过去

    二 使用示例

      SpringBoot对数据校验也做了支持,默认提供的参数校验依赖于 hibernate-validator来实现。使用 Hibernate Validator校验数据,需要定义一个接收的数据模型,使用注解的形式描述字段校验的规则。通过前台页面提交form表单保存数据,后台做校验。

       在pom.xml文件中引入依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
            </dependency>
    

      写一个实体类,对相关属性字段通过注解添加校验规则

    public class Person {
    
        @NotBlank(message = "不能为空")
        @Length(min = 2, max = 20, message = "长度要在2到20之间")
        private String name;
    
        @NotNull
        @Min(value = 17, message = "最小值为17")
        private Integer age;
    
        @NotEmpty
        @Email(message="邮件格式不正确")
        private String email;
        
      // 此处省略getter和setter  
    
    }
    

      每个注解中得属性message是数据校验不通过时我们要给出得提示信息,如 @Email(message="邮件格式不正确") 当邮件格式校验不通过时,提示邮件格式不正确。

      控制器

    @Controller
    public class TestController {
    
        @GetMapping("/info")
        public String info(Model model){
            Person person = new Person();
            model.addAttribute("person", person);
            return "person_info.html";
        }
    
        @PostMapping("/save")
        public String save(@Valid Person person, BindingResult result, Model model){
            if (result.hasErrors()) {
                model.addAttribute("person", person);
                return "person_info.html";
            }
        //数据保存。。。 model.addAttribute("success","校验通过,数据已保存"); return "success.html"; } }

      我们通过访问info方法,跳转到信息输入页面,提交数据时访问save方法,Person前得注解@Valid 说明当前对象要做数据校验,BindingResult 中会存储数据校验得结果,@Valid和BindingResult必须成对出现。如果校验不通过时即有错误信息,会进入if略记判断中,返回信息输入页面,展示错误提示信息。

      信息输入页面

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form th:action="@{/save}" th:method="post" th:object="${person}">
            <table>
                <tr>
                    <td>name:</td>
                    <td><input type="text" th:field="*{name}" th:value="${person.name}"/></td>
                    <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}" th:style="'color:red'">Name Error</td>
                </tr>
                <tr>
                    <td>age:</td>
                    <td><input type="text" th:field="*{age}" th:value="${person.age}"/></td>
                    <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}" th:style="'color:red'">Age Error</td>
                </tr>
                <tr>
                    <td>email:</td>
                    <td><input type="text" th:field="*{email}" th:value="${person.email}"/></td>
                    <td th:if="${#fields.hasErrors('email')}" th:errors="*{email}" th:style="'color:red'">Email Error</td>
                </tr>
                <tr>
                    <td th:colspan="2"><button th:type="submit">Submit</button></td>
                </tr>
            </table>
        </form>
    </body>
    </html>
    

      th:object 要与后台接收校验得对象保持一致。访问info方法在页面随便输入一些信息,在提交数据,会看到校验结果

      如果各项数据都符合规则,则校验通过,跳转至success页面

  • 相关阅读:
    ROS安装
    安装octomap的问题与解决方案
    陀螺仪和加速度计MPU6050的单位换算方法
    概率基础
    Ubuntu使用多线程cmake时出现undefined reference to `pthread_create'
    C++中的static关键字的总结
    QSignalMapper的使用和使用场景
    Linux下C ,C ++, Qt开发环境
    void operator()()的功能
    C++11多线程编程--线程创建
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10348519.html
Copyright © 2020-2023  润新知