WebWork教程-驗證框架

WebWork教程-驗證框架
驗證框架
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接口,它有抽象類可供直接使用如ValidatorSupportFieldValidatorSupport等。
驗證類型在使用之前,必須要在ValidatorFactorycom.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)中取得,一般是ActionModel對象。例如:我們的字段“user.age”,它會通過ActiongetUser().getAge()來取得用戶輸入的年齡,再來根據驗證的類型“int”和最大值最小值的參數來判斷輸入的數據是否能通過驗證。
4)、不管驗證是否通過,我們的Action都會執行,但如果驗證沒有通過,它不會調用Actionexecute()方法。
 
4、   顯示Action的驗證錯誤信息
如果用戶輸入的數據驗證沒有通過,我們需重新返回輸入頁面,並給出錯誤信息提示。攔截器棧“validationWorkflowStack”爲我們實現了這個功能。它首先驗證用戶輸入的數據,如果驗證沒有通過將不執行我們Actionexecute()方法,而是將請求重新返回到輸入頁面。
我們的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(){
        return this.user;
    }
    
    public String execute(){
        //在這裏調用用戶註冊的業務邏輯,比如:將註冊信息存儲到數據庫
        return SUCCESS;
    }
  
    public String getVerifyPassword(){
        return this.verifyPassword;
    }
    
    public void setVerifyPassword(String verPassword){
        this.verifyPassword = verPassword;
    }
}
我們WebWorkUI標籤庫直接提供了驗證錯誤信息顯示功能。如果字段級別的驗證沒有通過,它會在輸入框上方顯示驗證文件定義的錯誤提示信息。我們將用戶輸入的頁面更改如下:
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中找到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章