1. 程式人生 > 其它 >Spring MVC資料校驗

Spring MVC資料校驗

一般情況下,使用者的輸入是隨意的,為了保證資料的合法性,資料驗證是所有 Web 應用必須處理的問題。

Spring MVC 有以下兩種方法可以驗證輸入:
  • 利用 Spring 自帶的驗證框架
  • 利用 JSR 303 實現

資料驗證分為客戶端驗證和伺服器端驗證,客戶端驗證主要是過濾正常使用者的誤操作,通過 JavaScript 程式碼完成。伺服器端驗證是整個應用阻止非法資料的最後防線,通過在應用中程式設計實現。

本節使用 JSR 303 實現伺服器端的資料驗證。

JSR 303 是 Java 為 Bean 資料合法性校驗所提供的標準框架。JSR 303 通過在 Bean 屬性上標註類似於 @NotNull、@Max 等標準的註解指定校驗規則,並通過標準的驗證介面對 Bean 進行驗證。可以通過
https://jcp.org/en/jsr/detail?id=303
檢視詳細內容並下載 JSR 303 Bean Validation。

JSR 303 不需要編寫驗證器,它定義了一套可標註在成員變數、屬性方法上的校驗註解,如下表所示。

名稱 說明
@Null 被標註的元素必須為 null
@NotNull 被標註的元素必須不為 null
@AssertTrue 被標註的元素必須為 true
@AssertFalse 被標註的元素必須為 false
@Min(value) 被標註的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被標註的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMax(value) 被標註的元素必須是一個數字,其值必須大於等於指定的最大值
@DecimalMin(value) 被標註的元素必須是一個數字,其值必須小於等於指定的最小值
@size 被標註的元素的大小必須在指定的範圍內
@Digits(integer,fraction) 被標註的元素必須是一個數字,其值必須在可接受的範圍內;integer 指定整數精度,fraction 指定小數精度
@Past 被標註的元素必須是一個過去的日期
@Future 被標註的元素必須是一個將來的日期
@Pattern(value) 被標註的元素必須符合指定的正則表示式
Spring MVC 支援 JSR 303 標準的校驗框架,Spring 的 DataBinder 在進行資料繫結時,可同時呼叫校驗框架來完成資料校驗工作,非常簡單方便。在 Spring MVC 中,可以直接通過註解驅動的方式來進行資料校驗。

Spring 本身沒有提供 JSR 303 的實現,Hibernate Validator 實現了 JSR 303,所以必須在專案中加入來自 Hibernate Validator 庫的 jar 檔案,下載地址為http://hibernate.org/validator/。本節使用版本為 hibernate-validator-5.1.0.Final-dist.zip,複製其中的 3 個 jar 檔案即可,Spring 將會自動載入並裝配。
  • hibernate-validator-5.1.0.Final.jar
  • jboss-logging-3.1.0.CR2.jar
  • validation-api-1.0.0.GA.jar

示例

本節示例基於《@Controller和@RequestMapping註解》一節中的 springmvcDemo2 實現。

1. 匯入依賴

pom.xml 檔案中新增以下程式碼。
<!-- 資料校驗 -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.logging</groupId>
    <artifactId>jboss-logging</artifactId>
    <version>3.1.0.CR2</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.0.Final</version>
</dependency>

2. 建立實體類

建立 User 實體類,程式碼如下。
package net.biancheng.po;

import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;

public class User {
    @NotNull(message = "使用者id不能為空")
    private Integer id;
    @NotNull
    @Length(min = 2, max = 8, message = "使用者名稱不能少於2位大於8位")
    private String name;
    @Email(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]", message = "郵箱格式不正確")
    private String email;

    /** 省略setter和getter方法*/
}

3. 建立JSP頁面

建立 addUser.jsp,程式碼如下。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>新增使用者</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/validate" method="post">
        使用者id:<input type="text" name="id" />
        <br>
        使用者名稱:<input type="text" name="name" />
        <br>
        郵箱:<input type="text" name="email" />
        <br>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

4. 建立控制器

建立 UserController 控制器類,程式碼如下。
package net.biancheng.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import net.biancheng.po.User;

@Controller
public class UserController {

    @RequestMapping("/validate")
    public String validate(@Valid User user, BindingResult result) {
        // 如果有異常資訊
        if (result.hasErrors()) {
            // 獲取異常資訊物件
            List<ObjectError> errors = result.getAllErrors();
            // 將異常資訊輸出
            for (ObjectError error : errors) {
                System.out.println(error.getDefaultMessage());
            }
        }
        return "index";
    }

    @RequestMapping(value = "/addUser")
    public String add() {

        return "addUser";
    }
}

5. 執行測試

訪問地址:http://localhost:8080/springmvcDemo2/addUser,執行結果如下。

Eclipse 控制檯輸出結果如下。

郵箱格式不正確
使用者id不能為空
使用者名稱不能少於2位大於8位


from http://c.biancheng.net/spring_mvc/validation.html