5.1節:校驗類型和配置方法說明

Struts2 校驗框架在驗證的場所上可以分為:客戶端校驗和服務端校驗。

    客戶端校驗是指,在HTML畫面上自動生成JavaScript校驗代碼,在用戶提交到服務器之前在客戶端瀏覽器中進行校驗。默認位客戶端校驗。

    服務端校驗是指,在數據提交到服務器上之后,在Action處理之前,對客戶但提交的數據進行校驗。

 

Struts2校驗框架的配置上可以分為:Java Annotation配置和XML配置文件配置

    Java Annotation配置是指,使用Java Annotation語法,在Java源代碼上標記需要校驗的內容,和校驗的方式。

    XML配置文件配置是指,使用XML配置文件配置需要校驗的內容和校驗方式。

 

5.2節:ValidatorValidation

Validation指校驗,Validator指誰來校驗。

Struts2框架中Validator必須在系統中注冊,如果沒有注冊,系統使用默認的注冊,這些validator注冊文件在xworkjar文件中,內容如下:

<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節:ValidationIntercepter

Validation使用名字叫做validatorIntercepter,在默認情況下,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

    可以將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()

public class RegisterAction extends ActionSupport {

    private String name;

    private String password;

    private String rePassword;

    private String mail;

    private String description;

 

    public String getName() {

        return name;

    }

 

    @RequiredFieldValidator(type = ValidatorType.FIELD,

            shortCircuit = true, message = "name is required")

    public void setName(String name) {

        this.name = name;

    }

 

    public String getPassword() {

        return password;

    }

 

    @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")

    public void setPassword(String password) {

        this.password = password;

    }

 

    public String getRePassword() {

        return rePassword;

    }

 

    @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")

    public void setRePassword(String rePassword) {

        this.rePassword = rePassword;

    }

 

    public String getMail() {

        return mail;

    }

 

    @RequiredFieldValidator(type = ValidatorType.FIELD,

            shortCircuit = true, message = "mail is required")

    public void setMail(String mail) {

        this.mail = mail;

    }

 

    public String getDescription() {

        return description;

    }

 

    @RequiredFieldValidator(type = ValidatorType.FIELD,

            shortCircuit = true, message = "description is required")

    public void setDescription(String description) {

        this.description = description;

    }

 

    public String execute() throws Exception {

 

        return SUCCESS;

    }

}

 

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 name="bar">

      <field-validator type="required">

          <message>You must enter a value for bar.</message>

      </field-validator>

      <field-validator type="int">

          <param name="min">6</param>

          <param name="max">10</param>

          <message>

bar must be between ${min} and ${max}, current value is ${bar}.

</message>

      </field-validator>

  </field>

  <field name="bar2">

      <field-validator type="regex">

          <param name="regex">[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 name="date">

      <field-validator type="date">

          <param name="min">12/22/2002</param>

          <param name="max">12/25/2002</param>

          <message>The date must be between 12-22-2002 and 12-25-2002.</message>

      </field-validator>

  </field>

  <field name="foo">

      <field-validator type="int">

          <param name="min">0</param>

          <param name="max">100</param>

          <message key="foo.range">Could not find foo.range!</message>

      </field-validator>

  </field>

  <validator type="expression">

      <param name="expression">foo lt bar </param>

      <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>

  </validator>

</validators>

 

我們看看上面的配置文件,首先每一個validatior都必須有一個type屬性,type屬性的值為我們前面定義的validatorname

Message提供了校驗出錯的信息,message有一個屬性key,通過可以可以找到i18n文件定義的內容,但是key并不是必須的。Message體內部的消息為默認消息,當i18n文件中不存在時表示該消息。消息中可以使用${}來引用被校驗的對象例如:${foo}${bar}

 

5.6節:ValidatorField Validator

Field Validator用來校驗一個字段,例如:

<field name="email_address">

  <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 name="expression">foo gt bar</param>

         <message>foo must be great than bar.</message>

</validator>

Validator也可以校驗一個字段,例如:

<validator type="required">

        <param name="fieldName">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 name="email">

      <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 name="email2">

     <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 name="expression">email.equals(email2)</param>

      <message>Email not the same as email2</message>

  </validator>

  <!-- Plain Validator 2 -->

  <validator type="expression" short-circuit="true">

      <param name="expression">email.startsWith('mark')</param>

      <message>Email does not start with mark</message>

  </validator>

</validators>

 

校驗的順序:首先Validator,其次Field Validator,但是在Validator或者Field Validator執行的過程中,順序按照xml文件中的定義。短路的意思是,一旦一個短路的校驗出錯,其余后續的校驗將不再進行。例如上述的順序是:

1Plain Validator 1

2Plain Validator 2

3Field Validators for email field

4Field Validators for email2 field

 

由于Validator 2是短路的,一旦Validator 2校驗出錯,則emailemail2都不會進入校驗過程。

 

 

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等輸出錯誤消息的方法。

ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程