Struts中使用Validator框架(2)

原创 2004年10月16日 22:45:00
资源绑定

资源绑定用于帮助消息本地化和一些其它文本信息的本地化处理。由于它减少了应用程序的许多冗余的硬编码,故对应用程序有很大益处。比如,如果你要在JSP页面中要使用一个“Name”标签时,你可以把这个字符串放到一个资源绑定中,然后使用资源绑定的一个逻辑键值引用这个字符串,而不是直接使用这个字符串,这样做的好处在于,当你想把这个字符串改为“First Name”时,你只需在资源绑定中修改一处即可,而不必修改整个应用程序的全部代码。

对于Validator框架,当验证规则失败的时候,可以从资源绑定中创建错误信息。Validator框架提供几种默认消息,同一般的应用程序消息资源放在一起。如下:

#Normal resource bundle messages
label.firstName=First Name
label.lastName=Last Name

#Error messages used by the Validator
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.
...


当一个验证规则失败时,这个验证规则创建一个错误信息。框架将自动给消息插入参数。比如说,我们使用例一和例二的验证规则,当checkoutForm的firstName属性为空时,我们会看到这样的错误信息:

First Name is required.

你也可以修改绑定或配置文件来显示你喜欢的消息。

“挂”Validator到Struts上

现在我们已经了解了Validator框架,感觉蛮不错吧!下面我们将快速的讲一下我们是如何轻松地在Struts框架中使用Validator框架的。

首先要做的就是让Struts框架认识Validator框架。你可以使用Struts1.1的Plug-in新特性来实现它。只要在Struts配置文件中增加下面代码即可:

<plug-in classname="org.apache.struts.validator.ValidatorPlugIn">
  <set-property 
    property="pathnames" 
    value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>


这样Struts就可以自动识别Validator框架了。

另外一个必需的步骤就是创建ActionForm Bean(标准的或是动态的)和确保Validator框架的配置文件是可用的,这样就搞定了。并不需要作一些调用验证规则或做其他具体的事情,Struts框架会自动完成这些工作,这就是所谓的基于声明的配置。然后当验证规则失败的时候,你就可以用JSP标签看到显示的错误信息了。

创建自己的Validator

尽管Validator框架已为大家提供了Web应用程序需要的大多数验证规则,但有时我们还是需要创建一些自己的验证规则。幸运的,Validator框架的扩展性相当好,为你提供了这种便利,而这样做对程序造成的影响相当小的。

创建自己的Validator并不是一件难事,只要创建一个实现这个规则的Java类即可。比如,(在国外)要去超市买二锅头,要验证顾客是否达到合法饮酒年龄。你可以使用已有的验证规进行验证,但我们觉得创建一个验证规则进行验证要更加直截了一些。验证饮酒年龄规则Validator Java代码如下:

例三:自定义验证规则

import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.util.StrutsValidatorUtil;

public class NewValidator implements Serializable{

  public static boolean validateDrinkingAge( Object bean,
    ValidatorAction va, 
    Field field, 
    ActionErrors errors, HttpServletRequest request) {

    String value = null;
    if (isString(bean)) {
      value = (String) bean;
    } else {
      value = 
        ValidatorUtil.getvalueAsString(bean, field.getProperty());
    }
    String sMin = field.getVarvalue("drinkingAge");

    if (!GenericValidator.isBlankOrNull(value)) {
      try {
        int ivalue = Integer.parseInt(value);
        int drinkingAge = Integer.parseInt(sMin);

        if ( ivalue < drinkingAge ){
          errors.add(field.getKey(),
          StrutsValidatorUtil.getActionError(request, va, field));
          return false;
        }
      } catch (Exception e) {
        errors.add(field.getKey(),
        StrutsValidatorUtil.getActionError(request, va, field));
        return false;
      }
    }
  return true;
}

private static boolean isString(Object o) {
  if (o == null) {
    return (true);
  }
  return (String.class.isInstance(o));
 }
}


你创建完新的Validator之后,你只要把他加到现存的Validator框架的validator-rules.xml的列表中,你就可以像使用基本验证规则一样使用你自己创建的验证规则。

在非Struts应用程序中使用Validator框架

正像我们在前面谈到的,Validator框架最初是为在Struts框架中使用而设计的。可是,Validator框架设计的相当灵活,并没有直接把它耦合在Struts框架中,这样你就可以在普通的应用程序中也可以使用Validator框架来进行验证。但是,你必须执行一些必需的步骤。

你可以利用像在Web应用程序中一样使用配置文件。这也是使用Validatoe框架的另一个优点。你可以在Struts框架使用插件的方式来定位和装载这些文件。而在非Struts应用程序中你必须人为地手动的定位和装载这些配置文件。下面就是应用程序在启动时一般要调的方法:

...
ValidatorResources resources = new ValidatorResources();

InputStream rules = 
   ValidateExample.class.getResourceAsStream("validator-rules.xml");

ValidatorResourcesInitializer.initialize(resources, in);

InputStream forms = 
   ValidateExample.class.getResourceAsStream("validation.xml");

ValidatorResourcesInitializer.initialize(resources, forms);

...


这段代码片断创建了一个ValidatorResources实例,并根据两个配置文件进行了初始化。然后你就可以在你应用程序使用这个ValidatorResources对象验证你配置的JavaBean了。

例四向你展示如何使用已初始化的ValidatorResources对象来验证一个Person Bean。

例四:如何使用Validator验证你的Bean。

//假设我们已经创建和装配了一个CheckoutForm Bean对象
CheckoutForm form = new CheckoutForm();
//使用chekoutForm创建一个Validator
Validator validator = new Validator(resources, "checkoutForm");
//告诉Validator要验证哪个Bean
validator.addResource(Validator.BEAN_KEY, form);
//验证checkoutForm对象并存储验证结果
ValidatorResults results = validator.validate();


