驗證框架
WebWork
提供了在
Action
執行之前,對輸入數據的驗證功能,它使用了其核心
XWork
的驗證框架。提供了如下功能:
1、
可配置的驗證文件。它的驗證文件是一個獨立的
XML
配置文件,對驗證的添加、修改只需更改配置文件,無需編譯任何的
Class
。
2、
驗證文件和被驗證的對象完全解藕。驗證對象是普通的
JavaBean
就可以了(可以是
FormBean
、域對象等),它們不需實現任何額外的方法或繼承額外的類。
3、
多種不同的驗證方式。因為它驗證功能是可以繼承的,所以可以用多種不同的方式指定驗證文件,比如:通過父類的
Action
、通過
Action
、通過
Action
的方法、通過
Action
所使用的對象,等等。
4、
強大的表達式驗證。它使用了
OGNL
的表達式語言,提供強大的表達式驗證功能。
5、
同時支持服務器端和客戶端驗證。
下面我們來看看如何為用戶注冊添加驗證功能:
1、
注冊我們的驗證類型
WebWork
為不同的驗證要求提供不同的驗證類型。一個驗證類型,一般是有一個類來提供。這個類必須實現接口:
com.opensymphony.xwork.validator.Validator
,但我們在寫自己的驗證類型時,無需直接實現
Validator
接口,它有抽象類可供直接使用如
ValidatorSupport
、
FieldValidatorSupport
等。
驗證類型在使用之前,必須要在
ValidatorFactory
(
com.opensymphony.xwork.validator
. ValidatorFactory
)中
注冊。可以有二種方法實現驗證類型的注冊。一、寫程序代碼進行注冊,它使用
ValidatorFactory
類的靜態方法:
registerValidator(String name, String className)
。
二、使用配置文件
validators.xml
進行注冊,要求把文件
validators.xml
放到
ClassPath
的跟目錄中(
/WEB-INF/classes
)。但在實際開發中,一般都使用第二中注冊方法。我們的驗證類型注冊如下:
<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>
注冊驗證類型的配置文件非常簡單。它使用標簽
<validator
>
提供名-值對的形式注冊。這樣我們的驗證文件就可以直接引用它的名字。
2、
開啟
Action
的驗證功能
如果
Action
要使用驗證框架的驗證功能,它必須在配置文件中指定攔截器“
validation
”,它的定義如下:
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
。
我們的驗證文件必須以
ActionName-validation.xml
格式命名,它必須被放置到與這個
Action
相同的包中。你也可以為這個
Action
通過別名的方式指定驗證文件,它的命名格式為:
ActionName-aliasname-validation.xml
。“
ActionName
”是我們
Action
的類名;“
aliasname
”是我們在配置文件(
xwork.xml
)中定義這個
Action
所用到的名稱。這樣,同一個
Action
類,在配置文件中的不同定義就可以對應不同的驗證文件。驗證框架也會根據
Action
的繼承結構去查找
Action
的父類驗證文件,如果找到它會去執行這個父類的驗證。
3、
實現我們的驗證文件:
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
>
標簽代表一個字段,它的屬性“
name
”和頁面輸入框的“
name
”屬性必需完全一致,其實它也就是我們的表達式語言。
2
)、
<field-validator
>
標簽定義我們的驗證規則,
type
屬性的值就是就是我們前面定義的驗證類型。
3
)、驗證文件中,字段的數據是通過表達式語言從我們的值堆棧(
OgnlValueStack
)中取得,一般是
Action
或
Model
對象。例如:我們的字段“
user.age
”,它會通過
Action
的
getUser().getAge()
來取得用戶輸入的年齡,再來根據驗證的類型“
int
”和最大值最小值的參數來判斷輸入的數據是否能通過驗證。
4
)、不管驗證是否通過,我們的
Action
都會執行,但如果驗證沒有通過,它不會調用
Action
的
execute()
方法。
4、
顯示
Action
的驗證錯誤信息
如果用戶輸入的數據驗證沒有通過,我們需重新返回輸入頁面,并給出錯誤信息提示。攔截器棧“
validationWorkflowStack
”為我們實現了這個功能。它首先驗證用戶輸入的數據,如果驗證沒有通過將不執行我們
Action
的
execute()
方法,而是將請求重新返回到輸入頁面。
我們的
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
,
我們可以獲得類級別或字段級別的驗證錯誤信息,這個錯誤信息也就是我們驗證文件中
<message>
標簽里的數據。
ActionSupport
類已實現了此接口,這樣在應用中我們的
Action
只要繼承
ActionSupport
類就可以了。
RegisterActionSupport
.java
代碼如下:
package
example.register;
import
com.opensymphony.xwork.ActionSupport;
public
class RegisterActionSupport extends ActionSupport {
private User user= new User();
private String verifyPassword;
public User getUser(){
returnthis.user;
}
public String execute(){
//
在這里調用用戶注冊的業務邏輯,比如:將注冊信息存儲到數據庫
return SUCCESS;
}
public String getVerifyPassword(){
returnthis.verifyPassword;
}
publicvoid setVerifyPassword(String verPassword){
this.verifyPassword = verPassword;
}
}
我們
WebWork
的
UI
標簽庫直接提供了驗證錯誤信息顯示功能。如果字段級別的驗證沒有通過,它會在輸入框上方顯示驗證文件定義的錯誤提示信息。我們將用戶輸入的頁面更改如下:
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>
我們上面的例子使用的是服務器端驗證。
WebWork
也為我們提供了方便的客戶端驗證。它將驗證自動生成
JavaScript
腳本。如果要使用客戶端驗證只需改變相應的驗證類型就可以了(輸入頁面的表單必需使用
<ww:form>
標簽,并設置屬性“
validate="true"
”)。具體的驗證類型可以在
WebWork
的包
com.opensymphony.webwork.validators
中找到。
posted on 2006-12-14 19:13
周銳 閱讀(274)
評論(0) 編輯 收藏 所屬分類:
Webwork