Spring MVC利用Hibernate Validator實現后端數據校驗(一)


數據校驗:

1.前端數據校驗:
使用JS代碼進行的前端數據校驗
可以使用前端數據校驗的框架:
Jquer.Validation-xxx.js

2.后端數據校驗
主要使用JAVA代碼進行數據校驗
后端數據校驗是有框架的:Java自己做了一個后端數據校驗的規則——BeanValidation
BeanValidation后端數據校驗規則由Hibernate所在公司實現

SpringMVC中使用BeanValidation進行后端校驗的,BeanValidation是Java中定義的一種后端數據校驗的規范,這個規范由Hibernate實現。

為什么要做數據校驗

  “用戶的輸入是邪惡的”——能讓用戶動鼠標,決對不要讓用戶使用鍵盤。


SpringMVC中如何做數據校驗
  SpringMVC數據校驗沿用了JavaEE中的BeanValidation,BeanValidation是一個規范——JSR303。
  Java當中只要提到規范內容,其語言實現上就是使用的接口。
  這個BeanValidation由Hibernate實現。
  在此就可以使用Hibernate對BeanValidation的實現完成數據校驗。

JSR 303、JSR 349與Bean Validator
        籠統來說,就是Java規定了一套關於驗證器的API,規范先后發了兩版,就是所謂的JSR 303與JSR 349。然后提出了基於規范的實現:Bean Validator。JSR 303是最早的,其對應了Bean Validator 1.0的版本,比較菜,然后后來擴展了JSR 349,提出了依賴注入、注解等內容,稱為了Bean Validator。

        關於Bean Validator,這並不是一項技術,也算是一種規范,需要對其實現。而博文使用的Hibernate Validator就是其中一種。因為Spring MVC本身不提供validator的,所以我們需要其他的代替。下面是Wikipedia的一些內容:

大概翻譯一下,就是Java Bean的數據驗證(JSR 303),起源於2009今年批准的框架,並成為Java EE 6的一部分。而hibernate團隊提供了其一種實現。所以Hibernate Validator其實與SSH的那個H:Hibernate,並不是其子集。(可能吧,並沒有接觸過hibernate)。

Hibernate Validator
        上面也說過了其由來,這里簡單說明一下運行過程。JSR 349提出了注解約束,所以一般使用注解了。除去在項目中的配置,我們可以在Java Bean中的屬性上使用注解來進行數據約束。在Spring MVC中,利用IoC處理對象的時候就會觸發數據驗證。例如提交表單的時候,dispatcher接收的時候,就會根據約束來判定數據是否正確。如果有不正確的,就會根據聲明的message,將其添加到Error中,Spring MVC中一般使用BlindingResult對象來獲取,然后就能對錯誤的數據進行處理了。

Hibernate Validator
        上面也說過了其由來,這里簡單說明一下運行過程。JSR 349提出了注解約束,所以一般使用注解了。除去在項目中的配置,我們可以在Java Bean中的屬性上使用注解來進行數據約束。在Spring MVC中,利用IoC處理對象的時候就會觸發數據驗證。例如提交表單的時候,dispatcher接收的時候,就會根據約束來判定數據是否正確。如果有不正確的,就會根據聲明的message,將其添加到Error中,Spring MVC中一般使用BlindingResult對象來獲取,然后就能對錯誤的數據進行處理了。

操作步驟:

Hibernate的BeanValidation數據校驗需要的包
  hibernate-validator-xxx.jar   (xxx表示版本號)

第一步:下載hibernate-validator-xxx.jar包及相關的jboss-logging-xxx.jar,classmate-xxx.jar

在maven項目的pom.xml中添加:

點擊保存,會有以下四個jar包,依賴關系帶下來的。

 

第二步:配置SpringMVC的BeanValidator

<mvc:annotation-drive/>節點的validator屬性:表示提供一個BeanValidator,而BeanValidator的實現,是使用HibernateValidator。

在SpringMVC中使用LocalValidatorFactoryBean加載驗證實現。

第三步:在要驗證的處理請求的方法的參數上加上注解@Valid,並在使用了@Valid參數后緊跟一個BindingResult接口參數

第四步:判斷BindingResult中的錯誤

 

 

 步驟暫停,我們來啟動服務先測試一下

啟動服務器之后控制台輸出一下異常:(如果沒有出現下面的異常,請翻到第五步)

這是因為導入的jar包重復了,那重復的是哪一個呢?看下面

在之前我導入了javaee-api,這個jar包里面也有一個validator,在javaee-api里面帶有validator-api。

這個時候移除多余的validator-api的jar包,不能移除javaee-api這個包,移除了你的servlet就沒有了。

 移除方法:

 

點擊保存之后,你就會看到validator-api包沒有了喲

再次重啟服務器運行,這個時候控制台又輸出一個錯誤:

 

沒有找到javax/validation/ClockProvider,這個時候到javaee-api包下面去找:

確實沒有這個時候怎么辦呢,又不能再添加一個validator-api,添加就會重復,刪除javaee-api用validator-api的話servlet又不能用了,這個時候就可以用javaee-api高一點的版本,我這里用的是7.0的,我把它改成8.0試試

在pom.xml文件中改版本號,點擊保存等待下載就ok了,下載好了再來看:

 這個時候就有javax/validation/ClockProvider

 又再次啟動服務器,又有異常了。。。。。。

看到ClassNotFoundException就知道缺包了,

JSON對應的依賴包,常用有三種json解析jackson、fastjson、gson。

添加以下這三個包:

jackson-core-xxx.jar

jackson-annotations-jar

jackson-Databind-xxx.jar

到這一步,再次重啟服務器,終於沒有異常了,大哭。。。。。。

到現在總共加了六個包進來

第五步:在需要驗證的JavaBean上使用使用驗證注解

第六步:處理校驗結果

 

校驗頁面處理:

小結:

1.BeanValidation:javax中的Bean校驗規范,規范由Hibernate實現
2.提供校驗實例
3.在控制器處理方法的參數上使用@Valid,並在該參數后加上一個BindingResult接口參數
4.驗證Bean中的需要驗證的成員變量上使用驗證注解。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM