struts2 校验框架总结

http://307033.blog.51cto.com/297033/523928


struts2 校验框架总结

int 整数;
double 实数;
date 日期;
expression  两数的关系比较;
email Email地址;
url
visitor
conversion
regex 正则表达式验证;
required 是否为空;
requiredstring 必须字符;
stringlength 输入字符长度限制;
答案补充

url web地址 visitor 访问 conversion 转换

校验类型和配置方法说明 
从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等输出错误消息的方法

 

 

@Validati*****(requiredStrings = { 
        @RequiredStringValidator(fieldName = "oldPassword", message = "旧密码不允许为空!"),
        @RequiredStringValidator(fieldName = "newPassword", message = "新密码不允许为空!")},
    stringLengthFields = {
        @StringLengthFieldValidator(fieldName = "newPassword", minLength = "4", maxLength = "20", message = "新密码长度只允许为4-20!")})

@RequiredStringValidator代表进行字符串非空验证,fildName是指需要验证的参数名称,message为验证失败后显示的信息。
其实struts2中内置了很多验证方法,稍后会将这些方法列出来。

写到这里,肯定有很多朋友会出现这样的问题:以上代码并不是只针对单个方法进行验证,而是对所有方法都进行了验证,其实我们可以对不需要验证的方法上写了@SkipValidation注解。。但这样又出现了问题,若有两个方法都需要进行验证但参数又不相同,那怎么办呢?
这样我们就需要配置struts2的validation interceptor的一个参数validateAnnotatedMethodOnly为true即可。
默认情况下struts2的配置中没有配置这个参数,所以需要我们自己重新配置一下defaultStack:

代码如下:

<interceptors>
    <interceptor-stack name="defaultParentStack">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="debugging"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params">
          <param name="excludeParams">dojo\..*,^struts\..*</param>
        </interceptor-ref>
        <interceptor-ref name="conversionError"/>
        <!-- 配置方法级别的校验 -->
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
            <param name="validateAnnotatedMethodOnly">true</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>

最后将这个interceptors设置为默认拦截器栈即可:

<default-interceptor-ref name="defaultParentStack" />

注意:将validateAnnotatedMethodOnly参数设置为true后,对于不需要进行验证的方法没必要使用@SkipValidation注解。

此外,我们还可以在方法上配置@InputConfig(resultName = "error")可以配置验证失败后跳转的URL。
具体代码可以参考SHOP++源代码。

Struts2内置验证方法:
@RequiredFieldValidator:字符串非空验证
@EmailValidator:E-mail验证
@UrlValidator:Url验证
@StringLengthFieldValidator:字符串长度验证
@intRangeFields:数值大小验证
@dateRangeFields:日期验证
@RegexFieldValidator:正则表达式验证


SHOP++验证实例:

@InputConfig(resultName = "error")
    @Validati*****(requiredStrings = {
            @RequiredStringValidator(fieldName = "member.username", message = "用户名不允许为空!"),
            @RequiredStringValidator(fieldName = "member.password", message = "密码不允许为空!"),
            @RequiredStringValidator(fieldName = "member.email", message = "E-mail不允许为空!")},
            requiredFields = {
            @RequiredFieldValidator(fieldName = "isAgree", message = "必须同意服务协议!")},
            stringLengthFields = {
            @StringLengthFieldValidator(fieldName = "member.username", minLength = "2", maxLength = "20", message = "用户名长度必须在${minLength}到${maxLength}之间!"),
            @StringLengthFieldValidator(fieldName = "member.password", minLength = "4", maxLength = "20", message = "密码长度必须在${minLength}到${maxLength}之间!")},
            emails = {
            @EmailValidator(fieldName = "member.email", message = "E-mail格式错误!")},
            regexFields = {
            @RegexFieldValidator(fieldName = "member.username", expression = "^[0-9a-z_A-Z\u4e00-\u9fa5]+$", message = "用户名只允许包含中文、英文、数字和下划线!")}
    )

 

注解

相应的 XML

描述

RequiredFieldValidator

required

确保该属性不是 null

RequiredStringValidator

requiredstring

确保一个 String 类型的属性不是 null ,并且非空

StringLengthFieldValidator

stringlength

检查 String 的长度范围是否与所期望的一致

IntRangeFieldValidator

int

检查 int 类型的数字是否超出所期望的大小范围

DoubleRangeFieldValidator

double

检查 double 类型的数字是否超出所期望的大小范围

DateRangeFieldValidator

date

检查 date 类型的属性是否超出所期望的范围

ExpressionValidator

expression

使用值栈来估算一个 ONGL 表达式(必须要返回 boolean 值)

FieldExpressionValidator

fieldexpression

使用 OGNL 表达式来验证字段

EmailValidator

email

保证该属性是一个有效的email 地址

UrlValidator

url

保证该属性是一个有效的URL

ConversionErrorFieldValidator

conversion

检查该属性是否有转换错误

RegexFieldValidator

regex

检查该属性的值是否与某个正则表达式相匹配。

VisitorFieldValidator

visitor

把对字段的验证动作推迟到这个字段所属的类的特有的另一个验证文件中执行。

StringRegexValidator

n/a

检查字符串是否与正则表达式匹配

CustomValidator

n/a

表示使用了一个自定义的validator

ValidationParameter

n/a

作为CustomValidator 注解的一个参数

Validation

n/a

表示该类使用了基于注解的验证 —— 这个注解可以与接口或类一起使用

Validations

n/a

用来对一个属性或类组合使用多种验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值