struts2 校驗框架總結

struts2 校驗框架總結


校驗類型和配置方法說明 
從Struts2 校驗框架在驗證的場所上可以分爲:客戶端校驗和服務端校驗 
    客戶端校驗是指,在HTML畫面上自動生成JavaScript校驗代碼,在用戶提交到服務器之前在客戶端瀏覽器中進行校驗默認位客戶端校驗 
    服務端校驗是指,在數據提交到服務器上之後,在Action處理之前,對客戶但提交的數據進行校驗 

從Struts2校驗框架的配置上可以分爲:Java Annotation配置和XML配置文件配置 
    Java Annotation配置是指,使用Java Annotation語法,在Java源代碼上標記需要校驗的內容,和校驗的方式 
    XML配置文件配置是指,使用XML配置文件配置需要校驗的內容和校驗方式 

5.2節:Validator與Validation 
Validation指校驗,Validator指誰來校驗 
在Struts2框架中Validator必須在系統中註冊,如果沒有註冊,系統使用默認的註冊,這些validator註冊文件在xwork的jar文件中,內容如下: 
<validators> 

    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> 

    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> 

    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> 

    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> 

    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> 

    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> 

    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> 

    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> 

    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> 

    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> 

    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> 

    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> 

    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/> 

</validators> 




自己需要註冊自己的Validator時,可以使用上述相似的內容,這個文件需要放在WEB-INF/classes目錄下,文件的名字叫validators.xml 

一旦自己定義了validators.xml文件,系統就不會在加載默認的Validators文件,所以在Validators.xml中需要拷貝默認的內容 

5.3節:Validation與Intercepter 
Validation使用名字叫做validator的Intercepter,在默認情況下,struts2已經定義了這個Intercepter,我們在不加聲明的情況下就可以使用Validation了 

5.4節:使用Java Annotation配置校驗 
import com.opensymphony.xwork2.validator.annotations包提供了一些必要的Annotation用來配置校驗信息 
這些內容包括: 
枚舉類型 
ValidatorType      
Field    校驗字段 
Simple   校驗其他 
Annotation(標註)類型 
Validation 
    用來標記一個類需要被校驗 
ConversionErrorFieldValidator 
    字段轉換出錯 
DateRangeFieldValidator 
    日期範圍校驗 
DoubleRangeFieldValidator 
    Double類型範圍校驗 
EmailValidator 
    Email地址校驗 
ExpressionValidator 
    使用一個OGNL表達式的校驗,功能非常強大 
FieldExpressionValidator 
    針對一個字段的使用OGNL表達式的校驗 
IntRangeFieldValidator 
    Int類型範圍校驗 
RegexFieldValidator 
    正則表達式校驗 
RequiredFieldValidator 
    必填字段校驗 
RequiredStringValidator 
    必填String校驗, 
StringLengthFieldValidator 
    字符串長度校驗 
UrlValidator 
    URL校驗 
Validations 
    可以組合上述的各種校驗類型以滿足更多的需求 
VisitorFieldValidator  實現modelDriven,應在action的setActionForm前面定義 
    可以將Action中的對象的屬性的校驗方法定位到已經定義的對象原有的校驗方法 

CustomValidator 
ValidationParameter 
        兩個類一起完成自定義的校驗
 

示例: 
package com.jpleasure; 

import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator; 
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator; 
import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator; 
import com.opensymphony.xwork2.validator.annotations.Validation; 
import com.opensymphony.xwork2.validator.annotations.ValidatorType; 

@Validation() 
publicclass RegisterAction extends ActionSupport { 
    private String name; 
    private String password; 
    private String rePassword; 
    private String mail; 
    private String description; 

    public String getName() { 
        returnname; 
    } 

    @RequiredFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, message = "name is required") 
    publicvoid setName(String name) { 
        this.name = name; 
    } 

    public String getPassword() { 
        returnpassword; 
    } 

    @RequiredFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, message = "password is required") 
    @StringLengthFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, message = "password must has proper legnth", 
            minLength = "5", maxLength = "12") 
    publicvoid setPassword(String password) { 
        this.password = password; 
    } 

    public String getRePassword() { 
        returnrePassword; 
    } 

    @RequiredFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, 
            message = "input password again please!") 
    @StringLengthFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, message = "password must has proper legnth", 
            minLength = "5", maxLength = "12") 
    @FieldExpressionValidator(expression = "password eq rePassword", 
            message = "two password must match") 
    publicvoid setRePassword(String rePassword) { 
        this.rePassword = rePassword; 
    } 

    public String getMail() { 
        returnmail; 
    } 

    @RequiredFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, message = "mail is required") 
    publicvoid setMail(String mail) { 
        this.mail = mail; 
    } 

    public String getDescription() { 
        returndescription; 
    } 

    @RequiredFieldValidator(type = ValidatorType.FIELD, 
            shortCircuit = true, message = "description is required") 
    publicvoid setDescription(String description) { 
        this.description = description; 
    } 

    public String execute() throws Exception { 

        returnSUCCESS; 
    } 
} 

