Spring MVC資料校驗
阿新 • • 發佈:2021-08-17
一般情況下,使用者的輸入是隨意的,為了保證資料的合法性,資料驗證是所有 Web 應用必須處理的問題。
Spring MVC 有以下兩種方法可以驗證輸入:
資料驗證分為客戶端驗證和伺服器端驗證,客戶端驗證主要是過濾正常使用者的誤操作,通過 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 不需要編寫驗證器,它定義了一套可標註在成員變數、屬性方法上的校驗註解,如下表所示。
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 將會自動載入並裝配。
Eclipse 控制檯輸出結果如下。
from http://c.biancheng.net/spring_mvc/validation.html
Spring MVC 有以下兩種方法可以驗證輸入:
- 利用 Spring 自帶的驗證框架
- 利用 JSR 303 實現
資料驗證分為客戶端驗證和伺服器端驗證,客戶端驗證主要是過濾正常使用者的誤操作,通過 JavaScript 程式碼完成。伺服器端驗證是整個應用阻止非法資料的最後防線,通過在應用中程式設計實現。
本節使用 JSR 303 實現伺服器端的資料驗證。
JSR 303 是 Java 為 Bean 資料合法性校驗所提供的標準框架。JSR 303 通過在 Bean 屬性上標註類似於 @NotNull、@Max 等標準的註解指定校驗規則,並通過標準的驗證介面對 Bean 進行驗證。可以通過
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 本身沒有提供 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