Struts 2提供了基于驗證架構的輸入校驗,在這種校驗方式下,所有的輸入校驗隻需要編寫簡單的配置檔案,Struts 2的驗證架構将會負責進行伺服器校驗和用戶端校驗。
下面應用将會示範如何利用Struts 2的校驗架構進行輸入校驗。使用Struts 2的校驗架構進行校驗無須對程式代碼進行任何改變,隻需編寫校驗規則檔案即可,校驗規則檔案指定每個表單域應該滿足怎樣的規則。
本應用所使用的表單代碼如下。
程式清單:codes\04\4.2\basicValidate\regist.jsp
<s:form action="regist">
<b> <s:textfield name="name" label="</b><b>使用者名"/></b>
<b> <s:textfield name="pass" label="</b><b>密碼"/></b>
<b> <s:textfield name="age" label="</b><b>年齡"/></b>
<b> <s:textfield name="birth" label="</b><b>生日"/></b>
<s:submit value="注冊"/>
</s:form>
上面粗體字代碼定義了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
<?xml version="1.0" encoding="GBK"?>
<!-- 指定校驗配置檔案的DTD資訊 -->
<!DOCTYPE validators PUBLIC
<!-- 校驗檔案的根元素 -->
<validators>
<!-- 校驗Action的name屬性 -->
<b> </b>
<b> <!-- </b><b>指定name</b><b>屬性必須滿足必填規則 --></b>
<b> </b>
<b> </b>
<b> <message></b><b>必須輸入名字</message></b>
<b> <!-- </b><b>指定name</b><b>屬性必須比對正規表達式 --></b>
<b> <message></b><b>您輸入的使用者名隻能是字母和數字</b>
<b> </b><b>,且長度必須在4</b><b>到25</b><b>之間</message></b>
<b> <!-- </b><b>校驗Action</b><b>的pass</b><b>屬性 --></b>
<b> <!-- </b><b>指定pass</b><b>屬性必須滿足必填規則 --></b>
<b> <message></b><b>必須輸入密碼</message></b>
<b> <!-- </b><b>指定pass</b><b>屬性必須滿足比對指定的正規表達式 --></b>
<b> <message></b><b>您輸入的密碼隻能是字母和數字</b>
<b> <!-- </b><b>指定age</b><b>屬性必須在指定範圍内--></b>
<b> <message></b><b>年紀必須在1</b><b>到150</b><b>之間</message></b>
<b> <!-- </b><b>指定birth</b><b>屬性必須在指定範圍内--></b>
<b> <!-- </b><b>下面指定日期字元串時,必須使用本Locale</b><b>的日期格式 --></b>
<b> <message></b><b>生日必須在${min}</b><b>到${max}</b><b>之間</message></b>
</validators>
校驗規則檔案的根元素是<validators.../>元素,<validators.../>元素可包含多個<field.../>或<validator.../>元素,它們都用于配置校驗規則,差別是:<field-validator.../>是字段校驗器的配置風格,而<validator.../>是非字段校驗器的配置風格。關于這兩個元素配置方式後面還有更詳細的介紹。
Struts 2的校驗檔案規則與Struts 1的校驗檔案設計方式不同,Struts 2中每個Action都有一個校驗檔案,是以該檔案的檔案名應該遵守如下規則:
<Action名字>-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
<!-- 使用者注冊的Action -->
<action name="regist" class="org.crazyit.app.action.RegistAction">
<!-- 類型轉換失敗、輸入校驗失敗,轉入該頁面 -->
</action>
增加了上面的修改之後,這樣就為該Action對應的各字段添加了校驗規則,而且指定了校驗失敗後應用會跳轉到regist.jsp頁面,接下來可以在regist.jsp頁面中添加<s:fielderror/>來輸出錯誤提示。
剩下部分無須任何修改,系統自動會加載該檔案,當使用者送出請求時,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邏輯視圖名,且都使用<s:fielderror/>标簽來輸出錯誤提示資訊。如果開發者使用了Struts 2的表單标簽來生成表單,那麼表單标簽會自動輸出錯誤提示,如圖4.12所示。
提示:
本文轉自
fkJava李剛 51CTO部落格,原文連結:http://blog.51cto.com/javaligang/875483 ,如需轉載請自行聯系原作者