要在 Struts 項目中使用 Validator 功能 , 首先需要配置 Struts 項目 , 使其支持 Validator 框架 .Struts 通過一個插件 (Plugin) 來使 Struts 項目支持 Validator . 這個 Plugin Struts 默認提供 , 用戶也可以自己開發自己的 Validator Plugin.Struts 默認提供的 Plugin :

org.apache.struts.validator.ValidatorPlugIn .

?????? 用戶必須在 struts-config.xml 文件中配置這個 Plugin , 才能使 Struts 項目支持 Validator . 配置方法比較簡單 , 通過任何文本編輯器打開 struts-config.xml 文件 , 在這個文件的末尾加上下面的代碼 , 重新啟動 J2EE 服務器就可以實現對 Validator 的支持了 .

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

?? ? <set-property? property="pathnames"

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

</plug-in>

Jbuilder 開發環境中可以通過下面的方法使 Struts 項目支持 Validator 框架 .

1.???????? 在項目管理器中用鼠標右鍵點擊 Web 項目 ( 在我們的項目中是 WebModule ).

2.???????? 選擇菜單的 “Properties…” 菜單項 .

3.???????? 在彈出的對話框的左邊樹型結構中選中 “web” 節點 .

4.???????? 在右邊的 “JSP/Servlet frameworks” 框中勾選 “sturts1.1” 節點以及 “struts” 節點下的 “validation” 子節點 .

5.???????? 點擊 “OK” 按鈕完成配置 .

6.???????? 檢查 struts-config.xml 文件 , 可以看到配置文件里已經加入了 Validator Plugin.

Validator-rules.xml 文件

Validator-rules.xml 文件是校驗器的定義文件 . 指定了每一個校驗器的基本信息和執行校驗的 JavaScript 代碼 .Struts 默認提供了十四個校驗器 , 這些校驗器可以滿足我們平時項目開發中碰到的絕大多數的輸入校驗要求 . 如果這些校驗器不能滿足用戶的校驗要求 , 那么我們也可以開發自己的校驗器 . 我們項目主就實現了一個校驗密碼的一致性的 Validator .

Struts 提供的校驗器包括 Required Validator ,RequiredifValidator, MinLengthValidator , MaxLengthValidator , Mask Validator , Byte Validator , Short Validaotr , Integer Validator , Long Validator , Float Validator , Double Validator , Date Validator , Range Validator , IntRangeValidator , FloatRangeValidator , CrediteCardValidator , Email Validator 等校驗器 . 后面我 將講述一些比較常用的校驗器的使用方法 .

Validator.xml 文件

Validator.xml 文件用來定義用戶需要校驗的每一個 JSP Form 中的每一個字段的校驗規則 , 這個文件是我們在 Struts 項目開發中使用 Validator 框架所需要配置的文件 . 這個文件的根節點是 <form-validator>, 在根節點下的 <formset> 節點的 <form> 子節點就對應了我們在開發 JSP 文件是所定義的 Form 標記 , 也對應這 struts-config.xml 中的 form bean 的定義 . 一個 <form> 節點由多個 <field> 節點組成 , 每個 <field> 節點的結構大概如下 :

?????? <field property="password" depends="required,minlength,twofields">

????????????? <msg name="required" key="test.required"/>

????????????? <msg name="minlength" key="test.minlength"/>

????????????? <msg name="twofields" key="test.twofields"/>

????????????? <arg0 key="test.password" />

????????????? <arg1 name="minlength" key="${var:minlength}" resource="false" />

????????????? <var>

???????????????????? <var-name>minlength</var-name>

???????????????????? <var-value>8</var-value>

????????????? </var>

????????????? <var>

???????????????????? <var-name>secondProperty</var-name>

???????????????????? <var-value>password2</var-value>

????????????? </var>

?????? </field>

?

其中一個 <Field> 對應于一個 Form Bean 的一個 Field,<Field> 標記的 property 屬性說明了這個 Field 對應的 Form Bean Field 名稱 , 這個名稱要跟 struts-config.xml 文件中的 <form-bean> 中定義的名字一致 .depends 屬性說明了這個 Field 依賴于那些校驗器的校驗 , 可以使用多個校驗器 , 各個校驗器之間使用逗號隔開 .<msg> 標記說明了當這個 Field 通不過校驗的時候向用戶提供的錯誤信息 .name 屬性指定了對應的校驗器 ,key 屬性指定了定義在 ApplicationResources.properties 文件中的錯誤信息 .<arg0> <arg1> 是傳遞給校驗器的參數 .<var> 標記定義了參數的名字和參數值 . 上面的這個例子說明了 password 字段由 Required,Minlength,Twofields 校驗器進行校驗 . 指定了這個 Field 不能為空 , 而且最小長度不能小于 8 , 并且必須和同一個 Form 中的另一個名為 password2 的字段相同 . 如果用戶的輸入不能滿足這些要求 , 校驗器將會拋出異常 .

