1. 程式人生 > >JSR303資料校驗

JSR303資料校驗

“蕭蕭幾葉風兼雨,離人偏識長更苦” 前言 JSR303是Java為Bean資料合法性校驗所提供的一個標準規範,叫做 Bean Validation。2009年12月 Java EE6釋出, Bean Validation作為一個重要特性被包含其中,用於對 Java Bean中的欄位值進行驗證。官方參考實現是 Hibernate Validator。 Bean Validation為 JavaBean驗證定義了相應的元資料型別和API。在應用程式中,通過在Bean屬性上標註類似於 @NotNull,@Max等標準的註解指定校驗規則,並通過標註的驗證介面對Bean進行驗證。 Bean Validation是一個執行時的資料驗證框架,在驗證之後驗證的錯誤資訊會被馬上返回。 JSR303註解

註解 功能
@Notnull 驗證物件是否不為mul,無法檢査長度為0的字串,於驗證基本資料型別
@Null 驗證物件是否為null
@AssertTrue 驗證 Boolean物件是否為true
@AssertFalse 驗證 Boolean物件是否為false
@Max(value) 驗正Number和String物件是否小於等於指定的值
@Min(value) 驗正Number和String物件是否大於等於指定的值
@DecimalMax(value) 被標註的值必須不大於約束中指定的最大值。這個約束的引數是一個通過 Big Decimal定義的最大值的字串表示,小數存在精度
@DecimalMin(value) 被標註的值必須不小於約束中指定的最小值。這個約束的引數是一個通過 Big Decimal定義的最小值的字串表示,小數存在精度
@Digits(integer, fraction) 驗證字串是否是符合指定格式的數字, Interger指定整數精度, fraction指定小數精度
@Size(min, max) 驗證物件(Array、Collection、Map、 String)長度是否在給定的範圍之內
@Past 驗證Date和 Calendar物件是否在當前時間之前
@Pattern 驗證 String物件是否符合正則表示式的規則
@NotBlank 檢查約束字串是不是Null,被Trim的長度是否大於0。只對字串,且會去掉前後空格
@URL 驗證是否是合法的url
@Email 驗證是否是合法的郵件地址
@CreditCardNumber 驗證是否是合法的信用卡號碼
@Length(min, max) 驗證字串的長度必須在指定的範圍內
@NotEmpty 檢査元素是否為NULL或者 EMPTY。用於Array、Collection、Map、 String
@Range(min, max, message) 驗證屬性值必須在合適的範圍內

測試

  1. 因為JSR303的實現是參考的Hibernate Validator,所以除了springMVC的jar包之外,使用JSR303還需要匯入Hibernate 的幾個jar包,它們分別是:classmate-1.1.0.jar、jboss-logging-3.2.1.Final.jar、hibernate-validator-5.2.4.Final.jar、hibernate-validator-annotation-processor-5.2.4.Final.jar、hibernate-validator-cdi-5.2.4.Final.jar、validation-api-1.1.0.Final.jar
  2. 建立java bean類,並使用註解:
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
import java.util.Date;

/**
 1. @author aRunner
 2. @date 2018/10/27
 */
public class User implements Serializable {
    @NotBlank(message = "登入名不能為空")
    private String loginname;
    @NotBlank(message = "密碼不能為空")
    @Length(max = 8,min = 6,message = "密碼長度必須在6位到8位之間")
    private String password;
    @NotBlank(message = "使用者名稱不能為空")
    private String username;
    @Range(min = 15,max = 60,message = "年齡必須在15歲到60歲之間")
    private String age;
    @Email(message = "必須是合法的郵箱地址")
    private String email;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Past(message = "生日必須是一個過去的日期")
    private Date birthday;
    @Pattern(regexp = "[1][3,8][3,6,9][0-9]{9}",message = "無效的電話號碼")
    private String phone;
	//這裡省略了get/set方法
}
  1. Controller類:
//資料校驗使用@Valid,後面跟著Errors物件儲存校驗資訊
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    //@Valid之後必須是Errors 或其實現類
    public String login(@Valid @ModelAttribute User user, Errors errors,Model model) {
        logger.info(user);
        //如果驗證不通過跳轉到loginForm檢視
        if (errors.hasFieldErrors()) {
            return "registerForm";
        }
        model.addAttribute("user",user);
        return "success";
    }

這裡有一點需要特別注意,就是在controller類中,緊接著@Valid 之後的引數必須是Errors(如上面例項)或者是Errors的實現類,否則spring會在校驗不通過時直接丟擲異常。 4. 驗證不通過時,再返回頁面展示錯誤資訊

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試JSR 303</title>
</head>
<body>
<h3>註冊頁面</h3>
<form:form modelAttribute="user" method="post" action="login" >
	<table>
		<tr>
			<td>登入名:</td>
			<td><form:input path="loginname"/></td>
			<td><form:errors path="loginname" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td>密碼:</td>
			<td><form:input path="password"/></td>
			<td><form:errors path="password" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td>使用者名稱:</td>
			<td><form:input path="username"/></td>
			<td><form:errors path="username" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td>年齡:</td>
			<td><form:input path="age"/></td>
			<td><form:errors path="age" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td>郵箱:</td>
			<td><form:input path="email"/></td>
			<td><form:errors path="email" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td>生日:</td>
			<td><form:input path="birthday"/></td>
			<td><form:errors path="birthday" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td>電話:</td>
			<td><form:input path="phone"/></td>
			<td><form:errors path="phone" cssStyle= "color:red"/></td>
		</tr>
		<tr>
			<td><input type="submit" value="提交"/></td>
		</tr>
	</table>
</form:form>
</body>
</html>
  1. 測試結果: 在這裡插入圖片描述