SpringMVC Bean Validation

對於任何一個應用而言在客戶端作的數據有效性驗證都不是安全有效的,這時候就要求咱們在開發的時候在服務端也對數據的有效性進行驗證。 SpringMVC 自身對數據在服務端的校驗(Hibernate Validator)有一個比較好的支持,它能將咱們提交到服務端的數據按照咱們事先的約定進行數據有效性驗證,對於不合格的數據信息 SpringMVC 會把它保存在錯誤對象中(Errors接口的子類),這些錯誤信息咱們也能夠經過 SpringMVC 提供的標籤(form:errors)在前端JSP頁面上進行展現。或者使用攔截器 after 方法對處理錯誤信息進行處理後傳遞給頁面(咱們使用JSON請求的時候就須要這樣作)。html

本文來介紹,如何在 SpringMVC 中進行 Validator 的使用。前端

1、添加POM依賴
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>

2、配置要驗證的實體
public class ValidatorTest {java

// message 直接提供錯誤信息
@NotNull(message = "username 不能爲空")
// message 使用 {} 表明錯誤內容,從 resources 目錄下的 ValidationMessages.properties 文件中讀取
@Pattern(regexp = "[a-zA-Z0-9_]{5,10}", message = "{user.username.illegal}")
private String username;git

@Size(min = 5, max = 10, message = "{password.length.illegal}")
private String password;正則表達式

// 省略 get\set spring

}

ValidationMessages.properties 文件內容:api

user.username.illegal=用戶名格式不正確
password.length.illegal=密碼[${validatedValue}]長度必須爲{min}到{max}個字符數組

其中${validatedValue} 用來獲取預校驗屬性的值。
{min} 和 {max} 用來讀取 @Size 註解中對應的屬性值。
你還能夠像 ${max > 1 ? '大於1' : '小於等於1'} 這樣使用el表達式。
另外咱們還能夠拿到一個java.util.Formatter類型的formatter變量進行格式化:
${formatter.format("%04d", min)}

若是EL表達式不起做用,能夠添加以下依賴嘗試,若是沒有問題請忽略。安全

<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
<scope>provided</scope>
</dependency>

內置的驗證約束註解
內置的驗證約束註解以下表所示(摘自hibernate validator reference):app

驗證註解 驗證的數據類型 說明
@AssertFalse Boolean,boolean 驗證註解的元素值是false
@AssertTrue Boolean,boolean 驗證註解的元素值是true
@NotNull 任意類型 驗證註解的元素值不是null
@Null 任意類型 驗證註解的元素值是null
@MIN(value=值) BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存儲的是數字)子類型 驗證註解的元素值大於等於@Min指定的value值
@MAX(value=值) 和@Min要求同樣 驗證註解的元素值小於等於@Max指定的value值
@DecimalMin(value=值) 和@Min要求同樣 驗證註解的元素值大於等於@ DecimalMin指定的value值
@DecimalMax(value=值) 和@Min要求同樣 驗證註解的元素值小於等於@ DecimalMax指定的value值
@Digits(integer=整數位數, fraction=小數位數) 和@Min要求同樣 驗證註解的元素值的整數位數和小數位數上限
@Size(min=下限, max=上限) 字符串、Collection、Map、數組等 驗證註解的元素值的在min和max(包含)指定區間以內,如字符長度、集合大小
@Past java.util.Date,java.util.Calendar;Joda Time類庫的日期類型 驗證註解的元素值(日期類型)比當前時間早
@Future 與@Past要求同樣 驗證註解的元素值(日期類型)比當前時間晚
@NotBlank CharSequence子類型 驗證註解的元素值不爲空(不爲null、去除首位空格後長度爲0),不一樣於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的首位空格
@Length(min=下限, max=上限) CharSequence子類型 驗證註解的元素值長度在min和max區間內
@NotEmpty CharSequence子類型、Collection、Map、數組 驗證註解的元素值不爲null且不爲空(字符串長度不爲0、集合大小不爲0)
@Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型 驗證註解的元素值在最小值和最大值之間
@Email(regexp=正則表達式,flag=標誌的模式) CharSequence子類型(如String) 驗證註解的元素值是Email,也能夠經過regexp和flag指定自定義的email格式
@Pattern(regexp=正則表達式,flag=標誌的模式) String,任何CharSequence的子類型 驗證註解的元素值與指定的正則表達式匹配
@Valid 任何非原子類型 指定遞歸驗證關聯的對象;如用戶對象中有個地址對象屬性,若是想在驗證用戶對象時一塊兒驗證地址對象的話,在地址對象上加@Valid註解便可級聯驗證
3、Controller 實體驗證與視圖錯誤信息的展現
JSP 頁面:

錯誤信息使用 form:errors 展現,這個標籤,必須放在 form:form 中使用。

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Java驗證框架測試</title>
</head>

<body>
<form:form method="post" modelAttribute="testModel" action="${pageContext.request.contextPath }/validator/test3">
<h1><form:errors path="username" /></h1><!-- path的值能夠爲 * ,表示顯示全部錯誤 -->
<h1><form:errors path="password" /></h1>
<form:input path="username" /><br/>
<form:input path="password" /><br/>
<input type="submit" value="提交"/>
</form:form>
</body>
</html>

對應的 Controller 的方法:

@Controller
@RequestMapping("/validator")
public class ValidatorController {

/** * 響應到JSP頁面 * * @param test * @param result * 這裏的BindingResult必須緊挨着@Valid參數的,即必須緊挨着須要校驗的參數, * 這就意味着咱們有多少個@Valid參數就須要有多少個對應的Errors參數,它們是一一對應的。 * @return * @author SHANHY * @create 2016年4月14日 */ @RequestMapping("/test3") public String test3(@Valid @ModelAttribute("testModel") ValidatorTest test, BindingResult result, Model model){ model.addAttribute("test", test); if(result.hasErrors()) return "validator1"; return "validator2"; }}

相關文章
相關標籤/搜索