在Struts中使用Validator框架按Action分类对数据进行验证

本文介绍如何利用Struts框架中的Validator插件,根据不同业务需求对同一ActionForm执行不同的数据验证规则。通过配置DynaValidatorActionForm及调整struts-config.xml文件,实现灵活的数据验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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.xml和validation.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 ,如下图: 
   
    
    然后,将对应这个ActionForm的Action配置信息修改以下
将其attribute属性设置为“editForm(Acton元素的attribute属性是用来设置该Action对应的ActionForm对象在scope中所对应的key): 

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

    其他的均不改变,由于我们在validation.xml文档中给出的是action元素的path属性值,而path属性值又正是,不同action区分的唯一标记,这样根据不同的action我们就能对同一个ActionForm给出不同的验证规则了。
那它是怎么做到的了?
       在Struts框架中,我们使用ActionForm来进行数据验证

    从上面的这张简易的类图上我们可以看出,各个ActionForm对象的关系,其中来自org.apache.struts.validator包中的DynaValidatorForm和DynaValidatorActionForm是我们在结合Validator框架的时候需要使用的。原来DynaValidatorActionForm是DynaValidatorForm的父类。其都有一个getValidationKey()方法(这个方法在所有的Validator包下的Form类中都有),该方法在DynaValidatorForm中的实现为:
public String getValidationKey(ActionMapping mapping,
                                   HttpServletRequest request) {
 
        return mapping.getAttribute();
}
根据封装了action配置信息的actionMapping对象获取该action的attribute属性值,由该值对应的actionForm对象的name来寻找validation.xml中的验证配置信息。
而在DynaValidatorActionForm中我们看到的getValidationKey的方法实现是这样的:
public String getValidationKey(ActionMapping mapping,
                                   HttpServletRequest request) {
 
     return mapping.getPath();
}
则是返回的是mapping对象的path信息,这个信息正是该action对象的请求路径
而在他们的validate方法中,都是通过getValidationKey来获取验证的关键字寻找对应的验证标准进行数据验证。而DynaValidatorActionForm是DynaValidatorForm的子类,它只是将该方法重写了一次。
       这样就能解释什么DynaValidatorForm和DynaValidatorActionForm的验证机制不同吧,关键是他们获取验证信息的方法getValidationKey实现不同。J
       通过DynaValidatorActionForm,我们就可以根据action的不同,对ActionForm进行不同的数据验证了,这样大大减少了重复代码,提高了代码的复用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值