References:《Struts2的資料驗證架構validation framework》[1],《Apache Struts 2 Documentation--Validation》
之前學習了Struts2的寫入程式碼校正,這回學習一下validation架構,即使用XML配置的方式。
一,Struts2資料驗證的整體架構介紹
struts2的action都要繼承ActionSupprot類,這個類實現了Validateable與ValidationAware這兩個跟資料驗證有關的介面。其中Validateable只有一個方法validate()用於資料驗證;ValidationAware 則用於記錄驗證出錯時的相關資訊。
而資料驗證在什麼時候被調用呢?資料驗證的調用是封裝在workflow攔截器裡,
我們看看workflow攔截器在struts_default.xml中的定義,它是放在預設的defaultStack攔截器組裡,相關順序如下:
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
params與conversionError這兩個攔截器在workflow的前面,它們的工作是從request中把資料轉成正確的Java類型資料,以供後面處理。validation攔截器實質是AnnotationValidationInterceptor與我們這裡談的資料驗證不是一回事,它只判斷有沒有@SkipValidation註解,如果有就不會路過資料驗證,只是起一個開關作用。
當workflow攔截器觸發時,它先檢查當前請求的action是否實現了Validateable介面,如果實現了該介面,則調用 validate()方法:如果這個方法處理時發現有資料驗證不通過,則會產生一個錯誤資訊並交給ValidationAware的方法去儲存這些出錯資訊。當validate()方法執行完畢,workflow攔截器還要調用ValidationAware的hasErrors()方法,看看是否有出錯資訊產生,如果有出錯資訊,就中斷當前action的執行流程,返回"input"字串,一般我們是在設定檔struts.xml裡配置"input"返回結果的跳轉頁面。
二,資料驗證的方式
1.在action()裡面實現validation方法(上一次講過了)
2.使用xml設定檔:ActionClass-validations.xml
其實struts2已經內建了一些基本的資料驗證,完全可以省去我們日常的一些資料驗證需求,通過設定檔的方式(預設攔截器中已經TurnOn了)。
在ActionClass所在的目錄下,建立一個以ActionClass名字組合成的特定xml:ActionClass-validations.xml(例,我的ActionClass名為RegUser,則我應該在同目錄下建一名為RegUser-validations.xml的檔案。
Struts2內建validator
範例程式碼:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="bar">
<field-validator type="required">
<message>You must enter a value for bar.</message>
</field-validator>
<field-validator type="int">
<param name="min">6</param>
<param name="max">10</param>
<message>bar must be between ${min} and ${max}, current value is ${bar}.</message> </field-validator>
</field>
<field name="bar2">
<field-validator type="regex">
<param name="expression">[0-9],[0-9]</param>
<message>The value of bar2 must be in the format "x, y", where x and y are between 0 and 9</message>
</field-validator>
</field>
<field name="date">
<field-validator type="date">
<param name="min">12/22/2002</param>
<param name="max">12/25/2002</param>
<message>The date must be between 12-22-2002 and 12-25-2002.</message>
</field-validator>
</field>
<field name="foo">
<field-validator type="int">
<param name="min">0</param>
<param name="max">100</param>
<message key="foo.range">Could not find foo.range!</message>
</field-validator>
</field>
<validator type="expression">
<param name="expression">foo lt bar </param>
<message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message> </validator>
</validators>
3,使用自己定義的驗證器做資料驗證
[1]裡面有,我就不抄了……