Spring Boot 表單驗證篇
一、 spring-boot-starter-validation 依賴概述
上一篇 《Spring Boot Web 開發(fā)注解篇》,就可以快速地進(jìn)行 Web 開發(fā)。那么在表單提交的時候,我們需要進(jìn)行驗證。前端驗證可以擋住 99% 的小白用戶,這里要實現(xiàn)服務(wù)端驗證。
Starters 機制告訴我們,只要加入 spring-boot-starter-validation 這個 Starter ,就可以使用其實現(xiàn)驗證。那什么是 spring-boot-starter-validation?
spring-boot-starter-validation 就是使用 Hibernate Validator 框架來提供 Java Bean 驗證功能。
1.1 spring-boot-starter-validation 職責(zé)
spring-boot-starter-validation 是一個用于驗證的 Starter,主要完成的是 Java Bean 的驗證功能。
1.2 spring-boot-starter-validation 依賴關(guān)系
spring-boot-starter-validation 依賴的組成如下表:
- spring-boot-starter 核心包,包括了自動化配置支持、日志、YAML 文件解析的支持等。
- tomcat-embed-el Tomcat 容器嵌入包
- hibernate-validator Hibernate 驗證框架包
可見,tomcat 容器是 8.x 版本。這里有個小問題了,為啥 spring-boot-starter-web 也有這些上面這些依賴呢?這樣如果開發(fā) web 就不需要重復(fù)添加 spring-boot-starter-validation 依賴了。但如果沒用 web 依賴時候想要實現(xiàn) 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:
git clone https://github.com/JeffLi1993/spring-boot-core-book-demo.git
2. Maven 編譯安裝這個工程:
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 用戶列表頁面:
點擊創(chuàng)建用戶按鈕,打開用戶管理頁面:
輸入非法值提示:
三、 詳解 spring-boot-validating-form-input
1.pom.xml 如下:
validator 驗證依賴主要在 web 依賴中,web 依賴包含了 hibernate-validator 依賴
還有以下依賴:
單元測試依賴
Spring Data JPA 依賴 :: 數(shù)據(jù)持久層框架
h2 數(shù)據(jù)源連接驅(qū)動
模板引擎 Thymeleaf 依賴
2.實體類
具體業(yè)務(wù)層邏輯這邊不解釋,主要還是在控制層和 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 框架提供的,實體類和表建立映射關(guān)系的。
Bean Validation 規(guī)范,運行時的數(shù)據(jù)驗證框架。它是 JSR 303 規(guī)范,Hibernate Validator 實現(xiàn)了這套規(guī)范,并擴展了一些注解,如下:
@Null 被注釋的元素必須為 null
@NotNull 被注釋的元素必須不為 null
@Min(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Size(max, min) 被注釋的元素的大小必須在指定的范圍內(nèi)
@Email 被注釋的元素必須是電子郵箱地址
@Length 被注釋的字符串的大小必須在指定的范圍內(nèi)
@NotEmpty 被注釋的字符串的必須非空
@Range 被注釋的元素必須在合適的范圍內(nèi)
3.控制層 UserController
UserController 控制層代碼如下:
/** * 創(chuàng)建用戶 * 處理 “/users” 的 POST 請求,用來獲取用戶列表 * 通過 @ModelAttribute 綁定參數(shù),也通過 @RequestParam 從頁面中傳遞參數(shù) */ @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/”; }
在新增和更新用戶時,我們會對表單進(jìn)行驗證,那么首先用 @Valid 注解到實體類,使實體類 User 中驗證注解生效,然后我們介紹下 BindingResult ,是數(shù)據(jù)綁定的結(jié)果對象,從源碼中可以看出,其繼承了 Errors 接口,所以所有的錯誤信息都會被綁定到這個對象。通過 hasErrors() 方法判斷是否有錯誤信息,如果有返回原頁面,并展示錯誤信息。
總結(jié)
以上所述是小編給大家介紹的Spring Boot 表單驗證篇,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
使用Mybatis Generator結(jié)合Ant腳本快速自動生成Model、Mapper等文件的方法
這篇文章主要介紹了使用Mybatis Generator結(jié)合Ant腳本快速自動生成Model、Mapper等文件的方法的相關(guān)資料,需要的朋友可以參考下2016-06-06Spring Security使用單點登錄的權(quán)限功能
本文主要介紹了Spring Security使用單點登錄的權(quán)限功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽
這篇文章主要介紹了IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04詳解spring集成mina實現(xiàn)服務(wù)端主動推送(包含心跳檢測)
本篇文章主要介紹了詳解spring集成mina實現(xiàn)服務(wù)端主動推送(包含心跳檢測),具有一定的參考價值,與興趣的可以了解一下2017-09-09Java內(nèi)存緩存工具Guava LoadingCache使用解析
這篇文章主要介紹了Java內(nèi)存緩存工具Guava LoadingCache使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01SpringCloud之微服務(wù)容錯的實現(xiàn)
這篇文章主要介紹了SpringCloud之微服務(wù)容錯的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05