其他分享
首页 > 其他分享> > Spring Boot之(九)Spring Boot数据校验

Spring Boot之(九)Spring Boot数据校验

作者:互联网

九、Spring Boot数据校验

9.1 什么是数据校验?

9.2 JSR-303校验标准

JSR-303 是JAVAEE6中的一项子规范,叫做Bean Validation规范,为Bean验证定义了元数据模型和API。默认的元数据模型是通过Annotations来描述的,但是也可以使用XML来重载或者扩展, 我们一般推荐使用注解的方式来进行验证。

Hibernate Validator 是 Bean Validation 的参考实现 。 Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint的实现,除此之外还有一些附加的constraint。

此实现与Hibernate ORM没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据直接进行验证。

9.3 JSR-303常用校验注解

Bean Validation 中内置的 constraint:

constraint描述
@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)被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的 constraint:

constraint描述
@Email被注释的元素必须是电子邮箱地址
@Length被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串必须非空
@Range被注释的元素必须在合适的范围内

9.4 基于Hibernate-validator校验框架实现的服务器端数据校验

在实际的开发过程中,总是会遇到这样的情况,用户在登录时忘记输入了用户名或者是忘记输入了密码,这个时候我们的后台是不允许用户直接登录的。鉴于这些“马马虎虎”的用户,我们必须给予他们一些提醒或者警告,也就是说,提醒他们只有在完完全全正确的输入用户名和密码后,才可以登录成功!

那么,如何实现这样的数据校验呢?下面上代码…

9.5 分组数据校验

前面我们校验了用户名和密码,在实际开发的过程中,难免会遇到对一个实体类的属性,不同的请求会有不同的校验规则的场景。

就比如说,当用户注册时,用户的id需要校验是否为空,因为这个唯一的id往往是由系统自己生成的。但是当用户在修改密码时,又需要我们传入一个id来作为where语句的条件去判断更新,这个时候我们就要使用分组校验了。

