Struts2验证框架的配置及validation.xml常用的验证规则

转载:http://blog.csdn.net/iuhiqnehc/article/details/8245767

在Struts2中,它的每一个校验框架都对应着每一个Action,它的命名格式为:<ActionClassName>-validation.xml,其中-validation.xml是固定不变的,<ActionClassName>就是要验证的Action类的名字,并且校验文件必须与它所对应的Action类处于同一目录下。Struts2验证的 Action需要继承ActionSupport类,并且当验证失败时,它会转向到INPUT页面来显示message消息,所以 struts.xml中action必须配置input这个result。
 
为指定的方法配置独立的校验规则:
如果在Action类在struts配置中有多个action实例(action name),那么对应某个action的验证文件名:<ActionClassName>-<aliasName>-validation.xml。例如:UserAction-login-validation.xml。 (注意:<aliasName>并不是method name,而是struts.xml中配置的action的name)。
假设在validateFrameAction中存在test()方法,如果对test()方法进行校验的话,那么就可以提供一个类似于validateFrameAction-test-validation.xml的文件,但是validateFrameAction-validation.xml仍会被校验。所以,假如一个Action中存在多个处理逻辑,建议不要再提供全局校验,而是为具体的每一个方法提供对应的的校验文件。

多个校验规则文件的验证次序

例如有一个LoginAction继承BaseAction,这两个Action中都有业务方法login,并且存在4份校验规则文件如下:BaseAction-vadition.xml, BaseAction-login-validation.xml , LoginAction-validation.xml, LoginAction-login-validation.xml那么用户访问LoginAction的login方法里,会按照以上的顺序执行校验规则,实际的校验规则是以上四个校验规则的总和,但是如果存在冲突的情况下,后面的校验规则优先。

 

字段校验和非字段校验
字段校验,属于是字段优先。即我去校验谁,然后是我用谁去校验
非字段校验,则校验器优先。即我用谁去校验,然后是我去校验谁
即字段校验中先定义name="username"对哪个字段校验,再定义type="requiredstring"如何校验
而非字段校验先定义type="requiredstring"确定校验器,再定义name="fieldName"指定所校验的属性,字段校验和非字段校验的本质都是一样的,只是说话的顺序不同罢了。反映到底层后,二者实质上都是一样的。相对来说不推荐使用非字段验证,因为如果需要验证的字段非常多的话,那么在维护的时候就比较困难了。

validation.xml 的内容示例: 

<?xml version="1.0" encoding="UTF-8"?>  
<!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="userName">  
        <field-validator type="requiredstring">  
            <param name="trim">true</param>  
            <message key="userName.required"></message>  
        </field-validator>  
        <field-validator type="stringlength">  
            <param name="minLength">6</param>  
            <param name="maxLength">20</param>  
            <message>用户名长度必须在6到20之间!</message>  
        </field-validator>  
    </field>  
    <field name="password">  
        <field-validator type="requiredstring" short-circuit="true">  
            <param name="trim">true</param>  
            <message>密码不能为空!</message>  
        </field-validator>  
        <field-validator type="regex" short-circuit="true">  
            <param name="expression"><![CDATA[(\w{6,15})]]></param>  
            <message>密码必须是字母和数字组合且长度在6到15之间!</message>  
        </field-validator>  
    </field>  
    <field name="rpassword">  
        <field-validator type="requiredstring" short-circuit="true">  
            <param name="trim">true</param>  
            <message>确认密码不能为空!</message>  
        </field-validator>  
        <field-validator type="fieldexpression" short-circuit="true">  
            <param name="expression"><![CDATA[password==rpassword]]></param>  
            <message>确认密码和密码不一致!</message>  
        </field-validator>  
    </field>  
    <field name="age">  
        <field-validator type="int">  
            <param name="min">1</param>  
            <param name="max">150</param>  
            <param name="repopulateField">true</param>  
            <message>年龄必须在1到150之间!</message>  
        </field-validator>  
    </field>  
    <field name="email">  
        <field-validator type="email">  
            <message>请输入合法的Email地址!</message>  
        </field-validator>  
    </field>  
    <field name="birthday">  
        <field-validator type="date">  
            <param name="min">1900-01-01</param>  
            <param name="max">2012-12-31</param>  
            <param name="repopulateField">true</param>  
            <message key="birth.range"></message>  
        </field-validator>  
    </field>  
    <field name="url">  
        <field-validator type="url">  
            <message>个人主页必须是有效的URL地址!</message>  
        </field-validator>  
    </field>  
