5.1節(jié):校驗(yàn)類(lèi)型和配置方法說(shuō)明

Struts2 校驗(yàn)框架在驗(yàn)證的場(chǎng)所上可以分為:客戶(hù)端校驗(yàn)和服務(wù)端校驗(yàn)。

    客戶(hù)端校驗(yàn)是指,在HTML畫(huà)面上自動(dòng)生成JavaScript校驗(yàn)代碼,在用戶(hù)提交到服務(wù)器之前在客戶(hù)端瀏覽器中進(jìn)行校驗(yàn)。默認(rèn)位客戶(hù)端校驗(yàn)。

    服務(wù)端校驗(yàn)是指,在數(shù)據(jù)提交到服務(wù)器上之后,在Action處理之前,對(duì)客戶(hù)但提交的數(shù)據(jù)進(jìn)行校驗(yàn)。

 

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

    Java Annotation配置是指,使用Java Annotation語(yǔ)法,在Java源代碼上標(biāo)記需要校驗(yàn)的內(nèi)容,和校驗(yàn)的方式。

    XML配置文件配置是指,使用XML配置文件配置需要校驗(yàn)的內(nèi)容和校驗(yàn)方式。

 

5.2節(jié):ValidatorValidation

Validation指校驗(yàn),Validator指誰(shuí)來(lái)校驗(yàn)。

Struts2框架中Validator必須在系統(tǒng)中注冊(cè),如果沒(méi)有注冊(cè),系統(tǒng)使用默認(rèn)的注冊(cè),這些validator注冊(cè)文件在xworkjar文件中,內(nèi)容如下:

<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>

 

自己需要注冊(cè)自己的Validator時(shí),可以使用上述相似的內(nèi)容,這個(gè)文件需要放在WEB-INF/classes目錄下,文件的名字叫validators.xml

 

一旦自己定義了validators.xml文件,系統(tǒng)就不會(huì)在加載默認(rèn)的Validators文件,所以在Validators.xml中需要拷貝默認(rèn)的內(nèi)容。

 

5.3節(jié):ValidationIntercepter

Validation使用名字叫做validatorIntercepter,在默認(rèn)情況下,struts2已經(jīng)定義了這個(gè)Intercepter,我們?cè)诓患勇暶鞯那闆r下就可以使用Validation了。

 

5.4節(jié):使用Java Annotation配置校驗(yàn)

import com.opensymphony.xwork2.validator.annotations包提供了一些必要的Annotation用來(lái)配置校驗(yàn)信息。

這些內(nèi)容包括:

枚舉類(lèi)型

ValidatorType     

Field    校驗(yàn)字段

Simple   校驗(yàn)其他

Annotation(標(biāo)注)類(lèi)型

Validation

    用來(lái)標(biāo)記一個(gè)類(lèi)需要被校驗(yàn)

ConversionErrorFieldValidator

    字段轉(zhuǎn)換出錯(cuò)

DateRangeFieldValidator

    日期范圍校驗(yàn)

DoubleRangeFieldValidator

    Double類(lèi)型范圍校驗(yàn)

EmailValidator

    Email地址校驗(yàn)

ExpressionValidator

    使用一個(gè)OGNL表達(dá)式的校驗(yàn),功能非常強(qiáng)大

FieldExpressionValidator

    針對(duì)一個(gè)字段的使用OGNL表達(dá)式的校驗(yàn)

IntRangeFieldValidator

    Int類(lèi)型范圍校驗(yàn)

RegexFieldValidator

    正則表達(dá)式校驗(yàn)

RequiredFieldValidator

    必填字段校驗(yàn)

RequiredStringValidator

    必填String校驗(yàn),

StringLengthFieldValidator

    字符串長(zhǎng)度校驗(yàn)

UrlValidator

    URL校驗(yàn)

Validations

    可以組合上述的各種校驗(yàn)類(lèi)型以滿(mǎn)足更多的需求。

VisitorFieldValidator

    可以將Action中的對(duì)象的屬性的校驗(yàn)方法定位到已經(jīng)定義的對(duì)象原有的校驗(yàn)方法

 

CustomValidator

ValidationParameter

        兩個(gè)類(lèi)一起完成自定義的校驗(yàn)

 

示例:

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節(jié):使用XML配置Validation

Xml配置文件與Action的關(guān)系為:

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>

 

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

Message提供了校驗(yàn)出錯(cuò)的信息,message有一個(gè)屬性key,通過(guò)可以可以找到i18n文件定義的內(nèi)容,但是key并不是必須的。Message體內(nèi)部的消息為默認(rèn)消息,當(dāng)i18n文件中不存在時(shí)表示該消息。消息中可以使用${}來(lái)引用被校驗(yàn)的對(duì)象例如:${foo}${bar}

 

5.6節(jié):ValidatorField Validator

Field Validator用來(lái)校驗(yàn)一個(gè)字段,例如:

<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集成字段名字,這樣可以將摸個(gè)Field的所有的校驗(yàn)局限在一定的范圍內(nèi)。

 

使用Validator可以校驗(yàn)多個(gè)字段之間的關(guān)系,例如:

<validator type="expression>

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

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

</validator>

Validator也可以校驗(yàn)一個(gè)字段,例如:

<validator type="required">

        <param name="fieldName">bar</param>

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

</validator>

但是為了將一個(gè)字段的所有校驗(yàn)放在一起,我們傾向于盡量使用field validator

 

5.7節(jié):短路(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>

 

校驗(yàn)的順序:首先Validator,其次Field Validator,但是在Validator或者Field Validator執(zhí)行的過(guò)程中,順序按照xml文件中的定義。短路的意思是,一旦一個(gè)短路的校驗(yàn)出錯(cuò),其余后續(xù)的校驗(yàn)將不再進(jìn)行。例如上述的順序是:

1Plain Validator 1

2Plain Validator 2

3Field Validators for email field

4Field Validators for email2 field

 

由于Validator 2是短路的,一旦Validator 2校驗(yàn)出錯(cuò),則emailemail2都不會(huì)進(jìn)入校驗(yàn)過(guò)程。

 

 

5.8節(jié):validate方法

ActionSupport實(shí)現(xiàn)了Validatable接口,這個(gè)接口中定義了一個(gè)validate方法,通過(guò)重寫(xiě)validate方法可以完成更詳細(xì)的校驗(yàn),例如:

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同時(shí)也實(shí)現(xiàn)了ValidationAware接口,該接口提供了addActionError等輸出錯(cuò)誤消息的方法。

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