要在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 ,Requiredif Validator, MinLength Validator , MaxLength Validator , Mask Validator , Byte Validator , Short Validaotr , Integer Validator , Long Validator , Float Validator , Double Validator , Date Validator , Range Validator , IntRange Validator , FloatRange Validator , CrediteCard Validator , 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>^0d*$</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:javascript formName="testForm" staticJavascript="true"/>
其中formName的名字要跟struts-config.xml文件中配置的一致,大小寫也要一致.staticJavascript為true的時候Validator將使用JavaScript代碼進行校驗(這些Javascript代碼由Struts 的validator框架自動產生,我們只需要配置validator.xml文件),staticJavascript為false的時候validator將使用服務端代碼進行校驗,這些服務端的校驗代碼也不需要我們編寫.