在例四中,我们看到我们把checkoutForm JavaBean的名字传给Validator类的构造器,这是为了告诉Validator实例使用哪套验证规则来验证这个Bean。

正如你看到的一样,在非Struts应用程序中使用Validator框架显得有点不自动化,但是它还是提供了比较灵活的解决方案。使用Validator框架的另一个好处就是把验证从源代码中分离到外部的配置文件中。这使我们可以把更多的时间放在我们的业务逻辑开发上。

客户端VS服务器端Validator

最后我们简单的阐述一下Validator框架对javascript的支持。因为有些应用程序需要执行一些客户端验证,在某些时候使用javascript进行一些客户端的验证是很有必要的。这里的客户端我们一般特指Web浏览器。

Validator框架提供使用配置文件中的规则动态和自动生成javascript验证规则的支持。对于每个元素,它可以有一个子元素和包含一些javascript代码。当包含一些自定义标签的JSP页面被解释时,javascript也被解释,并当表单提交时执行这些验证规则。这些叫javascriptValidatorTag的标签被包含在Struts的标签集中。这些标签可以像这样进行使用:

<?XML:NAMESPACE PREFIX = HTML />

笔者认为在需要时使用一定的javascript是可以接受的。当你需要执行一些客户端的验证时,使用Validator框架标签是也是一种不错的选择,而且支持根据用户的区域进行本地化。

结束语

到此为止,我给大家简单地介绍了Validator框架,这些其实是框架的一些表面的东西。这个框架的内容深不可测,仅正则表达式就可以写一本小册子。

像任何一个框架一样,Validator框架为大家提供的是一个基础的架构,你可以根据你的需求对其进行扩展和个性化。使用像Validator的框架的最重要的一点就是它们是经过千锤百炼,是技术的精华。你并不需重蹈前人失败的覆辙,你可以节省下时间把更多的精力集中在对业务逻辑的开发上。

作者简介:

Chuck Cavaness:毕业于Georgia Tech,获计算机工程与科学学位,在医疗,银行和B2B领域创建了许多Java企业系统,同时也是O'Reilly的Programming Jakarta Struts 和 Jakarta Struts Pocket Reference两本书的作者。
作者:Chuck Cavaness 译者:javaduke 

编程小语 ezerg

Struts中使用Validator框架

 Struts中使用Validator框架  每个应用程序都有责任确保它们插入到后台资料库的数据是合法有效的,毕竟,如果这些应用程序所依赖的数据一旦遭到了破坏,那将是灾难性的,那应用程序还能拿什么来使...
  • taorui
  • taorui
  • 2007年01月29日 11:27
  • 572

struts2使用Validator校验数据

需要对用户的输入数据进行验证,比如网站的注册,需要对各个数据项进行数据校验,Struts2提供了一些默认的校验器,比如数字的检测,邮箱的检测,字符串长度的检测等等.   常用的Validato...
  • sinat_35767703
  • sinat_35767703
  • 2017年03月28日 10:50
  • 156

2016-5-17 java验证框架 Validator的使用

在写实际项目中,对于入参总是需要进行大量的if判断去验证数据的合法性,虽然这是必要的,但是难免对于代码的层次结构和美观程度有着一定的影响。于是,在不堪一个controller中(或者其他类)if大量的...
  • qq_25152183
  • qq_25152183
  • 2016年05月17日 17:23
  • 1026

Struts Validator 框架的使用

Struts1.1及以上版本在提供了DynaActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架。   在使用Validator验证框架时,...
  • aw_vip
  • aw_vip
  • 2009年01月12日 14:10
  • 365

在Struts中使用Validator框架(1)

每个应用程序都有责任确保它们插入到后台资料库的数据是合法有效的,毕竟,如果这些应用程序所依赖的数据一旦遭到了破坏,那将是灾难性的,那应用程序还能拿什么来使自己正常运转呢?比如说,使用正规关系数据库的一...
  • ezerg
  • ezerg
  • 2004年10月16日 22:34
  • 1734

struts中使用validator

 刚开始用validator,需要注意较多的细节,再稍微明白些后,建议看看struts-example。为了抛砖引玉,写个例子:一。在struts-config.xml中加入:     value="...
  • nalis
  • nalis
  • 2007年05月03日 00:07
  • 831

struts中validator框架学习笔记

1.将ActionForm改为ValidatorForm,若是DynaActionForm,则将struts配置文件中的form对象改为DynaActionForm,因为要使用Validator进行验...
  • VSlogin
  • VSlogin
  • 2009年12月12日 22:45
  • 356

在struts中使用Validator框架

 在struts中使用Validator框架 Validator验证框架Validatro框架以成为Jakarta的公共项目的一部分,可以从http://jakarta....
  • susan5
  • susan5
  • 2009年03月03日 18:58
  • 241

在Struts中使用Validator框架(转载)

在Struts中使用Validator框架作者: Chuck Cavaness 原文: http://www.onjava.com/pub/a/onjava/2002/12/11/jakartastr...
  • atanlj
  • atanlj
  • 2006年05月12日 18:03
  • 541

在Struts中使用Validator框架

在Struts中使用Validator框架      每个应用程序都有责任确保它们插入到后台资料库的数据是合法有效的,毕竟,如果这些应用程序所依赖的数据一旦遭到了破坏,那将是灾难性的,那应用程序还能拿...
  • sumongh_pan
  • sumongh_pan
  • 2007年01月24日 11:35
  • 558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Struts中使用Validator框架(2)
举报原因:
原因补充:

(最多只允许输入30个字)