5.5節:使用XML配置Validation 
Xml配置文件與Action的關係爲: 
SomeAction.java SomeAction-validation.xml 
且與SomeAction.class處在相同的目錄中 
SimpleAction-validation.xml文件示例: 

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
       "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> 
<validators> 
<field > 
      <field-validator type="required"> 
          <message>You must enter a value for bar.</message> 
      </field-validator> 
      <field-validator type="int"> 
          <param >6</param> 
          <param >10</param> 
          <message> 
bar must be between ${min} and ${max}, current value is ${bar}. 
</message> 
      </field-validator> 
</field> 
<field > 
      <field-validator type="regex"> 
          <param >[0-9],[0-9]</param> 
          <message> 
The value of bar2 must be in the format "x, y", where x and y are between 0 and 9 
</message> 
     </field-validator> 
</field> 
<field > 
      <field-validator type="date"> 
          <param >12/22/2002</param> 
          <param >12/25/2002</param> 
          <message>The date must be between 12-22-2002 and 12-25-2002.</message> 
      </field-validator> 
</field> 
<field > 
      <field-validator type="int"> 
          <param >0</param> 
          <param >100</param> 
          <message key="foo.range">Could not find foo.range!</message> 
      </field-validator> 
</field> 
<validator type="expression"> 
      <param >foo lt bar </param> 
      <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message> 
</validator> 
</validators> 

我們看看上面的配置文件,首先每一個validatior都必須有一個type屬性,type屬性的值爲我們前面定義的validator的name 
Message提供了校驗出錯的信息,message有一個屬性key,通過可以可以找到i18n文件定義的內容,但是key並不是必須的Message體內部的消息爲默認消息,當i18n文件中不存在時表示該消息消息中可以使用${}來引用被校驗的對象例如:${foo},${bar} 

5.6節:Validator和Field Validator 
Field Validator用來校驗一個字段,例如: 
<field > 
<field-validator type="required"> 
      <message>You cannot leave the email address field empty.</message> 
</field-validator> 
<field-validator type="email"> 
      <message>The email address you entered is not valid.</message> 
</field-validator> 
</field> 
Filed validator可以從filed集成字段名字,這樣可以將摸個Field的所有的校驗侷限在一定的範圍內 

使用Validator可以校驗多個字段之間的關係,例如: 
<validator type="expression> 
         <param >foo gt bar</param> 
         <message>foo must be great than bar.</message> 
</validator> 
Validator也可以校驗一個字段,例如: 
<validator type="required"> 
        <param >bar</param> 
        <message>You must enter a value for bar.</message> 
</validator> 
但是爲了將一個字段的所有校驗放在一起,我們傾向於儘量使用field validator 

5.7節:短路(Short-Circuiting) 
參看如下例子: 
<!DOCTYPE validators PUBLIC 
        "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> 
<validators> 
<!-- Field Validators for email field --> 
<field > 
      <field-validator type="required" short-circuit="true"> 
          <message>You must enter a value for email.</message> 
      </field-validator> 
      <field-validator type="email" short-circuit="true"> 
          <message>Not a valid e-mail.</message> 
      </field-validator> 
</field> 
<!-- Field Validators for email2 field --> 
<field > 
     <field-validator type="required"> 
          <message>You must enter a value for email2.</message> 
      </field-validator> 
     <field-validator type="email"> 
          <message>Not a valid e-mail2.</message> 
      </field-validator> 
</field> 
<!-- Plain Validator 1 --> 
<validator type="expression"> 
      <param >email.equals(email2)</param> 
      <message>Email not the same as email2</message> 
</validator> 
<!-- Plain Validator 2 --> 
<validator type="expression" short-circuit="true"> 
      <param >email.startsWith('mark')</param> 
      <message>Email does not start with mark</message> 
</validator> 
</validators> 

校驗的順序:首先Validator,其次Field Validator,但是在Validator或者Field Validator執行的過程中,順序按照xml文件中的定義短路的意思是,一旦一個短路的校驗出錯,其餘後續的校驗將不再進行例如上述的順序是: 
1)Plain Validator 1 
2)Plain Validator 2 
3)Field Validators for email field 
4)Field Validators for email2 field 

由於Validator 2是短路的,一旦Validator 2校驗出錯,則email和email2都不會進入校驗過程 


5.8節:validate方法 
ActionSupport實現了Validatable接口,這個接口中定義了一個validate方法,通過重寫validate方法可以完成更詳細的校驗,例如: 
public void validate() { 
User user = getUser(); 
if (StringUtils.isBlank(user.getName())) { 
    addActionError(getText("user.name.empty")); 
} 
if (StringUtils.isBlank(user.getAddress())) { 
    addActionError(getText("user.address.empty")); 
} 
} 
ActionSupport同時也實現了ValidationAware接口,該接口提供了addActionError等輸出錯誤消息的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章