struts validate校验框架(转)

来源:互联网 发布:apache框架 编辑:程序博客网 时间:2024/05/17 20:27

原创 struts validate校验框架收藏

利用继承了ActionForm的普通formBean的validate方法来验证表单数据,当在validate方法返回非空的ActionErrors对象时,ActionServlet会根据配置文件中的input属性来进行请求转发,并不会执行action的execute方法。
----------------------------------------------------------------------------------------------------
使用validate校验框架则需要formBean继承ValidatorForm,且不可重写validate方法。或者使用动态FormBean,配置在文件中
<form-bean name="newPasswordForm"
            type="org.apache.struts.validator.DynaValidatorForm">
            <form-property name="oldPassword" type="java.lang.String" />
            <form-property name="newPassword1" type="java.lang.String" />
            <form-property name="newPassword2" type="java.lang.String" />
 </form-bean>

使用validate框架需要在struts-config.xml中添加<plug-in>节点
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames"
            value="/validator-rules.xml,/myapp.validator.xml,/demo.validator.xml,/systool.validator.xml" />
</plug-in>
其中 validator-rules.xml是定义校验规则的配置文件,不需要修改。
其他的则需要手动编写。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE form-validation PUBLIC
     "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"
     "http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
<form-validation>
    <global>
        <constant>
            <constant-name>datePattern</constant-name>
            <constant-value>yyyy-MM-dd</constant-value>
        </constant>
        <constant>
            <constant-name>userName</constant-name>
            <constant-value>^[a-zA-Z]{1}[a-zA-Z0-9_]*$</constant-value>
        </constant>
    </global>
    <formset>
<form name="commonLogQueryForm">
------------------------------------------------
 <!--name指定所需校验的formBean-->
---------------------------------------------------
            <field property="content" depends="maxlength">
                <arg position="0" key="commonLog.content" resource="true" />
                <arg position="1" key="${var:maxlength}" resource="false" />
                <var>
                    <var-name>maxlength</var-name>
                    <var-value>200</var-value>
                </var>
            </field>

            <field property="operatStartTime" depends="date">
                <arg position="0" key="commonLog.operatStartTime" resource="true" />
                <var>
                    <var-name>date</var-name>
                    <var-value>${datePattern}</var-value>
                </var>
            </field>

            <field property="operatEndTime" depends="date,validwhen">
                <arg position="0" key="commonLog.operatEndTime" resource="true" />
                <var>
                    <var-name>date</var-name>
                    <var-value>${datePattern}</var-value>
                </var>
                <msg name="validwhen" key="error.operatEndTime" />
                <var>
                    <var-name>test</var-name>
                    <var-value>(((operatStartTime==null) and
                        (operatEndTime==null)) or (((operatStartTime!=null) and
                        (operatEndTime!=null))and(*this* >= operatStartTime)) )</var-value>
                </var>
            </field>
        </form>
    </formset>
</form-validation>
---------------------------------------------------------
<!--
<field>节点对应formBean中需校验的属性,property指定属性,depends指定校验规则。
如maxlength指最大长度,在validator-rules.xml中的定义如下:

<validator name="maxlength"
            classname="org.apache.struts.validator.FieldChecks"
            method="validateMaxLength"
            methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
            depends="" msg="errors.maxlength"
            jsFunction="org.apache.commons.validator.javascript.validateMaxLength" />

如果违反该规则,就会加载errors.maxlength在资源文件application.properties中所代表的错误信息
             errors.maxlength={0} 不能超过{1} 个字符.
若想要自定义错误的信息格式,可以使用<msg>节点。
<msg name="validwhen" key="error.operatEndTime" />,msg节点用来指定
   当违反name所指定的规则时,按照key所制定的资源文件来加载错误信息。
若不指定<msg>节点,则按照validator-rules.xml中的msg所指定的key来加载错误信息。

在上述的错误信息中可以使用占位符{0},{1},{2},{3},{4}来加载信息,并在配置文件中使用<arg>节点来为占位符指定加载的信息。

<arg position="0" key="commonLog.content" resource="true" />
<arg position="1" key="${var:maxlength}" resource="false" />
                <var>
                    <var-name>maxlength</var-name>
                    <var-value>200</var-value>
                </var>

其中position指定占位符。name用来指定所属的校验规则,适用于当有多个校验规则时。key用来指定在资源文件中的错误信息。resource指定错误信息是否来源于资源文件,为true时,会到资源文件中根据key来加载错误信息,为false时,会在文件本身寻找相配的信息,key="${var:maxlength}",即加载变量maxlength所代表的信息,即200.

当校验规则需要外界提供一些参数的时候,就会用到<arg>节点。如maxlength规则会要求外界指定最大值。
date规则会要求指定日期格式,validwhen规则会要求指定条件等
例如:date规则
<field property="operatStartTime" depends="date">
                <arg position="0" key="commonLog.operatStartTime" resource="true" />
                <var>
                    <var-name>date</var-name>
                    <var-value>${datePattern}</var-value>
                </var>