</validators> 
message的信息可以配置国际化:<message key="userpass.required"></message>,key对应的是国际化配置文件中的国际化信息。还可以使用以下配置获取国际化资源中的信息 :<message>${getText(" userpass . required ")}</message>  这种方式是通过调用ActionSupport类的getText()方法来获取国际化资源的。

Struts2客户端验证:

将<s:form>的validate属性设置为true,不能将<s:form theme="">的theme属性设置为simple,将<s:form/>的action和namespace属性分开写。设置validate="true"之前和之后的JSP页面在运行时的源代码是不同的,JSP页面中会自动生成校验配置文件中对应的javascript代码。但是并不是所有的服务器端校验都可以转换成客户端校验,如日期校验。Struts2的客户端验证提示信息都显示在各字段的正上方,不够友好。在实际开发中,几乎不会使用到Struts2提供的客户端校验。使用的更多的还是它的服务端的校验,这也是Strtus2的强项。

Struts2 内建验证器有以下16种: 
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
long:长整型校验器
short:短整型校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
conditionalvisitor:
打开Struts2的lib包下的xwork.jar包,在com\opensymphony\xwork2\validator\validators\default.xml文件中,可以看到Struts2的内建校验器。我们也可以开发自己的校验器:添加一个validators.xml文件在WEB\INF\classes目录下,再开发出自己的校验器类,在validators.xml中注册就可以了。如果在WEB-INF\classes目录添加了文件validators.xml文件,则Struts2不会再应用默认的校验器,因此这时需要将default.xml文件中的所有校验器都复制到validators.xml文件中。
常用的验证规则: 

1、required验证器用来验证一个参数是否为null。
参数:
short-circuit:用来表示短路,默认值为false。
<validators>
<field name="username">
<field-validator type="required">
<message>指定检验失败的提示信息</message>
</field-validator>
</field>
</validators>

2、requiredstring验证器用来验证一个字符串参数是否非空,既不为null,且长度大于0。
参数:
trim指定是否去掉字符串两边的空白,默认为true。

3、int验证器用来验证一个整数型参数是否在指定的范围内。如果一个已经被成功转换为int的属性不在验证器指定的范围内,int验证器就会报错。

int验证器可以有两个参数:

min用来指定可接受范围的最小值。

max用来指定可接收范围的最大值。

<validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年纪必须在1到150之间</message>
</field-validator>
</field>
</validators>
4、long验证器和short验证器与int验证器非常相似,都是用来验证参数是否在指定范围之内。

5、 double验证器验证一个双精度浮点型参数是否在指定的范围内。如果一个已经被成功转换为double的属性不在验证器指定的范围内,double验证器就会报错。

double验证器可以有四个参数:

minInclusive用来指定可接受范围的最小值,包含给定值。

maxInclusive用来指定可接收范围的最大值,包含给定值。

minExclusive用来指定可接受范围的最小值,不包含给定值。

maxExclusive用来指定可接收范围的最大值,不包含给定值。

 

6、date验证器用来验证一个日期型参数是否在指定的范围内。如果一个已经被成功转换为date的属性不在验证器指定的范围内,date验证器就会报错。

date验证器可以有两个参数:

min用来指定可接受范围的最小值。

max用来指定可接收范围的最大值。

注意:指定日期范围的时候,需要使用统一的格式,比如用MM/DD/YYYY的格式等。
<validators>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message key="birth.range"/>
</field-validator>
</field>
</validators>

7、fieldexpression验证器中必须指定一个返回布尔值的ognl表达式,根据这个表达式的值来确定是否符合条件。

