要在
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
進行校驗
.
這個校驗器用來校驗
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
開頭
,
以任意數字字符結尾的一個串
.
這個校驗器校驗字段是否在一個數字范圍內
.
例子
:
?????? <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>
|
這個校驗器校驗電子郵件字段
,
當用戶輸入的電子郵件地址不合法的時候
,
校驗器拋出異常
.
例子
:
?????? <field??? property="email" depends="required,email">
????????????? <msg name="required" key="test.required"/>
????????????? <msg name="email" key="test.error.email"/>
????????????? <arg0 key="test.email"/>
?????? </field>
|
要使用
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
才會啟動自動校驗機制
.
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
產生的錯誤信息首先要使
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
將使用服務端代碼進行校驗
,
這些服務端的校驗代碼也不需要我們編寫
.?
?