天天看點

編寫校驗規則檔案

Struts 2提供了基于驗證架構的輸入校驗,在這種校驗方式下,所有的輸入校驗隻需要編寫簡單的配置檔案,Struts 2的驗證架構将會負責進行伺服器校驗和用戶端校驗。

下面應用将會示範如何利用Struts 2的校驗架構進行輸入校驗。使用Struts 2的校驗架構進行校驗無須對程式代碼進行任何改變,隻需編寫校驗規則檔案即可,校驗規則檔案指定每個表單域應該滿足怎樣的規則。

本應用所使用的表單代碼如下。

程式清單:codes\04\4.2\basicValidate\regist.jsp

<s:form action="regist">

<b>     &lt;s:textfield name="name" label="</b><b>使用者名"/&gt;</b>

<b>     &lt;s:textfield name="pass" label="</b><b>密碼"/&gt;</b>

<b>     &lt;s:textfield name="age" label="</b><b>年齡"/&gt;</b>

<b>     &lt;s:textfield name="birth" label="</b><b>生日"/&gt;</b>

     &lt;s:submit value="注冊"/&gt;

&lt;/s:form&gt;

上面粗體字代碼定義了4個表單域,這4個表單域分别對應name、pass、age和birth 4個請求參數,假設本應用要求這4個請求參數滿足如下規則:

Ø  name和pass隻能是字母和數組,且長度必須在4到25之間。

Ø  年齡必須是1到150之間的整數。

Ø  生日必須在1900-01-01和2050-02-21之間。

下面是該請求對應的Action代碼。

程式清單:codes\04\4.2\basicValidate\WEB-INF\src\org\crazyit\app\action\RegistAction.java

public class RegistAction extends ActionSupport

{

     //該請求包含的4個請求參數

     //此處省略了4個屬性的setter和getter方法

}

在上面的Action中,我們僅提供了4個屬性來封裝使用者的請求參數,并為這4個參數提供了對應的setter和getter方法。該Action繼承了ActionSupport類,是以它也包含了一個execute方法,且該方法直接傳回success字元串,這個Action不具備任何輸入校驗的功能。

但通過為該Action指定一個校驗規則檔案後,即可利用Struts 2的輸入校驗功能對該Action進行校驗。下面是本應用所使用的輸入校驗檔案。

程式清單:codes\04\4.2\basicValidate\WEB-INF\src\org\crazyit\app\action\RegistAction-validation.xml

&lt;?xml version="1.0" encoding="GBK"?&gt;

&lt;!-- 指定校驗配置檔案的DTD資訊 --&gt;

&lt;!DOCTYPE validators PUBLIC

&lt;!-- 校驗檔案的根元素 --&gt;

&lt;validators&gt;

     &lt;!-- 校驗Action的name屬性 --&gt;

<b>     </b>

<b>          &lt;!-- </b><b>指定name</b><b>屬性必須滿足必填規則 --&gt;</b>

<b>          </b>

<b>               </b>

<b>               &lt;message&gt;</b><b>必須輸入名字&lt;/message&gt;</b>

<b>          &lt;!-- </b><b>指定name</b><b>屬性必須比對正規表達式 --&gt;</b>

<b>               &lt;message&gt;</b><b>您輸入的使用者名隻能是字母和數字</b>

<b>                    </b><b>,且長度必須在4</b><b>到25</b><b>之間&lt;/message&gt;</b>

<b>     &lt;!-- </b><b>校驗Action</b><b>的pass</b><b>屬性 --&gt;</b>

<b>          &lt;!-- </b><b>指定pass</b><b>屬性必須滿足必填規則 --&gt;</b>

<b>               &lt;message&gt;</b><b>必須輸入密碼&lt;/message&gt;</b>

<b>          &lt;!-- </b><b>指定pass</b><b>屬性必須滿足比對指定的正規表達式 --&gt;</b>

