1. 程式人生 > 實用技巧 >SpringMVC - 5 校驗框架

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;//員工姓名