下面開始將怎么在這個配置文件中配置各個校驗器實現 form 中的多中類型 field 進行校驗 .

Required Validator

這個校驗器用來校驗 Form 的輸入數據不能為空 . 如果某一個 Form Field 依賴于這個校驗器 , 那么如果用戶在 Form 中沒有輸入這個 Field 對應的輸入數據時 ,Required 校驗器將會觸發一個 Exception, 這個 Exception 的錯誤信息可以在頁面或者服務端被捕捉到 .

例子 :

?????? <field??? property="test" depends="required">

????????????? <msg name="required" key="test.required"/>

????????????? <arg0 key="test.testField.displayName"/>

?????? </field>

上面的例子說明了 test 字段的校驗規則是不能為空 , ApplicationResources.properties 中的相應的定義信息可能是下面這樣的情況 :

Test.testField.displayName = 測試字段 # 上面在 <arg0> 標記中定義的 key= “test.testField 對應這個信息

Test.required ={0} 不能為空 , 請重新輸入 . # 在上面定義的 <msg> 標記對應這個信息

如果 Validator 校驗到用戶沒有輸入 test 這個字段 , 就會將 test.testField 對應的信息作為 test.required 的參數傳遞給校驗器 , 如果在 JSP 頁面中捕捉了錯誤信息 , 錯誤信息將會是下面的這個形式 :

?????? 測試字段 不能為空 , 請重新輸入

Mask Validator

Mask Validator 校驗用戶輸入的數據是否遵照一定的規則 , 這個規則由開發者在 validator.xml 文件中定義 .

例子 :

<field property="postalCode" depends="mask">

?

<arg0 key="test.postalCode.displayname"/>

?

<arg1 name=”mask” key="${var:mask}" resource="false"

?

<var>

?

<var-name>mask</var-name>

?

<var-value>^0\d*$</var-value>

?

</var>

?

</field>

?

上面的 <arg1> 標記說明了這個校驗的第二個參數是定義在下面的 <var> 標記的名為 mask 的值 .<var-value> 的值說明了這個字段必須是以數字 0 開頭 , 以任意數字字符結尾的一個串 .

Range Validator

這個校驗器校驗字段是否在一個數字范圍內 .

例子 :

?????? <field property="age" depends="range">

????????????? <msg name="range" key="test.rang"/>

????????????? <arg0 key="test.age"/>

????????????? <arg1 name="range" key="${var:min}" resource="false"/>

????????????? <arg2 name="range" key="${var:max}" resource="false"/>

????????????? <var>

???????????????????? <var-name>min</var-name>

???????????????????? <var-value>1</var-value>

????????????? </var>

????????????? <var>

???????????????????? <var-name>max</var-name>

???????????????????? <var-value>100</var-value>

????????????? </var>

?????? </field>

Range Validator 需要三個參數 (arg), 第一個參數 arg0 是指定這個字段的名字 , 第二個和第三個參數指定范圍的最大和最小值 , 分別的名稱是 max min.

Maxlength Validator

Maxlength 校驗器校驗一個字符串的最大長度 , 它需要兩個參數 ,arg0 說明字段的名稱 ,arg1 說明最大長度 .

例子 :

?????? <field property="password" depends="maxlength">

????????????? <msg name="maxlength" key="test.minlength"/>

????????????? <arg0 key="test.password" />

????????????? <arg1 name="maxlength" key="${var:maxlength}" resource="false" />

????????????? <var>

???????????????????? <var-name>maxlength</var-name>

???????????????????? <var-value>8</var-value>

????????????? </var>

?????? </field>

Minlength Validator

這個校驗器類似于上面的 Maxlength Validator, 參數一樣 , 校驗規則也一樣 , 只是作為參數的變量名字為 minlength

?????? <field property="password" depends="minlength">

????????????? <msg name="minlength" key="test.minlength"/>

????????????? <arg0 key="test.password" />

????????????? <arg1 name="minlength" key="${var:minlength}" resource="false" />

????????????? <var>

???????????????????? <var-name>minlength</var-name>

???????????????????? <var-value>8</var-value>

????????????? </var>

?????? </field>

Email Validator

