在struts中使用Validator框架
Validator驗證框架
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>
<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>
<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配置文件的<action>元素的name屬------>validator.xml文件<form>元素的name屬性
ValidatorActionForm
Strust配置文件的<action>元素的path屬------>validator.xml文件<form>元素的name屬性
Validator框架提供這兩個類目的在於可以更加精確的控制執行驗證的條件。
例如
loginForm表單對應兩個驗證規則A、B。對應login、cancel兩個動作。
如果對於這兩個動作都要執行規則A、B。則可以擴展一個ValidatorFom類loginForm
然後配置
- <formset>
- <form name=”loginForm”>
- 驗證規則A
- 驗證規則B
- .</form>
- ….
- </formset>
<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>
<formset>
<form name=”login”>
驗證規則A
.</form>
<form name=”cancel”>
驗證規則B
.</form>
</formset>
而DynaValidatorForm和DynaValidatorActionForm,區別和ValidatorFrom和ValidatorActionForm的區別一樣
5.在validator框架中使用JavaScript
默認情況下,validator框架在服務器端執行表單驗證。也可以在客戶端驗證。
如果在客戶端驗證,需要使用struts的<html:javascript>標籤,他能在jsp頁面中生成用於客戶端驗證的JavaScript的腳本。
1) 在validator-rules.xml文件的<validator>元素中配置<javascript>元素
默認struts框架的validator-rules.xml文件已經包含了javascript子元素。
也可以將這些javascript集中放到一個validator.js的文件中,也頁面中引入
- <script language="Javascript1.1" src="js/validator.js"></script>
<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);">
<html:form action="manageContract.do" onsubmit="return validateContractForm(this);">
5) 用戶在表單上提交後,就會調用<html:javascript>
標籤生成的js腳本validateLoginForm函數,執行驗證。如果驗證失敗,就會彈出對話框提示,不會提交的服務器端。
小結
使用步驟
1)
創建擴展ValidatorForm或ValidatorActionForm類的ActionForm,如果使用動態ActionForm,則不用擴展
DynaValidatorForm或DynaValidatorActionForm類的子類,可以直接進行第二步
2) 在struts文件中配置form和action元素
3) 把validator框架使用的文本信息添加到應用的Resource Bundle中
4)
- <message-resources parameter="com.web.ApplicationResources" />
<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>