</field>
其变量名称为date,值为global节点中定义的datePattern,即yyyy-MM-dd。
也可指定变量名为 datePatternStrict 值同样为${datePattern}
对于validwhen较为复杂,下面是一篇转载:
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ValidWhen主要用于关联验证,即为了验证某个域的值,可能会参考其它域的值来进行综合判断,以确定该域的值是否符合要求。 1,表达式及其注意事项
输入给validwhen的是一个布尔型表达式(对该表达式的解析使用了antlr),其引用名为test,即形如:
<var>
  <var-name>test</var-name>
  <var-value>expression</var-name>
</var>
即,当expression为真(true)时,该域验证通过,其中,expression可以使用的元素包括:
1)表单中其它域属性的名称,例如:
<var>
  <var-name>test</var-name>
  <var-value>(color=="red")</var-name>
</var>
例子中color为表单中其它某个域的属性名。
2)*this*,用于表示该域的属性名称,即对正在验证的属性自身,其变量的引用为*this*,例如:
<var>
  <var-name>test</var-name>
  <var-value>((color=="red") and (*this* != null))</var-name>
</var>
3)可以使用一些常规运算符,如 >、<、==、>=、<=、!=、+、-、*、/、%等等。例如:
<var>
  <var-name>test</var-name>
  <var-value>((color=="red") and (age>=25))</var-name>
</var>
4)可以使用逻辑运算 and 、or,例如:
<var>
  <var-name>test</var-name>
  <var-value>(((color=="red") and (age>=25)) or (color!="red"))</var-name>
</var>
在使用and和or时要注意一点,在同一级的逻辑运算中,同时只能存在一个逻辑运算符,要么是and,要么是or,即:
xxx and yyy
或者
xxx or yyy
如果在同一级出现多于一个的and或or或and和or的组合,那么是不合法的,例如下面的表达式是不合法的:
xxx and yyy and zzz
或者
xxx or yyy or zzz
或者
xxx and yyy or zzz
等等
为了让复杂的表达变得合法,可以让一个复杂的表达式变为多级的表达形式,每一级只有一个and或一个or就可以了,例如:
xxx and yyy and zzz是错误的,进行一下简单的变换:
(xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。
5)其他合法的输入,例如可以使用双引号和单引号引用literal字符串等等。
2,错误消息的定制
无论是validwhen还是其它验证例程,都可以定制验证出错后的错误信息,定制消息有两种方式,即全局方式和本地方式。
1)全局方式,即在validator-rules.xml中某个validator里面定义的消息,参数名为msg,例如:


<validator name="email"
classname="org.apache.struts.validator.FieldChecks"
method="validateEmail"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.email"/>


其中,msg的值为resource bundle中的一个属性名
。例如在resource bundle文件中存在如下定义:
errors.email={0} is an invalid e-mail address.  
2)本地方式,即在validation.xml中的field中定义的错误消息,格式为:
<msg key="value" resource="booleanValue"/>
例如:

<field property="endDate"
depends="validwhen,date">
<msg name="validwhen" key="date.validwhen"/>
<arg0 key="start time" resource="false"/>
<arg1 key="end time" resource="false"/>
<var>
<var-name>test</var-name>
<var-value>((*this* != null) and (*this*>startDate))</var-value>
</var>
</field>

这里需要注意的是
* <msg>的name属性的值应该为某个验证例程的名称,例如name="validwhen"、name="date"等,这指明了当该field的该验证例程(本例是validwhendate)出错时所显示的错误信息。
*如果全局已经定义了msg的信息,而且本地的msg的key与全局的msg的key相同,那么在该field的验证中,本地的msg将覆盖全局的msg。
*<arg0>到<arg4>的属性中也有name属性,即该arg参数所应用的验证例程,例如<arg0key="label.startDate"/>,即该参数用于date验证的出错信息。注意,对于一个field,需要的验证规则有时不止一个,例如depends="required,date",而多个验证规则中的每一个都需要出错时传入一些参数信息,如果它们所需要的参数个数、名称和顺序都相同,那么只要定义<arg0...、<arg1...等等即可。但是如果它们需要的参数的个数、名称和顺序不同怎么办,如果我们对于第一个输入参数只定义一个arg0,那么这个arg0用于哪个验证消息,因此这时必须通过arg标签的name属性来表示该参数所服务的验证。
3,例子
场景:在一个表单中,有两个文本域,用于得到一个时间段,一个文本域输入起始日期(startDate),另一个输入终止日期(endDate)。
约束:日期格式为:年(四位数)-月(两位数)-日(两位数),而且终止日期大于起始日期。
根据上述条件,验证规则如下:

<field property="startDate"
depends="date">
<arg0 key="form.date.start"/>
<var>
<var-name>datePatternStrict</var-name>
<var-value>yyyy-MM-dd</var-value>
</var>
</field>
<field property="endDate"
depends="validwhen,date">
<msg name="validwhen" key="date.validwhen"/>
<arg0 name="validwhen" key="form.date.start"/>
<arg1 name="validwhen" key="form.date.end"/>
<arg0 name="date" key="form.date.end"/>
<var>
<var-name>test</var-name>
<var-value>((*this* != null) and (*this*>startDate))</var-value>
</var>
<var>
<var-name>datePatternStrict</var-name>
<var-value>yyyy-MM-dd</var-value>
</var>
</field>

在资源文件中加入如下message:
form.date.start=起始日期
form.date.end=终止日期
date.validwhen= {0}不能大于{1}!
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

 

原创粉丝点击