這個校驗器校驗電子郵件字段 , 當用戶輸入的電子郵件地址不合法的時候 , 校驗器拋出異常 .

例子 :

?????? <field??? property="email" depends="required,email">

????????????? <msg name="required" key="test.required"/>

????????????? <msg name="email" key="test.error.email"/>

????????????? <arg0 key="test.email"/>

?????? </field>

Form Bean 的編寫

要使用 Struts Validator 框架進行自動校驗的 Form Bean 不能繼承自普通的 ActionForm , 必須繼承自 ValidatorForm 或者 ValidatorActionForm . 我們項目組都是繼承自 ValidatorForm .

ValidatorForm 根據 struts-config.xml 文件中的 action name 屬性為當前 form 的調用相應的驗證器,因此在 validation.xml 中的 <form-bean> 元素的名稱屬性 (name) 應該與 <action> name 屬性值相匹配。

ValidatorActionForm 使用 struts-config.xml action path 屬性,所以 path 屬性的值相應的應該與 validation.xml 中的 Form name 屬性匹配。

Struts- config.xml 文件的配置

要使用 Validator 框架的自動校驗機制 , 還必須在 Struts-config.xml 文件中作相應的配置 . 除了前面已經說明了的配置 Validator Plugin 意外 , 還需要對需要校驗的 form action 進行配置 . 主要有兩個地方需要配置 , 一個是 <action> input 屬性 , 一個是 <action> validate 屬性 .input 屬性必須指定包含校驗 Form jsp 頁面的路徑 , 以便 Struts 的校驗框架校驗失敗的時候可以重新導向到原來的頁面讓用戶重新輸入 .validator 屬性是一個 boolean 類型的屬性 , 必須設置為 true struts 才會啟動自動校驗機制 .

JSP 頁面捕捉錯誤信息

Validator 的校驗機制可以定義在服務端進行校驗或者通過 Javascript 在瀏覽器端進行校驗 . 這兩種不同的方式在 JSP 頁面編寫的時候有很大的區別 .

捕捉服務端的錯誤信息

要捕捉服務端校驗的錯誤信息比較簡單 . 只需要在 JSP 頁面中嵌入一下的代碼就可以在頁面中顯示錯誤信息 , 這些錯誤信息也可以自定義顯示風格 .

?

<logic:messagesPresent>

?? <bean:message key="test.error.descript"/>

?? <html:messages id="error">

????? <li><bean:write name="error"/></li>

?? </html:messages>

</logic:messagesPresent>

<bean:message key=test.error.descript/> 通過 ApplicationResources.properties 文件中定義的信息向用戶報告錯誤發生的原因和簡單說明 .

<html:messages id=”error”>

?????? <li><bean:write name=”error” /></li>

</html:messages>

則是顯示具體的由 Validator 框架產生的錯誤信息 .

捕捉 JavaScript 的錯誤信息

要捕捉 JavaScript 產生的錯誤信息首先要使 JSP 頁面產生 Validator 生成的 Javascript 代碼 , 并在用戶點擊提交按鈕的時候讓提交按鈕觸發相應的校驗函數 . 實現方法如下 :

首先要讓 JSP 觸發校驗函數 , 使用這樣的 HTML 代碼 :

<html:form action="/testAction.do" onsubmit="return validateTestForm(this);">

其中 action 指定這個 form 對應的 action, 這個跟普通的 form 沒有區別 ,onsubmit 屬性就指定了校驗函數 , 它的規則是 : return + 空格 + validator+ ValidatorForm 的名字 + (this)

注意這樣的組合規則是不能變的 , 否則會導致頁面錯誤并不能實現校驗功能 . 還要注意 ValidatorForm 的名字的第一個字母一定要大寫 , 不管在 Struts-congfig.xml 文件中的定義是否大寫 , 這里都要把它作為大寫字母 .

然后還要在 JSP 頁面中產生可以實現校驗的 JavaScript 代碼 , 這個步驟也很簡單 , 只需要在 JSP 頁面的末尾加上下面一句 :

<html:javascriptformName="testForm" staticJavascript="true"/>

其中 formName 的名字要跟 struts-config.xml 文件中配置的一致 , 大小寫也要一致 .staticJavascript true 的時候 Validator 將使用 JavaScript 代碼進行校驗 ( 這些 Javascript 代碼由 Struts validator 框架自動產生 , 我們只需要配置 validator.xml 文件 ),staticJavascript false 的時候 validator 將使用服務端代碼進行校驗 , 這些服務端的校驗代碼也不需要我們編寫 .?

?