正则表达式非空验证_SpringBoot学习笔记(六)数据验证与模型绑定

  • Post author:
  • Post category:其他


3.3 数据验证

前端传入后端的数据需要进行验证,前端的数据在Web界面中需要进行完全的验证,那么,还需要在后端进行验证吗?答案是需要的,因为很容易绕过前端的验证,如果这样的数据被提交到后端,必然会产生相应的问题,因此,数据验证,除了前端的验证外,还需要在后端进行。

SpringMVC提供了验证参数的机制,一方面,它可以支持JSR-303注解验证,在默认的情况下,SpringBoot会引入关于Hibernate Validator机制来支持JSR-303验证规范;另一方面,也可以自定义验证规则。

3.3.1 JSR-303注解验证

JSR-303验证主要是通过注解的方式进行的,这里在控制器开发的项目中,即上一次的项目中,在com.example.mybatisdemo.entity包下新建一个名称为Student的POJO,然后在其相关的属性上添加注解。

1.首先在pom文件中添加依赖

        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-validationartifactId>        dependency>

2.常用注解

@Null  被注释的元素必须为null@NotNull  被注释的元素不能为null@AssertTrue  被注释的元素必须为true@AssertFalse  被注释的元素必须为false@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max,min)  被注释的元素的大小必须在指定的范围内。@Digits(integer,fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内@Past  被注释的元素必须是一个过去的日期@Future  被注释的元素必须是一个将来的日期@Pattern(value) 被注释的元素必须符合指定的正则表达式。@Email 被注释的元素必须是电子邮件地址@Length 被注释的字符串的大小必须在指定的范围内@NotEmpty  被注释的字符串必须非空@Range  被注释的元素必须在合适的范围内

3.在Student的类上添加相应的注解

package com.example.mybatisdemo.entity;import org.hibernate.validator.constraints.Range;import org.springframework.format.annotation.DateTimeFormat;import javax.validation.constraints.*;import java.util.Date;public class Student {    @NotNull(message = "id不能为空")    private Integer id;    @Size(min = 2,max = 8,message = "姓名长度要求2到8之间")    private String name;    @Size(max=30,message = "地址长度不能超过30")    private String address;    @Email(message = "邮箱格式错误")    private String email;    @Past(message = "日期错误")//只能是过去的日期    @DateTimeFormat(pattern = "yyyy-MM-dd")    private Date birthday;    @DecimalMin(value = "0.1")//最小值为0.1    @DecimalMax(value = "100")//最大值为100    private double score;    @Range(min = 1,max = 150,message = "年龄必须为1-150之间")    private int age;}

4.创建控制器

在com.example.mybatisdemo.controller包下,新建ValidateController类。代码如下:

package com.example.mybatisdemo.controller;import com.example.mybatisdemo.entity.Student;import org.springframework.stereotype.Controller;import org.springframework.validation.Errors;import org.springframework.validation.FieldError;import org.springframework.validation.ObjectError;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import javax.validation.Valid;import java.util.HashMap;import java.util.List;import java.util.Map;@Controllerpublic class ValidateController {    //返回前端页面    @RequestMapping(value = "/datacheck/validateview",method = RequestMethod.GET)    public String getValidateView(){        return "/datacheck/validateview";    }    @RequestMapping(value = "/datacheck/validatedata",method = RequestMethod.POST)    @ResponseBody    public Map validateData(@Valid @RequestBody Student stu, Errors errors){        Map errMap=new HashMap<>();        //获取错误列表        List oes=errors.getAllErrors();        for (ObjectError oe : oes) {            String key=null;            String message=null;            if(oe instanceof FieldError){                FieldError fe=(FieldError)oe;                key=fe.getField();//获取错误验证字段名            }else{                key=oe.getObjectName();//获取验证对象名称            }            message=oe.getDefaultMessage();            errMap.put(key,message);        }        return errMap;    }}

注意:必须在需要验证的参数之前加上注解”

@valid

“,否则不会验证。该注解表示启动验证机制,Spring启用JSR-303验证机制后,会自动将最后的验证结果放入Errors对象中,将数据返回给前端后,前端就可以得到相关验证的信息。

5.创建前端页面

在resources/templates/datacheck目录下,新建validateview.html文件,页面内容如下:

<html lang="en"><head>    <meta charset="UTF-8">    <title>数据验证title>head><body><button id="btn">数据验证button><script src="/jquery.js" type="text/javascript">script><script>    function sendMsg(){        var param={};        param["id"]=1;        param["name"]="张三丰";        param["address"]="武当山";        param["email"]="asdfgh@126.com";        param["birthday"]="1990-10-21";        param["score"]=98.5;        param["age"]=30;        var jsondata=JSON.stringify(param);        console.log(jsondata);        $.ajax({            type:'POST',            url:'/datacheck/validatedata',            data:jsondata,            async:false,            contentType:'application/json',            success:function(data){                alert("成功"+data);            },            error:function(data){                alert("错误"+data);            }        })    }script>body>html>

如果发送错误的数据,例如,将score更改为9898.9,age修改为300,则返回的结果是:

4580f2266b085815799e529629261516.png

3.4 模型绑定

模型绑定指的是通过数据模型为视图绑定数据。本实例采用上例数据验证中的模型类Student。

3.4.1 创建控制器

在controller包下的DemoController控制器类中,添加如下代码:

@RequestMapping(value = "/demo/modelbind",method = RequestMethod.GET)    public String studentModel(Model model){        Student stu=new Student();        stu.setId(1);        stu.setName("张三丰");        stu.setAddress("武当山");        stu.setAge(108);        stu.setBirthday(new Date());        stu.setEmail("aaaa@126.com");        stu.setScore(89.5);        model.addAttribute("stu",stu);        model.addAttribute("msg","Hello");        return "/demo/model1";    }
3.4.2 创建视图页

视图页采用了 前端视图引擎。需要注意的是

"en" xmlns:th=<代码如下:"en" xmlns:th=    "UTF-8">    模型绑定1




编号:


"${stu.id}">






姓名:


"${stu.name}">






地址:


"${stu.address}">






年龄:


"${stu.age}">






出生日期:


"${stu.birthday}">






电子邮件:


"${stu.email}">






武术成绩:


"${stu.score}">






启动程序运行结果如下:

3d6e3d533b2a6e1ad3d607e05359a9da.png



版权声明:本文为weixin_39604350原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。