动态验证框架validator

Struts1.1及以上版本在提供了DynaActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架。

第一步:

提供国际化支持:动态验证框架的配置需要加入国际化,因为动态验证框架和国际化结合的和紧密。他读的是国际化消息文本,国际化配置    <message-resources parameter="MessageResources" />

第二步:

添加所需要的配置文件:在使用Validator验证框架时,需要用到二个基于XML的配置文件进行验证规则的配置,一个是validator-rules.xml(系统的规则文件),

在这个文件里有 <validator name="required"//必须输入
            classname="org.apache.struts.validator.FieldChecks"
               method="validateRequired"
         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"
                  msg="errors.required"/>//这一部分就是和国际化关联的,用于当错误是的提示信息,的对应着国际化文本MessageResources.properties内的内容

另一个是validation.xml(自己定义的规则文件)。这两个文件应该部署在相应的WEB应用中的WEB-INF文件夹下。此外validator还应在struts-config.xml中进行配置。

第三步:

在Struts-config.xml中配置Validator
   Validator框架是作为一个Struts插件配置到Struts应用中的,即Struts扩展中的PlugIn机制。通过在Struts配置文件中 配置Validator插件,Struts应用在启动的时候就能够知道Validator框架正在被使用,加载并初始化Validator框架。
   以下为示例:

注意:这些内容必须放在<message-resources>元素之后。该规则是由
"
http://struts.apache.org/dtds/struts-config_1_2.dtd "文件制定的。

<!-- 验证插件 -->    
  
< plug-in className ="org.apache.struts.validator.ValidatorPlugIn" >
    
< set-property property ="pathnames"    value ="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
    
< set-property property ="stopOnFirstError"    value ="false" />
</ plug-in >

stopOnFirstError属性的作用是指定客户端JS验证时是在遇见第一个时就返回还是全部处理完后将所有错误全部返回。

配置的各项参数的意思,首先className属性是插件的实现类,主要是用来提供增加的插件功能的,我们也可以自己来编写struts的插件。pathnames是这个插件的配置属性,它的值就是动态验证框架需要的配置文件的位置。一共需要2个配置文件,一个是验证框架需要的验证规则文件,这个不需要你来编写,struts1.3为我们提供。另一个是我们针对ActionForm来编写的验证文件,主要是描述哪些属性需要验证,需要哪些验证等等。这个是需要我们来编写的,也就是说,按照上图的配置,你需要在你的WEB-INF下新建一个validation.xml文件。

validation.xml的配置
validation.xml 文件是Validator框架需要的另一个配置文件。该文件是特定于应用程序的,由开发人员自己来创建。它描述了那些具体应用中的ActionForm所 使用的validator-rules.xml文件中的有效性验证规则。通过ActionForm在validation.xml文件中配置所需要的验证 规则,开发人员就不必将 验证的逻辑硬编码ctionForm的内部。一个简单的validation.xml文件代码如下:

<? xml version="1.0" encoding="GBK" ?>
<! DOCTYPE form-validation PUBLIC
           "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
           "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"
>
    
< form-validation >
        
<!-- global元素允许开发人员配置可以用在其他部分中的constant元素,也就是全局常量
             formset也可以有contant元素,定义局部常量
-->
        
< global >
            
< constant >
                
< constant-name > zip </ constant-name >
                
< constant-value > ^[a-zA-Z]*$ </ constant-value >
            
</ constant >
        
</ global >
        
        
< formset >
            
<!-- struts-config formBean中的name属性 -->
            
< form name ="dynaFormForm" >
                
<!--       视图组件中要验证的属性     验证规则 在validator-rules.xml中定义 -->
                
< field property ="userName"    depends ="required,minlength,maxlength" >     
                            
< arg key ="lable.userName" position ="0" /> <!-- 在资源文件中定义 -->
                            
<!-- 在本文件中设定最小值              false表明可在本文件中直接定义值 -->
                            
< arg key ="${var:minlength}" resource ="false" position ="1" />
                            
< var >      <!-- 在arg中访问 var的形式 ${var:minlength} -->
                                
< var-name > minlength </ var-name >
                                
< var-value > 3 </ var-value >
                                
<!-- var元素用来向验证规则传递参数 -->
                            
</ var >
                            
<!-- 在资源文件中设定最大值 -->                 
                            
< arg key ="lable.userName.maxlength" resource ="true" position ="2" />                             
                
</ field >

                
< field property ="userPwd" depends ="required,mask" >
                    
<!-- field元素的msg子元素指定验证规则对应的消息文本,该消息文本将 替代默认的消息文本,
                     即validatior-rules.xml中定义的消息文本。msg元素的值必须是应用程序消息资源包中某个消息资源的关键字。
-->
                    
< msg name ="mask" key ="registerForm.password.maskmsg" />
                    
<!-- arg元素可以来向消息文本传递参数。 -->
                    
< arg key ="lable.userPwd" />
                    
< arg key ="lable.mask" resource ="true" position ="1" />
                    
<!--
                     <var>
                         <var-name>mask</var-name>
                         <var-value>^[a-zA-Z]*$</var-value>
                         或者用${zip}代码value内容
                     </var>
-->
                
</ field >
            
</ form >
            

对应的资源文件如下:

lable.userName=用户名
lable.userName.maxlength=5
lable.userPwd=密码
lable.mask=^[a-zA-Z]*$
registerForm.password.maskmsg=测试消息

validation.xml中已经加了大量注释。

