struts验证框架开发详解

来源:互联网 发布:淘宝旧书店 编辑:程序博客网 时间:2024/05/29 13:46
一、启用Validator插件
虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中添加下面的插件定义。
 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property  property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>
 
二、配置validator-rules.xml
Struts示例应用程序带有这个文件的预配置拷贝。在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定制的验证。默认情况下,Validator中包括几个基本验证例行程序,你可以用它们来处理大多数验证问题。这些例行程序具有逻辑名称,如required(用于输入要求的值)、CreditCard(用于输入信用卡号码值)、email(用于输入电子邮件地址值),等等。
 
三、配置ApplicationResource.properties
ApplicationResource.properties属性文件中这时应该追加用于验证错误的消息,validator-rules.xml的标准验证逻辑中包括了错误信息的名称,譬如required验证会在“msg”属性中包括errors.required消息,这时你就需要在ApplicationResource.properties中定义该消息,必须要和validator-rules.xml中的msg申明的消息名称一致。例如:
   errors.required={0} is required.
   errors.minlength={0} can not be less than {1} characters.
   errors.maxlength={0} can not be greater than {1} characters.
   errors.invalid={0} is invalid.
 
   errors.byte={0} must be a byte.
   errors.short={0} must be a short.
   errors.integer={0} must be an integer.
   errors.long={0} must be a long.
   errors.float={0} must be a float.
   errors.double={0} must be a double.
 
   errors.date={0} is not a date.
   errors.range={0} is not in the range {1} through {2}.
   errors.creditcard={0} is an invalid credit card number.
   errors.email={0} is an invalid e-mail address.
   将这些信息直接拷贝到ApplicationResource.properties中即可。
 
四、创建Form
    根据不同情况分别可以创建三种类型的form:
   1、ValidatorForm
    2、DynaValidatorForm
   3、ValidatorActionForm和DynaValidatorActionForm
    注意:对于由myeclipse生成的静态form,如果在form中包括validate()方法,要将其去掉,否则,验证就会被这个空的validate()方法覆盖而没有发挥作用。
    创建步骤类似,ValidatorForm需要具体的form,该form继承自ValidatorForm,并且不包含reset()和validate()方法,而DynaValidatorForm不需要具体的form,这两种form的实现方法基本相同。 
    对ValidatorActionForm和DynaValidatorActionForm的解释:
    对于1、2两种验证有一点不足,就是在validation.xml文件中将表单属性的验证捆绑到具体的form上了,譬如:
           <form name="registerForm">
            <field property="userName"
                 depends="required">
                   <arg key="label.username"/>
            </field>
            <field property="passWord"
                 depends="required,maxlength">
                    <arg0 key="label.password"/>
                    <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                    <var>
                       <var-name>maxlength</var-name>
                       <var-value>8</var-value>
                    </var>
            </field>          
            <field property="phone"
                 depends="required,mask">
                    <arg key="label.phone"/>
                     <var>
                        <var-name>mask</var-name>
                        <var-value>^[0-9]*$</var-value>
                     </var>
            </field>
        </form>
   可以看到,form的name属性指定了具体的form即registerForm,下面对三个属性的验证规则只能用在registerForm上,如果这三个验证规则是通用的就好了,也就是说如果存在注册表单和修改表单的操作都能够使用这三个规则就好了,这时就要引入一个概念就是验证跟随操作,而不是绑定到具体的form上。例如注册表单和修改表单由于验证规则相同,则将三个验证规则放到具体的action上就行了,验证规则可以如下定义:
           <form name="/register">
            <field property="userName"
                 depends="required">
                   <arg key="label.username"/>
            </field>
            <field property="passWord"
                 depends="required,maxlength">
                   <arg0 key="label.password"/>
                   <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                    <var>
                      <var-name>maxlength</var-name>
                      <var-value>8</var-value>
                    </var>
            </field>          
            <field property="phone"
                 depends="required,mask">
                  <arg key="label.phone"/>
                    <var>
                      <var-name>mask</var-name>
                      <var-value>^[0-9]*$</var-value>
                    </var>
            </field>
        </form>
           <form name="/editregister">
            <field property="userName"
                 depends="required">
                   <arg key="label.username"/>
            </field>
            <field property="passWord"
                 depends="required,maxlength">
                   <arg0 key="label.password"/>
                   <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
                   <var>
                     <var-name>maxlength</var-name>
                     <var-value>8</var-value>
                   </var>
            </field>          
            <field property="phone"
                 depends="required,mask">
                    <arg key="label.phone"/>
                    <var>
                        <var-name>mask</var-name>
                        <var-value>^[0-9]*$</var-value>
                    </var>
            </field>
        </form>
