• SpringMVC之表单校验


      SpringMVC已经实现了对Java校验API(JSR-303)的支持,通过使用该API可以实现对数据的校验。要使用SpringMVC的Java校验API并不需要任何配置,只要引入其实现即可。本文使用hibernate-validator 5.2.4。

      首先使用Maven使用hibernate-validator 5.2.4。接着就可以直接使用了。本文使用场景为注册,注册时需要提供用户名、密码以及出生日期,用户名以及密码的长度为5到20,出生日期必须为过去时间。

      首先使用Java校验API提供的注解来注解需要校验的bean,具体的注解在本文最后列出注册前的数据校验

    package cn.powerfully.demo.domain;
    
    import java.util.Date;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Past;
    import javax.validation.constraints.Size;
    
    public class User {
        @NotNull
        @Size(min = 5, max = 20)
        private String username;
        @NotNull
        @Size(min = 5, max = 20)
        private String password;
        @NotNull
        @Past
        private Date birth;
    
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String passwrod) {
            this.password = passwrod;
        }
    
    }

      对于Controller中方法,使用bean来传递参数,使用@Validated注解该参数表示该bean需要进行校验,并且该方法中必须要有类型为Errors的参数(当然实现了Errors旗下的都可以,例如BindingResult)。

    @RequestMapping(path = "register", method = RequestMethod.POST)
    public String doRegister(Model model, @Validated User user, Errors errors) {
        if (errors.hasErrors()) {
            model.addAttribute("errors", errors);
            return "register";
        }
        // ...
        model.addAttribute(user);
        return "msg";
    }

      如果校验存在错误,则将错误信息存放在request中并转发到注册表单。对于jsp页面,从request域中获取错误信息。  

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        isELIgnored="false" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>注册</h1>
        <br>
        <form method="post"
            action="${pageContext.request.contextPath }/user/register">
            <input type="text" name="username" placeholder="用户名"> ${errors.getFieldError("username").defaultMessage }<br>
            <input type="password" name="password" placeholder="密码"> ${errors.getFieldError("password").defaultMessage }<br>
            <input type="date" name="birth" placeholder="出生日期"> ${errors.getFieldError("birth").defaultMessage }<br> <input
                type="submit" value="注册">
        </form>
    </body>
    </html>

      JAVA EE6以上版本中EL表达式可以直接调用方法,不可以直接使用errors.fieldError["username"].defaultMessage,因为fieldError在其实现类里面并不是一个数组或集合。效果如下:

      关于错误信息的显示,还有更方便的方法,那就是使用Spring提供的Jsp标签,关于Spring的JSP标签,这里就不写了。

      如果先自定义错误信息,可以编写ValidationMessages.properties文件并置于类目录,在properties文件里下:

    username.size=用户名长度必须为{min}到{max}
    password.size=密码长度必须为{min}到{max}
    birth.notNull=日期不能为空
    birth.past=日期必须是过去的

      在bean注解时,使用message属性来指定错误信息:

    @NotNull
    @Size(min = 5, max = 20, message = "{username.size}")
    private String username;
    @NotNull
    @Size(min = 5, max = 20, message = "{password.size}")
    private String password;
    @NotNull(message = "{birth.notNull}")
    @Past(message = "{birth.past}")
    private Date birth;

      如果想使用国际化,需要创建ValidationErrors_xx.properties。


    以下是Java校验API提供的校验注解

    注解 描述
    @AssertFalse  注解在Boolean类型上,并且值为false
    @AssertTrue  注解在Boolean类型上,并且值为true 
    @DecimalMax  所注解的元素必须是数字, 并且它的值要小于或等于给定的BigDecimalString值
    @DecimalMin  所注解的元素必须是数字, 并且它的值要大于或等于给定的BigDecimalString值
    @Digits  所注解的元素必须是数字, 并且它的值必须有指定的位数
    @Future  所注解的元素的值必须是一个将来的日期
    @Max  所注解的元素必须是数字, 并且它的值要小于或等于给定的值
    @Min  所注解的元素必须是数字, 并且它的值要大于或等于给定的值
    @NotNull  所注解元素的值必须不能为null
    @Null  所注解元素的值必须为null
    @Past  所注解的元素的值必须是一个已过去的日期
    @Pattern  所注解的元素的值必须匹配给定的正则表达式
    @Size  所注解的元素的值必须是String、 集合或数组, 并且它的长度要符合给定的范围
  • 相关阅读:
    Spark在MaxCompute的运行方式
    新功能初探 | MySQL 8.0 Multi-Valued Indexes功能简述
    吐血整理 | 1000行MySQL学习笔记,不怕你不会,就怕你不学!
    阿里巴巴架构师:十问业务中台和我的答案
    C# int?
    页面后退清空缓存
    oracle 中 创建序列sequence
    sql 与 oracle 几个简单语法差别
    oracle 中用法dual
    将DataTable进行分页并生成新的DataTable
  • 原文地址:https://www.cnblogs.com/loading4/p/6350332.html
Copyright © 2020-2023  润新知