驗(yàn)證框架
驗(yàn)證框架
WebWork提供了在Action執(zhí)行之前,對(duì)輸入數(shù)據(jù)的驗(yàn)證功能,它使用了其核心XWork的驗(yàn)證框架。提供了如下功能:
1、 可配置的驗(yàn)證文件。它的驗(yàn)證文件是一個(gè)獨(dú)立的XML配置文件,對(duì)驗(yàn)證的添加、修改只需更改配置文件,無(wú)需編譯任何的Class。
2、 驗(yàn)證文件和被驗(yàn)證的對(duì)象完全解藕。驗(yàn)證對(duì)象是普通的JavaBean就可以了(可以是FormBean、域?qū)ο蟮龋鼈儾恍鑼?shí)現(xiàn)任何額外的方法或繼承額外的類(lèi)。
3、 多種不同的驗(yàn)證方式。因?yàn)樗?yàn)證功能是可以繼承的,所以可以用多種不同的方式指定驗(yàn)證文件,比如:通過(guò)父類(lèi)的Action、通過(guò)Action、通過(guò)Action的方法、通過(guò)Action所使用的對(duì)象,等等。
4、 強(qiáng)大的表達(dá)式驗(yàn)證。它使用了OGNL的表達(dá)式語(yǔ)言,提供強(qiáng)大的表達(dá)式驗(yàn)證功能。
5、 同時(shí)支持服務(wù)器端和客戶(hù)端驗(yàn)證。
為用戶(hù)注冊(cè)添加驗(yàn)證功能
下面我們來(lái)看看如何為用戶(hù)注冊(cè)添加驗(yàn)證功能:
1、 注冊(cè)我們的驗(yàn)證類(lèi)型
WebWork為不同的驗(yàn)證要求提供不同的驗(yàn)證類(lèi)型。一個(gè)驗(yàn)證類(lèi)型,一般是有一個(gè)類(lèi)來(lái)提供。這個(gè)類(lèi)必須實(shí)現(xiàn)接口:com.opensymphony.xwork.validator.Validator,但我們?cè)趯?xiě)自己的驗(yàn)證類(lèi)型時(shí),無(wú)需直接實(shí)現(xiàn)Validator接口,它有抽象類(lèi)可供直接使用如ValidatorSupport、FieldValidatorSupport等。
驗(yàn)證類(lèi)型在使用之前,必須要在ValidatorFactory(com.opensymphony.xwork.validator. ValidatorFactory)中注冊(cè)。可以有二種方法實(shí)現(xiàn)驗(yàn)證類(lèi)型的注冊(cè)。一、寫(xiě)程序代碼進(jìn)行注冊(cè),它使用ValidatorFactory類(lèi)的靜態(tài)方法:registerValidator(String name, String className)。二、使用配置文件validators.xml進(jìn)行注冊(cè),要求把文件validators.xml放到ClassPath的跟目錄中(/WEB-INF/classes)。但在實(shí)際開(kāi)發(fā)中,一般都使用第二中注冊(cè)方法。我們的驗(yàn)證類(lèi)型注冊(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)證類(lèi)型的配置文件非常簡(jiǎn)單。它使用標(biāo)簽<validator>提供名-值對(duì)的形式注冊(cè)。這樣我們的驗(yàn)證文件就可以直接引用它的名字。
2、 開(kāi)啟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通過(guò)別名的方式指定驗(yàn)證文件,它的命名格式為:ActionName-aliasname-validation.xml。“ActionName ”是我們Action的類(lèi)名;“aliasname”是我們?cè)谂渲梦募?/span>xwork.xml)中定義這個(gè)Action所用到的名稱(chēng)。這樣,同一個(gè)Action類(lèi),在配置文件中的不同定義就可以對(duì)應(yīng)不同的驗(yàn)證文件。驗(yàn)證框架也會(huì)根據(jù)Action的繼承結(jié)構(gòu)去查找Action的父類(lèi)驗(yàn)證文件,如果找到它會(huì)去執(zhí)行這個(gè)父類(lèi)的驗(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>
說(shuō)明:
1)、<field>標(biāo)簽代表一個(gè)字段,它的屬性“name”和頁(yè)面輸入框的“name”屬性必需完全一致,其實(shí)它也就是我們的表達(dá)式語(yǔ)言。
2)、<field-validator>標(biāo)簽定義我們的驗(yàn)證規(guī)則,type屬性的值就是就是我們前面定義的驗(yàn)證類(lèi)型。
3)、驗(yàn)證文件中,字段的數(shù)據(jù)是通過(guò)表達(dá)式語(yǔ)言從我們的值堆棧(OgnlValueStack)中取得,一般是Action或Model對(duì)象。例如:我們的字段“user.age”,它會(huì)通過(guò)Action的getUser().getAge()來(lái)取得用戶(hù)輸入的年齡,再來(lái)根據(jù)驗(yàn)證的類(lèi)型“int”和最大值最小值的參數(shù)來(lái)判斷輸入的數(shù)據(jù)是否能通過(guò)驗(yàn)證。
4)、不管驗(yàn)證是否通過(guò),我們的Action都會(huì)執(zhí)行,但如果驗(yàn)證沒(méi)有通過(guò),它不會(huì)調(diào)用Action的execute()方法。
4、 顯示Action的驗(yàn)證錯(cuò)誤信息
如果用戶(hù)輸入的數(shù)據(jù)驗(yàn)證沒(méi)有通過(guò),我們需重新返回輸入頁(yè)面,并給出錯(cuò)誤信息提示。攔截器棧“validationWorkflowStack”為我們實(shí)現(xiàn)了這個(gè)功能。它首先驗(yàn)證用戶(hù)輸入的數(shù)據(jù),如果驗(yàn)證沒(méi)有通過(guò)將不執(zhí)行我們Action的execute()方法,而是將請(qǐng)求重新返回到輸入頁(yè)面。
我們的xwork.xml配置文件如下:
<action name="registerSupport" class="com.test.RegisterActionSupport" >
<result name="success" type="dispatcher">
<param name="location">/registerResult.vm</param>
</result>
<result name="input" type="dispatcher">
<param name="location">/registerSupport.vm</param>
</result>
<interceptor-ref name="validationWorkflowStack"/>
</action>
通過(guò)接口ValidationAware,我們可以獲得類(lèi)級(jí)別或字段級(jí)別的驗(yàn)證錯(cuò)誤信息,這個(gè)錯(cuò)誤信息也就是我們驗(yàn)證文件中<message>標(biāo)簽里的數(shù)據(jù)。ActionSupport類(lèi)已實(shí)現(xiàn)了此接口,這樣在應(yīng)用中我們的Action只要繼承ActionSupport類(lèi)就可以了。RegisterActionSupport.java代碼如下:
package com.test;
import com.opensymphony.xwork.ActionSupport;
public class RegisterActionSupport extends ActionSupport {
private User user= new User();
private String verifyPassword;
public User getUser(){
return this.user;
}
public String execute(){
//在這里調(diào)用用戶(hù)注冊(cè)的業(yè)務(wù)邏輯,比如:將注冊(cè)信息存儲(chǔ)到數(shù)據(jù)庫(kù)
return SUCCESS;
}
public String getVerifyPassword(){
return this.verifyPassword;
}
public void setVerifyPassword(String verPassword){
this.verifyPassword = verPassword;
}
}
我們WebWork的UI標(biāo)簽庫(kù)直接提供了驗(yàn)證錯(cuò)誤信息顯示功能。如果字段級(jí)別的驗(yàn)證沒(méi)有通過(guò),它會(huì)在輸入框上方顯示驗(yàn)證文件定義的錯(cuò)誤提示信息。我們將用戶(hù)輸入的頁(yè)面更改如下:
registerSupport.vm
<html>
<head>
<title>WebWork Register - Example 4</title>
<meta name="help-path" content="/help/help5.html"/>
</head>
<body>
<p>Custom Component Example:</p>
<table border=0 width=97%>
<tr><td align="left">
#bodytag (form "name='test'" "action='/registerSupport.action'" "method='POST'")
#tag(textfield "label='Username'" "name='user.username'" "required='true'")
#tag(textfield "label='Password'" "name='user.password'" "required='true'")
#tag(textfield "label='VerifyPassword'" "name='verifyPassword'" "required='true'")
#tag(textfield "label='Email'" "name='user.email'" "required='true'")
#tag(textfield "label='Age'" "name='user.age'" "required='true'")
#tag(submit value="'Submit'")
#end
</td></tr>
</table>
<br/>
</body>
</html>
我們上面的相應(yīng)結(jié)果文件registerResult.vm為:
<html>
<head><title>WebWork Register - Example 4 - Register result</title></head>
<body>
<table border=0 width=97%>
<tr>
<td align="left">
Congratulation,your register success!<p>
Username:$!user.username<br>
Password:$!user.password<br>
Email:$!user.email<br>
Age:$!user.age<br>
</td>
</tr>
</table>
</body>
</html>
我們上面的例子使用的是服務(wù)器端驗(yàn)證。
posted on 2007-04-12 17:29 朱巖 閱讀(279) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): webwork文章