上面form的name属性已不再是struts-config.xml中定义的form的name,而是其中定义的action的path属性值。
为了解决这个问题,Validator提供了两个附加的ActionForm子类,它使你能够将验证与操作相关联,而不是与Form Bean相关联。这样你就可以根据哪个操作正在使用Form Bean来指定把哪些验证用于该Form Bean了。
 
 五、创建Validation.xml
     下面介绍一下validation.xml配置文件的标签:
<form-validation></form-validation>是总框架。
<formset></formset>是对Form里的数据进行配置。
<form name="ActionForm对应的名称"></form>对一个ActionForm里的数据进行验证配置。
<field property="ActionForm里的属性名" depends="验证规则,可以是Validation-rules里定义好的也可以是自定义的验证规则">这里配置一个属性的验证内容。
<arg0 name="对应的验证规则名称" key="可以直接填入数值,也可填入变量表达式:${var:变量名}" resource="true/false"(代表是否从资源文件中读取信息,否则Key的值以参数的形式返回)>
<var></var>定义一个变量的标签体,可以在里面具体设置变量的名称以及数值。
<var-name>对应Key里定义的变量名称</var-name>
<var-value>值</var-value>
<msg name="对应的验证规则名称" key="资源文件中定义的变量名称">这里定义了信息变量后,会默认定义的信息变量。
在验证规则中大部分可以使用已经预定义好的规则,它们在validator-rules.xml里,当然我们自己也可以定义规则。
其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。这个value属性用来指定validator-rules文件和具体的验证文件。
 
1)根元素:
validators.xml文件的“根元素(Root)”是form-validation,意味着整个文件的内容包含在“<form-validation>”和“</form-validation>”之间,
 
2)元素global:
这个东西包含constant子元素,用来定义一个全局的“验证限制”,以便在这个文件的其他地方使用这些验证规则。
例如:
    <global>
        <constant>
            <constant-name>userName</constant-name>
            <constant-value>^/s*[/w-]{0,30}$</constant-value>
        </constant>
        <constant>          
            <constant-name>password</constant-name>
            <constant-value>^/s*[./w@#!$%^*()-]{6,20}/s*$</constant-value>
        </constant>
        <constant>      
            <constant-name>email</constant-name>           
            <constant-value>^/s*([A-Za-z0-9]+(/./w+)*@([/w-]+/.)+/w{2,3})/s*$</constant-value>
        </constant>
    </global>
 
完整实例如下:
<form-validation>
    <global>
        <constant>
            <constant-name>userName</constant-name>
            <constant-value>^/s*[/w-]{0,30}$</constant-value>
        </constant>
        <constant>          
            <constant-name>password</constant-name>
            <constant-value>^/s*[./w@#!$%^*()-]{6,20}/s*$</constant-value>
        </constant>
        <constant>      
            <constant-name>email</constant-name>           
            <constant-value>^/s*([A-Za-z0-9]+(/./w+)*@([/w-]+/.)+/w{2,3})/s*$</constant-value>
        </constant>
    </global>
 <formset>
    <form name="employeeActionForm">
    <field property="vname" depends="required,maxlength">
      <arg0 key="employee.name"/>
      <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
      <var>
        <var-name>maxlength</var-name>
        <var-value>10</var-value>
      </var>
    </field>
    <field property="vsex" depends="required,maxlength">
      <arg0 key="employee.sex"/>
      <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
      <var>
        <var-name>maxlength</var-name>
        <var-value>5</var-value>
      </var>
    </field>
    <field property="vage" depends="required,integer,intRange">
      <arg0 key="employee.age"/>
      <arg1 name="intRange" key="${var:min}" resource="false"/>
      <arg2 name="intRange" key="${var:max}" resource="false"/>
      <var>
        <var-name>min</var-name>
        <var-value>1</var-value>
      </var>
      <var>
        <var-name>max</var-name>
        <var-value>100</var-value>
      </var>
    </field>
    <field property="vmoney" depends="integer">
      <arg0 key="employee.money"/>
    </field>
    </form>
 </formset>
</form-validation>
 
对部分元素的解释:
field元素定义了对特定属性的验证。