在遇到需要分组校验的时候,我们通过注解中groups属性来设置该校验注解的分组,groups的值要求必须是一个类对象,一般我们采取创建多个空接口的方法来进行分组。当然,如果分组较多的话就可以将这个用以校验分组的接口放在同一个类下进行管理。

  1. 用以登录的接口:

    package cn.boot.util;
    public interface LoginGroup {
    }
    
  2. 用以更新用户的接口

    package cn.boot.util;
    public interface UpdateGroup {
    }
    
  3. 用以添加用户的接口

    package cn.boot.util;
    public interface AddGroup {
    }
    
  1. 添加用户

    /**
     * 到添加用户信息界面
     * @param request
     * @return
     */
    @RequestMapping(method = RequestMethod.GET,value = "/toAddUserInfo")
    public String toAddUserInfo(HttpServletRequest request){
        List<SystemRole> listRole = systemRoleService.selectAll();
        request.setAttribute("listRole",listRole);
        return "ebuy/addUserinfo";
    }
    /**
     * 添加用户信息操作
     * @param systemUserinfo
     * @param request
     * @return
     */
    @RequestMapping(method = RequestMethod.POST,value = "/doAddUserInfo")
    public String doAddUserInfo(@Validated(value = {AddGroup.class}) SystemUserinfo systemUserinfo, BindingResult bindingResult, HttpServletRequest request, ModelAndView modelAndView){
        if (bindingResult.hasErrors()){
             List<SystemRole> listRole = systemRoleService.selectAll();
             request.setAttribute("listRole",listRole);
             List<ObjectError> listError = bindingResult.getAllErrors();
             for (ObjectError objectError:listError){
                 FieldError fieldError = (FieldError) objectError;
                 request.setAttribute(fieldError.getField(),objectError.getDefaultMessage());
             }
             return "ebuy/addUserinfo";
        }else{
            int r = systemUserinfoService.insert(systemUserinfo);
            if (r == 1){
                return "redirect:/selectAllByJS";
            }
            request.setAttribute("msg","添加用户失败,请重新添加!");
            return "ebuy/addUserinfo";
        }
    }
    
  2. 修改用户信息

    /**
     * 到更新用户页面
     * @param userinfoUid
     * @param request
     * @return
     */
    @RequestMapping(method = RequestMethod.GET,value = "/toUpdateUserInfo")
    public String toUpdateUserInfo(String userinfoUid,HttpServletRequest request){
        SystemUserinfo systemUserinfo = systemUserinfoService.selectByPrimaryKey(userinfoUid);
        List<SystemRole> listRole = systemRoleService.selectAll();
        request.setAttribute("listRole",listRole);
        request.setAttribute("systemUserinfo",systemUserinfo);
        return "ebuy/updateUserInfo";
    }
    /**
     * 更新用户信息操作
     * @param systemUserinfo
     * @param request
     * @return
     */
    @RequestMapping(method = RequestMethod.POST,value = "/doUpdateUserInfo")
    public String doUpdateUserInfo(@Validated(value = {UpdateGroup.class}) SystemUserinfo systemUserinfo,BindingResult bindingResult, HttpServletRequest request) {
        if (bindingResult.hasErrors()) {
            List<SystemRole> listRole = systemRoleService.selectAll();
            request.setAttribute("listRole", listRole);
            List<ObjectError> listError = bindingResult.getAllErrors();
            for (ObjectError objectError:listError){
                FieldError fieldError = (FieldError) objectError;
                request.setAttribute(fieldError.getField(),objectError.getDefaultMessage());
            }
            return "ebuy/updateUserInfo";
        } else {
            int r = systemUserinfoService.updateByPrimaryKey(systemUserinfo);
            if (r > 0) {
                return "redirect:/selectAllByJS";
            }
            request.setAttribute("msg", "更新用户信息失败!");
            return "ebuy/updateUserInfo";
        }
    }
    
  1. 添加用户addUserinfo.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加用户信息</title>
    </head>
    <body>
    <div style="color: red" th:text="${msg}"></div>
    <div style="width: 700px;margin: 50px auto;">
        <form method="post" action="doAddUserInfo">
            登录名:<input type="text" name="userinfoLoginid"  />
            <span style="color: red" th:text="${userinfoLoginid}"></span>
            <br/><br/>
            姓名:<input type="text" name="userinfoName"  />
            <span style="color: red" th:text="${userinfoName}"></span>
            <br/><br/>
            密码:<input type="password" name="userinfoPassword"  />
            <span style="color: red" th:text="${userinfoPassword}"></span>
            <br/><br/>
            性别:
            <input type="radio" name="userinfoSex" value="男" />男
            <input type="radio" name="userinfoSex" value="女"/> 女
            <span style="color: red" th:text="${userinfoSex}"></span>
            <br/><br/>
            邮箱:<input type="text" name="userinfoEmail" />
            <span style="color: red" th:text="${userinfoEmail}"></span>
            <br/><br/>
            电话:<input type="text" name="userinfoMobile" />
            <span style="color: red" th:text="${userinfoMobile}"></span>
            <br/><br/>
            角色:
            <select name="userinfoRole" >
                <option value="">--请选择--</option>
                <option th:each="role:${listRole}" th:value="${role.roleId}" th:text="${role.roleName}"></option>
            </select>
            <span style="color: red" th:text="${userinfoRole}"></span>
            <br/><br/>
            <input type="submit" value="保存"/>
        </form>
    </div>
    </body>
    </html>
    
  2. 更新用户信息updateUserinfo.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>更新用户信息</title>
    </head>
    <body>
    <div style="color: red" th:text="${msg}"></div>
    <div style="width: 700px;margin: 50px auto;">
        <form method="post" action="doUpdateUserInfo">
            <input type="hidden" id="userinfoUid" name="userinfoUid" th:value="${systemUserinfo.userinfoUid}"/>
            登录名:<input type="text" id="userinfoLoginid" name="userinfoLoginid" th:value="${systemUserinfo.userinfoLoginid}"/>
            <span style="color: red" th:text="${userinfoLoginid}"></span>
            <br/><br/>
            姓名:<input type="text" id="userinfoName" name="userinfoName" th:value="${systemUserinfo.userinfoName}"/>
            <span style="color: red" th:text="${userinfoName}"></span>
            <br/><br/>
            密码:<input type="password" id="userinfoPassword" name="userinfoPassword"  th:value="${systemUserinfo.userinfoPassword}"/>
            <span style="color: red" th:text="${userinfoPassword}"></span>
            <br/><br/>
            性别:
            <input type="radio" name="userinfoSex" value="男" th:checked="${systemUserinfo.userinfoSex}==男"/>男
            <input type="radio" name="userinfoSex" value="女" th:checked="${systemUserinfo.userinfoSex}==女"/>女
            <span style="color: red" th:text="${userinfoSex}"></span>
            <br/><br/>
            邮箱:<input type="text" name="userinfoEmail" th:value="${systemUserinfo.userinfoEmail}"/>
            <span style="color: red" th:text="${userinfoEmail}"></span>
            <br/><br/>
            电话:<input type="text" name="userinfoMobile" th:value="${systemUserinfo.userinfoMobile}"/>
            <span style="color: red" th:text="${userinfoMobile}"></span>
            <br/><br/>
            角色:
            <select name="userinfoRole" >
                <option th:each="role:${listRole}" th:value="${role.roleId}" th:text="${role.roleName}"></option>
            </select>
            <span style="color: red" th:text="${userinfoRole}"></span>
            <br/><br/>
            <input type="submit" value="更新"/>
        </form>
    </div>
    </body>
    </html>
    

    在这里插入图片描述

在这里插入图片描述

标签:String,NotEmpty,Spring,request,校验,private,Boot,class
来源: https://blog.csdn.net/qq_50994235/article/details/119609643