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、 集合或數組, 並且它的長度要符合給定的范圍 |