<b>               &lt;message&gt;</b><b>您輸入的密碼隻能是字母和數字</b>

<b>     &lt;!-- </b><b>指定age</b><b>屬性必須在指定範圍内--&gt;</b>

<b>               &lt;message&gt;</b><b>年紀必須在1</b><b>到150</b><b>之間&lt;/message&gt;</b>

<b>     &lt;!-- </b><b>指定birth</b><b>屬性必須在指定範圍内--&gt;</b>

<b>               &lt;!-- </b><b>下面指定日期字元串時,必須使用本Locale</b><b>的日期格式 --&gt;</b>

<b>               &lt;message&gt;</b><b>生日必須在${min}</b><b>到${max}</b><b>之間&lt;/message&gt;</b>

&lt;/validators&gt;

校驗規則檔案的根元素是&lt;validators.../&gt;元素,&lt;validators.../&gt;元素可包含多個&lt;field.../&gt;或&lt;validator.../&gt;元素,它們都用于配置校驗規則,差別是:&lt;field-validator.../&gt;是字段校驗器的配置風格,而&lt;validator.../&gt;是非字段校驗器的配置風格。關于這兩個元素配置方式後面還有更詳細的介紹。

Struts 2的校驗檔案規則與Struts 1的校驗檔案設計方式不同,Struts 2中每個Action都有一個校驗檔案,是以該檔案的檔案名應該遵守如下規則:

&lt;Action名字&gt;-validation.xml

前面的Action名是可以改變的,後面的-validation.xml部分總是固定的,且該檔案應該被儲存在與Action class檔案相同的路徑下。例如,本應用的Action class檔案儲存在WEB-INF/classes/org/crazyit/ app/action路徑下,故該校驗檔案也應該儲存在該路徑下。

與類型轉換失敗相似的是,當輸入校驗失敗後,Struts 2也是自動傳回名為“input”的Result,是以需要在struts.xml檔案中配置名為“input”的Result。下面是本應用的struts.xml檔案中Action的配置片段。

程式清單:codes\04\4.2\basicValidate\WEB-INF\src\struts.xml

&lt;!-- 使用者注冊的Action --&gt;

&lt;action name="regist" class="org.crazyit.app.action.RegistAction"&gt;

     &lt;!-- 類型轉換失敗、輸入校驗失敗,轉入該頁面 --&gt;

&lt;/action&gt;

增加了上面的修改之後,這樣就為該Action對應的各字段添加了校驗規則,而且指定了校驗失敗後應用會跳轉到regist.jsp頁面,接下來可以在regist.jsp頁面中添加&lt;s:fielderror/&gt;來輸出錯誤提示。

剩下部分無須任何修改,系統自動會加載該檔案,當使用者送出請求時,Struts 2的校驗架構會根據該檔案對使用者請求進行校驗。如果浏覽者的輸入不滿足校驗規則,将可以看到如圖4.12所示的界面。

<a href="http://blog.51cto.com/attachment/201205/101835899.jpg" target="_blank"></a>

圖4.12  使用校驗架構的效果

從圖4.12中可以看出,這種基于Struts 2校驗架構的校驗方式完全可以替代手動校驗,而且這種校驗方式的可重用性非常高,隻需要在配置檔案中配置校驗規則,即可完成資料校驗,無須使用者書寫任何的資料校驗代碼。

類型轉換失敗的提示資訊、輸入校驗失敗的提示資訊都被封裝成FieldError,并被放入Action Context中,而且校驗失敗時都将傳回input邏輯視圖名,且都使用&lt;s:fielderror/&gt;标簽來輸出錯誤提示資訊。如果開發者使用了Struts 2的表單标簽來生成表單,那麼表單标簽會自動輸出錯誤提示,如圖4.12所示。

提示:

本文轉自

fkJava李剛 51CTO部落格,原文連結:http://blog.51cto.com/javaligang/875483 ,如需轉載請自行聯系原作者