1. 程式人生 > >Spring Boot 表單驗證篇

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

git clone https://github.com/JeffLi1993/spring-boot-core-book-demo.git

2. Maven 編譯安裝這個工程:

1

2

cd spring-boot-core-book-demo

mvn clean install

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 頁面是這樣的:
生日有誤!