SpringMVC數據校驗淺析

永遠不要相信用戶的輸入,我們開發的系統凡是涉及到用戶輸入的地方,都要進行校驗,這裏的校驗分爲前臺校驗和後臺校驗,前臺校驗通常由javascript來完成,後臺校驗主要由java來負責,這裏我們可以通過spring mvc+hibernate validator。

數據校驗

在java中有一個bean validation的數據驗證規範,該規範的實現者有很多,其中hibernate validator使用的較多一些,這裏的hibernate validator是hibernate框架下的一款用於數據校驗的框架,以前我們統稱的hibernate一般特指的是hibernate orm。

這裏我們來用下6.0.9的版本,該版本需要jdk8+。先來使用maven導入相關jar包:

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>6.0.9.Final</version>
</dependency>

編寫javabean,在需要校驗的屬性上面添加相應的註解

import javax.validation.constraints.*;

public class User {

    @NotEmpty(message = "姓名不能爲空")
    @Size(min = 4,max = 20,message = "姓名長度必須在{min}-{max}之間")
    private String name;

    @Min(value = 0, message = "年齡不能小於{value}")
    @Max(value = 120,message = "年齡不能大於{value}")
    private int age;

    @Pattern(regexp = "^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$", message = "手機號碼不正確")
    private String phone;

    /*
        省略setter和getter
     */


}

修改springmvc.xml配置文件,註冊一個驗證器,這裏使用的是HibernateValidator實現的驗證器:

<mvc:annotation-driven validator=“baronValidator”/>
創建controller,在方法的參數中寫上User和BindingResult,在User前面添加@Validated註解,這裏需要注意:不能將@Validated 註解在String類型和基本類型的形參前,BindingResult參數可以獲取到所有驗證異常的信息,當校驗不通過的時候將提示信息放到ModelAndView中傳遞到jsp裏面。

package com.baron.controller;


import com.baron.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/register.do")
    //不能將@Validated 註解在String類型和基本類型的形參前。
    //BindingResult參數可以獲取到所有驗證異常的信息
    public ModelAndView register(@Validated User user, BindingResult br) {

        ModelAndView mv = new ModelAndView();

        List<ObjectError> allErrors = br.getAllErrors();
        System.out.println(allErrors.size());
        if (allErrors != null && allErrors.size() > 0) {
            FieldError nameError = br.getFieldError("name");
            FieldError ageError = br.getFieldError("age");
            FieldError phoneError = br.getFieldError("phone");

            if (nameError != null) {
                mv.addObject("nameError", nameError.getDefaultMessage());
            }
            if (ageError != null) {
                mv.addObject("ageError", ageError.getDefaultMessage());
            }
            if (phoneError != null) {
                mv.addObject("phoneError", phoneError.getDefaultMessage());
            }

            mv.setViewName("/register");
            return mv;
        }
        mv.addObject("name", user.getName());
        mv.setViewName("/user");
        return mv;
    }
}

創建jsp,獲取校驗信息:

 <form action="/user/register.do" method="get">
    姓名:<input type="text" name="name">${nameError}<br>
    年齡:<input type="text" name="age">${ageError}<br>
    手機:<input type="text" name="phone">${phoneError}<br>
    <input type="submit" value="提交">
</form>

Hibernate Validator 中常用的驗證註解

@AssertFalse 驗證註解的元素值是 false
@AssertTrue 驗證註解的元素值是 true
@DecimalMax(value=x) 驗證註解的元素值小於等於指定的十進制value 值
@DecimalMin(value=x) 驗證註解的元素值大於等於指定的十進制value 值
@Digits(integer=整數位數, fraction=小數位數)驗證註解的元素值的整數位數和小數位數上限
@Future 驗證註解的元素值(日期類型)比當前時間晚
@Max(value=x) 驗證註解的元素值小於等於指定的 value值
@Min(value=x) 驗證註解的元素值大於等於指定的 value值
@NotNull 驗證註解的元素值不是 null
@Null 驗證註解的元素值是 null
@Past 驗證註解的元素值(日期類型)比當前時間早
@Pattern(regex=正則表達式) 驗證註解的元素值不指定的正則表達式匹配
@Size(min=最小值, max=最大值) 驗證註解的元素值的在 min 和 max (包含)指定區間之內,如字符長度、集合大小
@Valid 該註解主要用於字段爲一個包含其他對象的集合或map或數組的字段,或該字段直接爲一個其他對象的引用,這樣在檢查當前對象的同時也會檢查該字段所引用的對象。
@NotEmpty 驗證註解的元素值不爲 null 且不爲空(字符串長度不爲 0、集合大小不爲 0)
@Range(min=最小值, max=最大值)驗證註解的元素值在最小值和最大值之間
@NotBlank 驗證註解的元素值不爲空(不爲 null、去
除首位空格後長度爲 0),不同於@NotEmpty, @NotBlank 只應用於字符串且在比較時會去除字符串的空格
@Length(min=下限, max=上限) 驗證註解的元素值長度在 min 和 max 區間內
@Email 驗證註解的元素值是 Email,也可以通過正則表達式和 flag 指定自定義的 email 格式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章