解释一下各参数的意思,form标签就是你的ActionForm的配置,由于你的工程很可能有多个ActionForm,那么在此验证文件里,你需要以form标签来分隔它们的配置.那么form标签里的name属性顾名思义就是你的form名称,这个和你在struts-config.xml里注册ActionForm的名字是一样的.field,就是你的ActionForm的属性,property是你的属性名字,depends是你要启用的验证规则,这个可以参考validator-rules.xml文件,当然,你也可以实现你自己的规则.在这里我启用的是required非空规则.最后的arg标签,这个是什么呢?我们可以看到刚才我们拷贝到资源文件里的错误消息有这么一条:errors.required={0}  is required.
那么我们既然刚才启用了required非空验证,那么这里的arg标签实际上就是配置这个{0}占位符的内容. arg标签里面的key属性对应资源文件里的内容.可以看到例子里有个key为dyncForm.username的非空验证属性的配置.那么在我资源文件里一定有一个dyncForm.username=username 这样的key=value值对.如果出现错误,那么提示的错误消息就是username is required.

 

 


而针对上例子的Struts-config.xml配置文件中的DynaActionForm配置如下:

     <!-- 动态FORM演示                          -->
      
< form-bean name ="dynaFormForm" type ="org.apache.struts.validator.DynaValidatorForm" >
      
< form-property name ="userName" type ="java.lang.String" />
      
< form-property name ="userPwd" type ="java.lang.String" />
    
</ form-bean >

注 意,要使用验证框架的FormBean必须是与Validator匹配的类:ValidationForm类或DynaValidationForm类, 及其子类ValidatiorActionForm和DynaValidatiorActionForm。它们都是ActionForm类的子类。ActionForm不要再继承org.apache.struts.action.ActionForm,而是继承org.apache.struts.validator.ValidatorForm或者org.apache.struts.validator.ValidatorActionForm.
如果你要使用动态ActionForm,那么就继承org.apache.struts.validator.DynaValidatorForm或者org.apache.struts.validator.DynaValidatorActionForm.

我 这里用的是动态的FormBean,因此类型我由org.apache.struts.action.DynaActionForm改为 org.apache.struts.validator.DynaValidatorForm,如果要验证普通的非动态的ActionForm如下:

<!-- 验证框架要用在非动态FormBean上时,该FormBean必须为ValidatorForm子类 -->
    
< form-bean name ="studentForm" type ="struts.form.StudentForm" />
    


我们就应该让StudentForm类继承自ValidationForm,否则达不到验证效果!

 


在jsp页面使用方法如下:

<h1>登录(validator框架服务器端验证)</h1>//采用struts标签
<hr>
 <html:form action="login1.do">
   username : <html:text property="username"/><html:errors property="username"/><br/>
   password : <html:password property="password"/><html:errors property="password"/><br/>
   <html:submit/>
  </html:form>

 

 

<h1>登录(validator框架客户端验证(javascript))</h1>
<hr>
<html:javascript formName="loginForm"/>//formName为ActionForm的名字
 <html:form action="login2.do" onsubmit="return validateLoginForm(this)">//这个函数validateLoginForm的名字是validate+ActionForm的名字
     username : <html:text property="username"/><br/>
    password : <html:password property="password"/><br>
   <html:submit/>
  </html:form>

 

 

 

 

 

 

http://liuyinhuan.javaeye.com/blog/273595

 

Struts提供了表单输入的自动验证功能,即使用validator动态验证框架。其使用步骤如下:

 

1、配置

     * 创建properties资源文件,如:

login.username=用户名

login.password=密码

 

errors.required={0},is required.

        

     * WEB-INF下添加validator-rules.xml文件(Struts自带的原验证规则)

    

     * WEB-INF下添加validation.xml文件(自定义验证规则,可多个),如:

<form-validation>

    <formset>

       <form name="loginForm">

          <field property="username" depends="required">

             <arg key="login.username"/>

          </field>

         

          <field property="password" depends="required">

             <arg key="login.password"/>

          </field>

       </form>

    </formset>

</form-validation>

         上面的规则表明要对loginForm表单输入框的usernamepassword验证,必须保证非空输入(required)

 

      * struts-config.xml中添加(将资源文件和验证规则文件引入):

   <message-resources parameter="res.MessageResource"/>

   <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

      <set-property

                    property="pathnames"

                    value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

   </plug-in>

      上面的<plug-in>元素表明验证类org.apache.struts.validator.ValidatorPlugIn将根据value指定的规则文件进行验证。

 

      * struts-config.xml中配置需要验证的ActionForm,我这里是使用动态ActionForm----就必须是DynaValidatorForm(也可自定义继承自ValidatorActionForm的需要验证的ActionForm,并去掉resetvalidate方法)

  <form-beans>

     <form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">

         <form-property name="username" type="java.lang.String"/>

         <form-property name="password" type="java.lang.String"/>

     </form-bean>

       

  </form-beans>

         

       * struts-config.xml中配置要验证页面相应的action时,加上validate=true

     <action path="/login1"

             type="cn.huan.struts.LoginAction"

             name="loginForm"

             scope="request"

             validate="true"

             input="/login1.jsp">

           <forward name="success" path="/login_success.jsp"/>

          

      </action>

 

 

 2、使用

 

       * 方法一:服务器端验证,如:

    <html:form action="login1.do">

         用户名:<html:text property="username"/><html:errors property="username"/><br>

         密码:<html:password property="password"/><html:errors property="password"/><br>

        <html:submit/>

   </html:form>

           如果没有输入值就提交就会显示提示信息:

 
 

       * 方法二:客户端验证(javascript),如:

   <html:form action="login2.do" onsubmit="return validateLoginForm(this)">

       用户名:<html:text property="username"></html:text><br>

       密码:<html:password property="password"/><br>

       <html:submit/>

   </html:form>

   <html:errors/>

   <html:javascript formName="loginForm"/>

          如果没有输入值就提交就会显示提示信息:

 

 

 

到此,动态验证框架做完。。。。

你可能感兴趣的:(Validator)