Struts框架我想大家都不会陌生,其提供的validator验证框架在开发中也经常被使用,用来辅助Struts通过配置实现服务端的数据有效性验证.但是在开发中经常会有这样的烦恼.我们所使用的ActionForm现在多数使用DynaActionForm来实现,这种ActionForm的实现的特点在于,我们无须给出自定义的ActionForm的实现,而只要在struts-config.xml中进行配置就行了,但很多时候,我们将一个ActionForm公用到多个Action(两者通过name属性来关联),这时麻烦出来了.由于不同业务处理对数据的有效性验证的要求略有不同,这对处理数据验证的validator框架提供了一个要求----如何根据不同的业务请求,对同一个ActionForm进行不同的数据验证了?
      
幸运的是,validator框架中提供了对这类要求的出来,我们来看看.
       
笔者使用的Struts的版本为1.2.9
       使用Validator框架需要将org.apache.struts.validator.ValidatorPlugIn类作为插件,配置到Struts-config.xml

如:
  

      将两个文件validator-rules.xmlvalidation.xml的文件路径做为参数设置到名字为pathname的参数中,并用逗号隔开。(validator-rules.xml文件主要是设置一些验证规则,而validation.xml文件是用来配置需要进行验证的Form信息,具体的文件内容在这里不多解释)

使用DynaValidatorForm的话,则只需要在struts-congfig.xml文档中给出相应的<form-bean>配置如图:
   
    并且在validation.xml中给出相应的验证配置:
   
    

    其中 <form>元素的name属性值与struts-config.xml中的<form-bean>元素的name属性值对应,并在<form>元素中给出相应的属性验证信息。这是我们传统的配置方式。

       那如果需要与业务处理请求连动,则需要修改几个地方。

       首先<form-bean>type属性必须修改为

       org.apache.struts.validator.DynaValidatorActionForm ,如下图: 
   
    

    然后,将对应这个ActionFormAction配置信息修改以下

将其attribute属性设置为“editForm(Acton元素的attribute属性是用来设置该Action对应的ActionForm对象在scope中所对应的key): 

然后,将对应这个
ActionFormAction配置信息修改以下将其attribute属性设置为“editForm(Acton元素的attribute属性是用来设置该Action对应的ActionForm对象在scope中所对应的key):

    其他的均不改变,由于我们在validation.xml文档中给出的是action元素的path属性值,而path属性值又正是,不同action区分的唯一标记,这样根据不同的action我们就能对同一个ActionForm给出不同的验证规则了。

那它是怎么做到的了?

       Struts框架中,我们使用ActionForm来进行数据验证

    从上面的这张简易的类图上我们可以看出,各个ActionForm对象的关系,其中来自org.apache.struts.validator包中的DynaValidatorFormDynaValidatorActionForm是我们在结合Validator框架的时候需要使用的。原来DynaValidatorActionFormDynaValidatorForm的父类。其都有一个getValidationKey()方法(这个方法在所有的Validator包下的Form类中都有),该方法在DynaValidatorForm中的实现为:

public String getValidationKey(ActionMapping mapping,

                                   HttpServletRequest request) {

 

        return mapping.getAttribute();

}

根据封装了action配置信息的actionMapping对象获取该actionattribute属性值,由该值对应的actionForm对象的name来寻找validation.xml中的验证配置信息。

而在DynaValidatorActionForm中我们看到的getValidationKey的方法实现是这样的:

public String getValidationKey(ActionMapping mapping,

                                   HttpServletRequest request) {

 

     return mapping.getPath();

}

则是返回的是mapping对象的path信息,这个信息正是该action对象的请求路径

而在他们的validate方法中,都是通过getValidationKey来获取验证的关键字寻找对应的验证标准进行数据验证。而DynaValidatorActionFormDynaValidatorForm的子类,它只是将该方法重写了一次。

       这样就能解释什么DynaValidatorFormDynaValidatorActionForm的验证机制不同吧,关键是他们获取验证信息的方法getValidationKey实现不同。J

       通过DynaValidatorActionForm,我们就可以根据action的不同,对ActionForm进行不同的数据验证了,这样大大减少了重复代码,提高了代码的复用性。