SpringMVC - 5 校驗框架
SpringMVC - 5 校驗框架
1.1 校驗框架入門
1.1.1 表單校驗的重要性
- 表單校驗保障了資料有效性、安全性
資料可以隨意輸入,導致錯誤的結果。後端表單校驗的重要性。
1.1.2 表單校驗分類
- 校驗位置:
- 客戶端校驗
- 服務端校驗
- 校驗內容與對應方式:
- 格式校驗
- 客戶端:使用Js技術,利用正則表示式校驗
- 服務端:使用校驗框架
- 邏輯校驗
- 客戶端:使用ajax傳送要校驗的資料,在服務端完成邏輯校驗,返回校驗結果
- 服務端:接收到完整的請求後,在執行業務操作前,完成邏輯校驗
- 格式校驗
1.1.3 表單校驗規則
- 長度:例如使用者名稱長度,評論字元數量
- 非法字元:例如使用者名稱組成
- 資料格式:例如Email格式、 IP地址格式
- 邊界值:例如轉賬金額上限,年齡上下限
- 重複性:例如使用者名稱是否重複
1.1.4 表單校驗框架
-
JSR(Java Specification Requests):Java 規範提案
303:提供bean屬性相關校驗規則
-
JSR規範列表
- 企業應用技術
Contexts and Dependency Injection for Java (Web Beans 1.0) (JSR 299)
Dependency Injection for Java 1.0 (JSR 330)@postConstruct, @PreDestroy
Bean Validation 1.0 (JSR 303)
Enterprise JavaBeans 3.1 (includes Interceptors 1.1) (JSR 318)
Java EE Connector Architecture 1.6 (JSR 322)
Java Persistence 2.0 (JSR 317)
Common Annotations for the Java Platform 1.1 (JSR 250)
Java Message Service API 1.1 (JSR 914)
Java Transaction API (JTA) 1.1 (JSR 907)
JavaMail 1.4 (JSR 919) - Web應用技術
Java Servlet 3.0 (JSR 315)
JavaServer Faces 2.0 (JSR 314)
JavaServer Pages 2.2/Expression Language 2.2 (JSR 245)
Standard Tag Library for JavaServer Pages (JSTL) 1.2 (JSR 52)
Debugging Support for Other Languages 1.0 (JSR 45)
模組化 (JSR 294)
Swing應用框架 (JSR 296)
JavaBeans Activation Framework (JAF) 1.1 (JSR 925)
Streaming API for XML (StAX) 1.0 (JSR 173) - 管理與安全技術
Java Authentication Service Provider Interface for Containers (JSR 196)
Java Authorization Contract for Containers 1.3 (JSR 115)
Java EE Application Deployment 1.2 (JSR 88)
J2EE Management 1.1 (JSR 77)
Java SE中與Java EE有關的規範
JCache API (JSR 107)
Java Memory Model (JSR 133)
Concurrency Utilitie (JSR 166)
Java API for XML Processing (JAXP) 1.3 (JSR 206)
Java Database Connectivity 4.0 (JSR 221)
Java Management Extensions (JMX) 2.0 (JSR 255)
Java Portlet API (JSR 286)
- 企業應用技術
-
Web Service技術
Java Date與Time API (JSR 310)
Java API for RESTful Web Services (JAX-RS) 1.1 (JSR 311)
Implementing Enterprise Web Services 1.3 (JSR 109)
Java API for XML-Based Web Services (JAX-WS) 2.2 (JSR 224)
Java Architecture for XML Binding (JAXB) 2.2 (JSR 222)
Web Services Metadata for the Java Platform (JSR 181)
Java API for XML-Based RPC (JAX-RPC) 1.1 (JSR 101)
Java APIs for XML Messaging 1.3 (JSR 67)
Java API for XML Registries (JAXR) 1.0 (JSR 93) -
JCP(Java Community Process):Java社群
-
Hibernate框架中包含一套獨立的校驗框架hibernate-validator
匯入座標
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.0.Final</version> </dependency>
注意:
tomcat7 :搭配hibernate-validator版本5...Final
tomcat8.5↑ :搭配hibernate-validator版本6...Final
1.2 快速使用
1. 開啟校驗
名稱:@Valid 、 @Validated
型別:形參註解
位置:處理器類中的實體類型別的方法形參前方
作用:設定對當前實體類型別引數進行校驗
範例:
@RequestMapping(value = "/addemployee")
public String addEmployee(@Valid Employee employee) {
System.out.println(employee);
}
2.設定校驗規則
名稱:@NotNull
型別:屬性註解 等
位置:實體類屬性上方
作用:設定當前屬性校驗規則
範例:
每個校驗規則所攜帶的引數不同,根據校驗規則進行相應的調整
具體的校驗規則檢視對應的校驗框架進行獲取
public class Employee{
@NotNull(message = "姓名不能為空")
private String name;//員工姓名
}
3.獲取錯誤資訊
@RequestMapping(value = "/addemployee")
public String addEmployee(@Valid Employee employee, Errors errors, Model model){
System.out.println(employee);
if(errors.hasErrors()){
for(FieldError error : errors.getFieldErrors()){
model.addAttribute(error.getField(),error.getDefaultMessage());
}
return "addemployee.jsp";
}
return "success.jsp";
}
通過形參Errors獲取校驗結果資料,通過Model介面將資料封裝後傳遞到頁面顯示
<form action="/addemployee" method="post">
員工姓名:<input type="text" name="name"><span style="color:red">${name}</span><br/>
員工年齡:<input type="text" name="age"><span style="color:red">${age}</span><br/>
<input type="submit" value="提交">
</form>
通過形參Errors獲取校驗結果資料,通過Model介面將資料封裝後傳遞到頁面顯示
頁面獲取後臺封裝的校驗結果資訊
1.3 多規則校驗
- 同一個屬性可以新增多個校驗器
@NotNull(message = "請輸入您的年齡")
@Max(value = 60,message = "年齡最大值不允許超過60歲")
@Min(value = 18,message = "年齡最小值不允許低於18歲")
private Integer age;//員工年齡
- 3種判定空校驗器的區別
1.4 巢狀校驗
名稱:@Valid
型別:屬性註解
位置:實體類中的引用型別屬性上方
作用:設定當前應用型別屬性中的屬性開啟校驗
範例:
public class Employee {
//實體類中的引用型別通過標註@Valid註解,設定開啟當前引用型別欄位中的屬性參與校驗
@Valid
private Address address;
}
注意:開啟巢狀校驗後,被校驗物件內部需要新增對應的校驗規則
1.5 分組校驗
- 同一個模組,根據執行的業務不同,需要校驗的屬性會有不同
- 新增使用者
- 修改使用者
- 對不同種類的屬性進行分組,在校驗時可以指定參與校驗的欄位所屬的組類別
- 定義組(通用)
- 為屬性設定所屬組,可以設定多個
- 開啟組校驗
public interface GroupOne {
}
public String addEmployee(@Validated({GroupOne.class}) Employee employee){
}
@NotEmpty(message = "姓名不能為空",groups = {GroupOne.class})
private String name;//員工姓名