Spring Boot 表單驗證篇
Spring Boot 表單驗證篇
摘要: 原創出處:www.bysocket.com 泥瓦匠BYSocket 希望轉載,保留摘要,謝謝!
“初學者的心充滿各種可能性,老手的卻不多”
本文提綱
1 spring-boot-starter-validation 依賴概述
1.1 spring-boot-starter-validation 職責
1.2 spring-boot-starter-validation 依賴關係
2 執行 spring-boot-validating-form-input 表單驗證工程
3 詳解 spring-boot-validating-form-input
4 小結
一、 spring-boot-starter-validation 依賴概述
上一篇 《Spring Boot Web 開發註解篇》,就可以快速地進行 Web 開發。那麼在表單提交的時候,我們需要進行驗證。前端驗證可以擋住 99% 的小白使用者,這裡要實現服務端驗證。
Starters 機制告訴我們,只要加入 spring-boot-starter-validation 這個 Starter ,就可以使用其實現驗證。那什麼是 spring-boot-starter-validation?
spring-boot-starter-validation 就是使用 Hibernate Validator 框架來提供 Java Bean 驗證功能。
1.1 spring-boot-starter-validation 職責
spring-boot-starter-validation 是一個用於驗證的 Starter,主要完成的是 Java Bean 的驗證功能。
1.2 spring-boot-starter-validation 依賴關係
spring-boot-starter-validation 依賴的組成如下表:
- spring-boot-starter 核心包,包括了自動化配置支援、日誌、YAML 檔案解析的支援等。
- tomcat-embed-el Tomcat 容器嵌入包
- hibernate-validator Hibernate 驗證框架包
可見,tomcat 容器是 8.x 版本。這裡有個小問題了,為啥 spring-boot-starter-web 也有這些上面這些依賴呢?這樣如果開發 web 就不需要重複新增 spring-boot-starter-validation 依賴了。但如果沒用 web 依賴時候想要實現 Bean 驗證,則只要單單加入 spring-boot-starter-validation 依賴即可。
二、 執行 chapter-4-spring-boot-validating-form-input 表單驗證工程
1. git clone 下載工程 spring-boot-core-book-demo
專案地址見 GitHub - https://github.com/JeffLi1993/spring-boot-core-book-demo:
1 |
|
2. Maven 編譯安裝這個工程:
1 2 |
|
3. 執行 chapter-4-spring-boot-validating-form-input 工程
右鍵專案 ValidatingFormInputApplication 類執行即可:
2017-08-09 16:24:58.387 INFO 12193 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http)
2017-08-09 16:24:58.395 INFO 12193 --- [ main] s.b.core.ValidatingFormInputApplication : Started ValidatingFormInputApplication in 9.846 seconds (JVM running for 11.23)
訪問 http://localhost:8080/users 使用者列表頁面:
點選建立使用者按鈕,開啟使用者管理頁面:
輸入非法值提示:
三、 詳解 spring-boot-validating-form-input
1.pom.xml 如下:
validator 驗證依賴主要在 web 依賴中,web 依賴包含了 hibernate-validator 依賴
還有以下依賴:
單元測試依賴
Spring Data JPA 依賴 :: 資料持久層框架
h2 資料來源連線驅動
模板引擎 Thymeleaf 依賴
2.實體類
具體業務層邏輯這邊不解釋,主要還是在控制層和 View 如何展示表單驗證
實體類 User 如下:
@Entity
public class User implements Serializable {
/**
* 編號
*/
@Id
@GeneratedValue
private Long id;
/**
* 名稱
*/
@NotEmpty(message = "姓名不能為空")
@Size(min = 2, max = 8, message = "姓名長度必須大於 2 且小於 20 字")
private String name;
/**
* 年齡
*/
@NotNull(message = "年齡不能為空")
@Min(value = 0, message = "年齡大於 0")
@Max(value = 300, message = "年齡不大於 300")
private Integer age;
/**
* 出生時間
*/
@NotEmpty(message = "出生時間不能為空")
private String birthday;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
@Entity
@Id
@GeneratedValue
以上註解是 JPA 框架提供的,實體類和表建立對映關係的。
Bean Validation 規範,執行時的資料驗證框架。它是 JSR 303 規範,Hibernate Validator 實現了這套規範,並擴充套件了一些註解,如下:
@Null 被註釋的元素必須為 null
@NotNull 被註釋的元素必須不為 null
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註釋的元素的大小必須在指定的範圍內
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字串的大小必須在指定的範圍內
@NotEmpty 被註釋的字串的必須非空
@Range 被註釋的元素必須在合適的範圍內
3.控制層 UserController
UserController 控制層程式碼如下:
/**
* 建立使用者
* 處理 "/users" 的 POST 請求,用來獲取使用者列表
* 通過 @ModelAttribute 繫結引數,也通過 @RequestParam 從頁面中傳遞引數
*/
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String postUser(ModelMap map,
@ModelAttribute @Valid User user,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
map.addAttribute("action", "create");
return "userForm";
}
userService.insertByUser(user);
return "redirect:/users/";
}
/**
* 處理 "/users/{id}" 的 PUT 請求,用來更新 User 資訊
*
*/
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String putUser(ModelMap map,
@ModelAttribute @Valid User user,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
map.addAttribute("action", "update");
return "userForm";
}
userService.update(user);
return "redirect:/users/";
}
在新增和更新使用者時,我們會對錶單進行驗證,那麼首先用 @Valid 註解到實體類,使實體類 User 中驗證註解生效,然後我們介紹下 BindingResult ,是資料繫結的結果物件,從原始碼中可以看出,其繼承了 Errors 介面,所以所有的錯誤資訊都會被繫結到這個物件。通過 hasErrors() 方法判斷是否有錯誤資訊,如果有返回原頁面,並展示錯誤資訊。
那頁面是如何展示的呢?可以看看在 Thymeleaf 頁面是這樣的:
生日有誤!