WebWork教程-validator
驗(yàn)證框架
WebWork
提供了在
Action
執(zhí)行之前,對(duì)輸入數(shù)據(jù)的驗(yàn)證功能,它使用了其核心
XWork
的驗(yàn)證框架。提供了如下功能:
1、??
可配置的驗(yàn)證文件。它的驗(yàn)證文件是一個(gè)獨(dú)立的
XML
配置文件,對(duì)驗(yàn)證的添加、修改只需更改配置文件,無需編譯任何的
Class
。
2、??
驗(yàn)證文件和被驗(yàn)證的對(duì)象完全解藕。驗(yàn)證對(duì)象是普通的
JavaBean
就可以了(可以是
FormBean
、域?qū)ο蟮龋鼈儾恍鑼?shí)現(xiàn)任何額外的方法或繼承額外的類。
3、??
多種不同的驗(yàn)證方式。因?yàn)樗?yàn)證功能是可以繼承的,所以可以用多種不同的方式指定驗(yàn)證文件,比如:通過父類的
Action
、通過
Action
、通過
Action
的方法、通過
Action
所使用的對(duì)象,等等。
4、??
強(qiáng)大的表達(dá)式驗(yàn)證。它使用了
OGNL
的表達(dá)式語言,提供強(qiáng)大的表達(dá)式驗(yàn)證功能。
5、??
同時(shí)支持服務(wù)器端和客戶端驗(yàn)證。
下面我們來看看如何為用戶注冊(cè)添加驗(yàn)證功能:
1、??
注冊(cè)我們的驗(yàn)證類型
WebWork
為不同的驗(yàn)證要求提供不同的驗(yàn)證類型。一個(gè)驗(yàn)證類型,一般是有一個(gè)類來提供。這個(gè)類必須實(shí)現(xiàn)接口:
com.opensymphony.xwork.validator.Validator
,但我們?cè)趯懽约旱尿?yàn)證類型時(shí),無需直接實(shí)現(xiàn)
Validator
接口,它有抽象類可供直接使用如
ValidatorSupport
、
FieldValidatorSupport
等。
驗(yàn)證類型在使用之前,必須要在
ValidatorFactory
(
com.opensymphony.xwork.validator
. ValidatorFactory
)中
注冊(cè)。可以有二種方法實(shí)現(xiàn)驗(yàn)證類型的注冊(cè)。一、寫程序代碼進(jìn)行注冊(cè),它使用
ValidatorFactory
類的靜態(tài)方法:
registerValidator(String name, String className)
。
二、使用配置文件
validators.xml
進(jìn)行注冊(cè),要求把文件
validators.xml
放到
ClassPath
的跟目錄中(
/WEB-INF/classes
)。但在實(shí)際開發(fā)中,一般都使用第二中注冊(cè)方法。我們的驗(yàn)證類型注冊(cè)如下:
<validators>
??? <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
?? ?<validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
??? <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
??? <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
??? <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
??? <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
??? <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
??? <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
??? <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
??? <validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
??? <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
</validators>
注冊(cè)驗(yàn)證類型的配置文件非常簡(jiǎn)單。它使用標(biāo)簽
<validator
>
提供名-值對(duì)的形式注冊(cè)。這樣我們的驗(yàn)證文件就可以直接引用它的名字。
2、??
開啟
Action
的驗(yàn)證功能
?
如果
Action
要使用驗(yàn)證框架的驗(yàn)證功能,它必須在配置文件中指定攔截器“
validation
”,它的定義如下:
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
。
我們的驗(yàn)證文件必須以
ActionName-validation.xml
格式命名,它必須被放置到與這個(gè)
Action
相同的包中。你也可以為這個(gè)
Action
通過別名的方式指定驗(yàn)證文件,它的命名格式為:
ActionName-aliasname-validation.xml
。“
ActionName
”是我們
Action
的類名;“
aliasname
”是我們?cè)谂渲梦募?/span>
xwork.xml
)中定義這個(gè)
Action
所用到的名稱。這樣,同一個(gè)
Action
類,在配置文件中的不同定義就可以對(duì)應(yīng)不同的驗(yàn)證文件。驗(yàn)證框架也會(huì)根據(jù)
Action
的繼承結(jié)構(gòu)去查找
Action
的父類驗(yàn)證文件,如果找到它會(huì)去執(zhí)行這個(gè)父類的驗(yàn)證。
?
3、??
實(shí)現(xiàn)我們的驗(yàn)證文件:
RegisterActionSupport-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
??? <field name="user.username">
??? <field-validator type="requiredstring">
??????????? <message>You must enter a value for username.</message>
??????? </field-validator>
??? </field>
??? <field name="user.password">
??? <field-validator type="requiredstring">
??????????? <message>You must enter a value for password.</message>
??????? </field-validator>
??????? <field-validator type="fieldexpression">
??????????? <param name="expression">user.password == verifyPassword</param>
??????????? <message>Passwords don't match.</message>
??????? </field-validator>
??? </field>
??? <field name="user.email">
??? <field-validator type="email">
??????????? <message>You must enter a valid email.</message>
??????? </field-validator>
??? </field>
??? <field name="user.age">
??? <field-validator type="int">
??????????? <param name="min">6</param>
??????????? <param name="max">100</param>
??????????? <message>Age must be between ${min} and ${max}, current value is ${user.age}.</message>
?????? ?</field-validator>
??? </field>
</validators>
說明:
1
)、
<field
>
標(biāo)簽代表一個(gè)字段,它的屬性“
name
”和頁面輸入框的“
name
”屬性必需完全一致,其實(shí)它也就是我們的表達(dá)式語言。
2
)、
<field-validator
>
標(biāo)簽定義我們的驗(yàn)證規(guī)則,
type
屬性的值就是就是我們前面定義的驗(yàn)證類型。
3
)、驗(yàn)證文件中,字段的數(shù)據(jù)是通過表達(dá)式語言從我們的值堆棧(
OgnlValueStack
)中取得,一般是
Action
或
Model
對(duì)象。例如:我們的字段“
user.age
”,它會(huì)通過
Action
的
getUser().getAge()
來取得用戶輸入的年齡,再來根據(jù)驗(yàn)證的類型“
int
”和最大值最小值的參數(shù)來判斷輸入的數(shù)據(jù)是否能通過驗(yàn)證。
4
)、不管驗(yàn)證是否通過,我們的
Action
都會(huì)執(zhí)行,但如果驗(yàn)證沒有通過,它不會(huì)調(diào)用
Action
的
execute()
方法。
?
4、??
顯示
Action
的驗(yàn)證錯(cuò)誤信息
如果用戶輸入的數(shù)據(jù)驗(yàn)證沒有通過,我們需重新返回輸入頁面,并給出錯(cuò)誤信息提示。攔截器棧“
validationWorkflowStack
”為我們實(shí)現(xiàn)了這個(gè)功能。它首先驗(yàn)證用戶輸入的數(shù)據(jù),如果驗(yàn)證沒有通過將不執(zhí)行我們
Action
的
execute()
方法,而是將請(qǐng)求重新返回到輸入頁面。
我們的
xwork.xml
配置文件如下:
<action name="registerSupport" class="example.register.RegisterActionSupport">
??????????? <result name="success" type="dispatcher">
??????????????? <param name="location">/register-result.jsp</param>
??????????? </result>
??????????? <result name="input" type="dispatcher">
??????????????? <param name="location">/registerSupport.jsp</param>
??????????? </result>
??????????? <interceptor-ref name="validationWorkflowStack"/>
??????? </action>
?
通過接口
ValidationAware
,
我們可以獲得類級(jí)別或字段級(jí)別的驗(yàn)證錯(cuò)誤信息,這個(gè)錯(cuò)誤信息也就是我們驗(yàn)證文件中
<message>
標(biāo)簽里的數(shù)據(jù)。
ActionSupport
類已實(shí)現(xiàn)了此接口,這樣在應(yīng)用中我們的
Action
只要繼承
ActionSupport
類就可以了。
RegisterActionSupport
.java
代碼如下:
package
example.register;
?
import
com.opensymphony.xwork.ActionSupport;
?
?
??? private User user= new User();
??? private String verifyPassword;
???
??? public User getUser(){
??????? returnthis.user;
??? }
???
??? public String execute(){
??????? //
在這里調(diào)用用戶注冊(cè)的業(yè)務(wù)邏輯,比如:將注冊(cè)信息存儲(chǔ)到數(shù)據(jù)庫(kù)
??????? return SUCCESS;
??? }
?
??? public String getVerifyPassword(){
??????? returnthis.verifyPassword;
??? }
???
??? publicvoid setVerifyPassword(String verPassword){
??????? this.verifyPassword = verPassword;
??? }
}
我們
WebWork
的
UI
標(biāo)簽庫(kù)直接提供了驗(yàn)證錯(cuò)誤信息顯示功能。如果字段級(jí)別的驗(yàn)證沒有通過,它會(huì)在輸入框上方顯示驗(yàn)證文件定義的錯(cuò)誤提示信息。我們將用戶輸入的頁面更改如下:
registerSupport.jsp
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head><title>Register Example</title></head>
<body>
<table border=0 width=97%>
<tr><td align="left">
??? <ww:form name="'test'" action="'/example/registerSupport.action'" method="'POST'">
??????????? <ww:textfield label="'Username'" name="'user.username'" required="true"/>
??????????? <ww:textfield label="'Password'" name="'user.password'" required="true"/>
??????????? <ww:textfield label="'VerifyPassword'" name="'verifyPassword'" required="true"/>
?????????? ?<ww:textfield label="'Email'" name="'user.email'" required="true"/>
??????????? <ww:textfield label="'Age'" name="'user.age'" required="true"/>
??????????? <ww:submit value="'Submit'"/>
???????? </ww:form>
</td></tr>
</table>
</body>
</html>
我們上面的例子使用的是服務(wù)器端驗(yàn)證。
WebWork
也為我們提供了方便的客戶端驗(yàn)證。它將驗(yàn)證自動(dòng)生成
JavaScript
腳本。如果要使用客戶端驗(yàn)證只需改變相應(yīng)的驗(yàn)證類型就可以了(輸入頁面的表單必需使用
<ww:form>
標(biāo)簽,并設(shè)置屬性“
validate="true"
”)。具體的驗(yàn)證類型可以在
WebWork
的包
com.opensymphony.webwork.validators
中找到。
posted on 2006-09-01 13:40 Binary 閱讀(681) 評(píng)論(0) 編輯 收藏 所屬分類: Webwork