Validatro框架以成為Jakarta的公共項目的一部分,可以從http://jakarta.apache.org/commons/下載單獨的Validator框架,在Struts中已經呆了這個框架。
Validator主要依賴兩個jar包
Jakarta-oro.jar:-提供一組處理文本的類,具有文本替換、過濾、和分割功能。
Commons-validator.jar:提供了一個簡單、可擴展的驗證框架,包含了通用的驗證方法和驗證規則。
在用Struts中用這個框架,需加入這兩個包,用起來感覺還不錯。
下面介紹一下。
Validator采用基於兩個xml文件的方式來配置驗證規則,分別為validation.xml,validator-rules.xml。在struts應用中,需放到web-inf目錄下。
1.validator-rules.xml
這個文件包含了一組驗證規則,對所有struts應用都適用。一般情況不用修改這個文件,除非要修改或擴展默認規則。如果要給應放到另一個xml文件中,而不是直接添加到validator-rules.xml文件中,這樣當Validator升級時,不用修改validator-rules.xml文件。
2.validator.xml文件
這個文件是針對於具體struts應用的,他可以為應用中的ActionForm配置驗證規則。而不用編碼實現驗證。
例如一個驗證登陸form的例子,要求用戶名必須填寫,秘密要求必填、最大、最小長度及其內容的要求。
代碼
<form-validation>
<global>
<!-- 密碼由數字、26個英文字母或者下劃線組成的字符串 -->
<constant>
<constant-name>pwd</constant-name>
<onstant-value>^\w+$</onstant-value>
</constant>
</global>
<formset>
<form name="loginForm">
<!-- 這裡的用戶名使用郵箱,驗證時使用正則表達式進行驗證 -->
<field property="user.userId" depends="required">
<arg0 key="user.userId" />
</field>
<field property="user.userPwd" depends="required,minlength,maxlength,mask">
<!-- msg name="mask" key="errors.invalid" /-->
<arg0 key="user.userPwd" />
<arg1 name="minlength" key="${var:minlength}" resource="false" />
<arg2 name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>mask</var-name>
<var-value>^\w+$</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
validator.xml和validator-rules.xml文件的語法不在這裡說明。
3.Validator插件
為了在struts中用validator,可以用插件方式加載Validator框架,需在struts配置文件中配置ValidatorPlugIn插件,同時寫明兩個xml文件的路徑。
應用啟動時,Strust會加載這個插件,並調用他的init()方法,init()方法根據pathnames加載
相應的validator-xml,validator.xml文件,把驗證信息讀入到內存中。
代碼
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"
property="pathnames" />
</plug-in>
4.Validator和ActionForm
Validator框架不能直接org.apache.struts.action.ActionForm。應采用ActionForm的兩個子類
ValidatorActionForm和ValidatorForm
DynaValidatorActionFrom繼續自DynaValidatorForm
支持動態在ActionFrom中使用Validator框架
ValidatorFormActionForm繼承ValidatorForm
支持在標准ActionForm中使用Validator框架。
DynaValidtaorForom和ValidatorForm類都實現了validator()方法,如果驗證失敗,就會返回包含錯誤消息的ActionMessage對象,並把該對象添加到ActionErrors集合對象中,由validator方法最後返回ActionErrors對象。
ValidatorForm有一個子類ValidatorActionForm
ValidatorForm
Strust配置文件的元素的name屬------>validator.xml文件 元素的name屬性
ValidatorActionForm
Strust配置文件的元素的path屬------>validator.xml文件元素的name屬性
Validator框架提供這兩個類目的在於可以更加精確的控制執行驗證的條件。
例如
loginForm表單對應兩個驗證規則A、B。對應login、cancel兩個動作。
如果對於這兩個動作都要執行規則A、B。則可以擴展一個ValidatorFom類loginForm然後配置
代碼
<formset>
<form name=”loginForm”>
驗證規則A
驗證規則B
.</form>
….
</formset>
如果對於用戶的login動作,執行規則A。對於cancel動作執行B規則。則可以擴展一個ValidatorActionFom類
loginForm
然後配置
代碼
<formset>
<form name=”login”>
驗證規則A
.</form>
<form name=”cancel”>
驗證規則B
.</form>
</formset>
而DynaValidatorForm和DynaValidatorActionForm,區別和ValidatorFrom和ValidatorActionForm的區別一樣
5.在validator框架中使用JavaScript
默認情況下,validator框架在服務器端執行表單驗證。也可以在客戶端驗證。
如果在客戶端驗證,需要使用struts的標簽,他能在jsp頁面中生成用於客戶端驗證
的JavaScript的腳本。
1)在validator-rules.xml文件的元素中配置元素默認struts框架的validator-rules.xml文件已經包含了javascript子元素。也可以將這些javascript集中放到一個validator.js的文件中,也頁面中引入代碼
< script language="Javascript1.1" src="js/validator.js">< /script>
2)在Jsp頁面中包含< html:javascript>
< html:javascript formName=”loginForm”> 這個標簽的form的name屬性制定需要驗證的表單名字,
他能夠訪問為表單配置的驗證規則的javascript元素,把包含的腳本寫到jsp頁面中,生成validateLoginForm的函數,負責執行驗證邏輯
3)對需要驗證的表單定義onsubmit事件
4)代碼
< html:form action="manageContract.do" onsubmit="return validateContractForm(this);">
5)用戶在表單上提交後,就會調用
標簽生成的js腳本validateLoginForm函數,執行驗證。如果驗證失敗,就會彈出對話框提示,
不會提交的服務器端。
小結
使用步驟
1)創建擴展ValidatorForm或ValidatorActionForm類的ActionForm,如果使用動態ActionForm,
則不用擴展DynaValidatorForm或DynaValidatorActionForm類的子類,可以直接進行第二步
2)在struts文件中配置form和action元素
3)把validator框架使用的文本信息添加到應用的Resource Bundle中
4)代碼
< message-resources parameter="com.web.ApplicationResources" />
5)在validatorxml文件中為表單配置驗證規則
6)在struts配置文件中配置validatorPlugIn插件
代碼
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" property="pathnames"/>
</plug-in>