参数:

expression:返回布尔值的ognl表达式,可以在这个ognl表达式中访问当前的值栈。

表达式验证器(expression)与字段表达式验证器(fieldexpression)类似,同样使用expression参数来指定返回布尔值的ognl表达式,但是,只能用于动作验证器。
<validators>
<field name="re_pass">

<field-validator type="fieldexpression">
<param name="expression"> (pass eq re_pass)</param>
<message>密码必须和确认密码相等</message>
</field-validator>
</field>
</validators>

8、email验证器用来验证一个参数是否为邮箱地址。
<validators>
<field name="email">
<field-validator type="email">
<message>你的电子邮件地址必须是一个有效的电邮地址</message>
</field-validator>
</field>
</validators>

9、url验证器用来验证一个参数是否为合法的URL。
<validators>
<field name="url">
<field-validator type="url">
<message>你的主页地址必须是一个有效的网址</message>
</field-validator>
</field>
</validators>
 
10、visitor验证器用于验证Action中的复合属性,可以直接把验证信息放到域对象中去注册,这样就使得同包内的不同Action在验证同一个域对象时,不用注册重复的验证信息。

参数:

context:引用的域对象验证信息文件上下文名。

appendPrefix:是否在错误信息中添加<message>元素指定的前缀。

<validators> 
 <field name="user">
  <field-validator type="visitor">
   <param name="context">c1</param>
   <param name="appendPrefix">true</param>
   <message>用户</message>
  </field-validator>
 </field>
</validators>

上面的示例,在user字段上指定了一个visitor验证器,设置上下文的名称为c1,设置前缀为true,也就是说在发生错误的时候,要在c1上下文返回的错误信息前加上“用户”这个前缀。

       接下来新添一个上下文验证文件,其文件名为“字段的简单类名-上下文名-validation.xml”,比如现在要为user属性指定一个名为c1的上下文,所以文件名为UserModel-c1-validation.xml,放在与域对象同级的包内,即UserModel所在的包内,注意:不再是与Action同级的包内了,其内容示例为:

<validators>
 <field name="age">
  <field-validator type="int">
   <param name="min">18</param>
   <message>年龄要大于等于18</message>
  </field-validator>
 </field>
</validators>

它的本质也是一个验证文件,与之前直接在RegisterAction-validation.xml直接写出对user.age的验证相比,没有本质上的区别,只是这个文件以UserModel类为验证的根,所以<field>元素的name属性直接写age就可以了,而不再是原来的user.age。

        JSP中则为:<INPUT TYPE="text" NAME="user.age">

 

11、conversion验证器用来验证类型转换时是否出错。如果一个类型为int的参数接到了“18a”这个字符串,conversion验证器就会报错。

参数:repopulateField指定当类型转换失败后返回input页面时,表单是否保留原来的错误输入。

 <field name="myField">
        <field-validator type="conversion">
            <param name ="repopulateField">true</param> 
            <message>类型转换错误</message>
        </field-validator>
    </field> 

 

12、stringlength验证器用来验证一个字符串的长度是否在指定范围内。

参数:

minLength:字符串长度的最小值。

maxLength:字符串长度的最大值。

  <field name="userName">
  <field-validator type="stringlength">
   <param name="minLength">6</param>
   <param name="maxLength">20</param>
   <message>用户名长度必须在${minLength}到${maxLength}之间!</message>
  </field-validator>
 </field>

13、regex验证器用来验证一个字符串是否符合一个正则表达式的要求。

参数:

expression:必填参数,正则表达式。

caseSensitive:是否检查大小写,默认为true。

 <field name="password">
  <field-validator type="regex" short-circuit="true">
   <param name="expression"><![CDATA[(\w{6,15})]]></param>
   <message key="password.invalid"></message>
  </field-validator>
 </field>

 

非字段校验器的配置

<validator type="requiredstring">
   <param name="fieldName">password</param>
   <param name="trim">true</param>
   <message>${getText("password.requried")}</message>
</validator>





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值