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、 集合或数组, 并且它的长度要符合给定的范围 |