`

用Validator检查你的表单

阅读更多
没有[color=gray]Validator,你就不得不编写验证表单数据所需的全部代码,并把它放入Form Bean对象的validate( )方法中。对于想在其上进行数据验证的每个Form Bean域来说,都需要编写逻辑代码来实现验证。此外,你还必须编写代码来存储验证失败时的出错消息。
有了Validator,你就不必在Form Bean中编写用于验证或存储错误消息的任何代码。相反,Form Bean提供了Validator的一个ActionForm子类,它提供验证或存储错误消息的功能。

可把Validator框架作为一个可用于Form Bean验证的可插入的验证例行程序系统来进行安装。每个验证例行程序都只是一个Java方法,负责执行特定类型的验证任务,验证可能通过,也可能失败。 默认情况下,Validator与几个有用的验证例行程序封装在一起来提供,这些例行程序能满足大多数情况下的验证要求。但是,如果Validator框架没有提供你需要的验证例行程序,那么你可以自己创建定制的验证例行程序,并将它插入到该框架中。此外,Validator还支持服务器端和客户端(JavaScript)的验证,而Form Bean只提供服务器端验证界面。

Validator使用两个XML配置文件来分别确定安装哪个验证例行程序和如何将它们应用于给定的应用程序。第一个配置文件validator-rules.xml说明应该被插入到框架中的验证例行程序,并提供每个验证的逻辑的名称。validator-rules.xml文件还定义了每个验证例行程序的客户端JavaScript代码。可以配置Validator让它把这个JavaScript代码发送到浏览器上,这样验证就可以在客户端和服务器端进行了。

第二个配置文件validation.xml确定哪个验证例行程序应用到哪个Form Bean。文件中的定义使用struts-config.xml文件给出的Form Bean的逻辑名称以及validator-rules.xml文件给出的验证例行程序的逻辑名称,以便把二者关联起来。

使用Validator框架包括启用Validator插件、配置Validator的两个配置文件,以及创建提供Validator的ActionForm子类的Form Beans。下面详细解释如何配置和使用Validator。

启用Validator插件

虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中添加下面的插件定义。


<!-- Validator Configuration -->
<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插件。在初始化时,该插件装入由路径名属性指定的、用逗号分隔的Validator配置文件清单。每个配置文件的路径应该用与Web应用程序的相关的路径来指定,如前面的例子所示。

请注意,你的应用程序的struts-config.xml文件必须与Struts Configuration Document Type Definition(Struts配置文档类型定义,DTD)一致,后者规定文件中元素出现的顺序。所以,你必须把Validator插件定义放到该文件的适当位置。确保文件中元素适当排列的最简便方法就是使用诸如Struts Console的工具,它自动格式化你的配置文件,以便与DTD保持一致。

配置validator-rules.xml

Validator框架可以设置为可插入系统,其验证例行程序仅仅是插入到该系统中执行具体验证的Java方法。validator-rules.xml文件说明性地插入Validator用于执行验证的验证例行程序中。Struts示例应用程序带有这个文件的预配置拷贝。在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定制的验证。

清单1 是一个示例validator-rules.xml文件,说明如何将验证例行程序插入到Validator中。validator-rules.xml文件中的每个验证例行程序都有自己的定义,它用validator标记声明,利用name属性为该验证例行程序指定逻辑名,并指定该例行程序的类和方法。该例行程序的逻辑名称供该文件中的其他例行程序以及validation.xml文件中的验证定义用于引用该例行程序。

请注意,validator标记放在javascript的标记中,javascript标记用于定义客户端JavaScript代码,以便在客户端执行与服务器端相同的验证。

提供的验证程序

默认情况下,Validator中包括几个基本验证例行程序,你可以用它们来处理大多数验证问题。这些例行程序具有逻辑名称,如required(用于输入要求的值)、CreditCard(用于输入信用卡号码值)、email(用于输入电子邮件地址值),等等。

创建Form Bean

为了使用Validator,你的应用程序的Form Bean必须归到Validator的ActionForm的某一子类,而不是ActionForm本身。Validator的ActionForm子类提供了ActionForm的validate( )方法(它嵌入到Validator框架中)的实施过程。你不必从头编写验证代码并把它投入validate( )方法中,相反,可以完全忽略该方法,因为Validator为你提供了验证代码。

与Struts提供的核心功能相类似,Validator提供给你两种可供选择的方法来创建Form Bean。 你可以选择的第一种方法就是像下面这样创建一个特定的Form Bean对象:


package com.jamesholmes.minihr;

import org.apache.struts.validator
.ValidatorForm;


public class LogonForm extends ValidatorForm {
  private String username;
  private String password;
 
  public String getUsername() {
    return username;
  }
 
  public void setUsername(String
username) {
    this.username = username;
  }


  public String getPassword() {
    return password;
  }
public void setPassword(String
password) {
    this.password = password;
  }
}

这个类与你不是用Validator所创建的类相似,但它提供ValidatorForm而不是ActionForm。这个类也不提供ActionForm的空reset( )和validate( )方法的实施过程,因为ValidatorForm提供了相应过程。

在struts-config.xml文件中配置这个特定Form Bean的方法与配置正则Form Bean的方法相同:


<form-beans>
  <form-bean name="logonForm"
            type="com.jamesholmes
  .minihr.LogonForm"/>
</form-beans>

用表单标记的name属性给特定Form Bean指定的逻辑名是在定义validation.xml文件中的验证时所使用的名称,如下所示:


<!DOCTYPE form-validation
PUBLIC "-//Apache Software Foundation//
       DTD Commons Validator Rules
       Configuration 1.0//EN"
       "http://jakarta.apache.org/
      commons/dtds/validator_1_0.dtd">


<form-validation>
  <formset>
    <form name="logonForm">
      <field property="username"
            depends="required">
        <arg0 key="prompt.username"/>
      </field>
    </form>
  </formset>
</form-validation>

Validator使用该表单标记的name属性的值将验证定义与要应用这些定义的Form Bean的名称相匹配。

创建Form Bean时可以选择的第二种方法是在struts-config.xml文件中定义一个动态Form Bean,如下所示:


<form-beans>
  <form-bean name="logonForm"
            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>

动态Form Bean不要求创建特定的Form Bean对象;相反,要定义Form Bean应该具有的属性和类型,而Struts为你动态创建Form Bean。 Validator允许你使用这个概念,就像在核心Struts中使用这个概念一样。与使用Validator的惟一区别就是要指定Form Bean是org.apache.struts.validator.DynaValidatorForm类型,而不是org.apache.struts.action.DynaActionForm类型。

分配给动态Form Bean的逻辑名是在定义validation.xml文件中的验证时使用的名称。Validator使用与之相匹配的名称将这些验证与Form Bean联系在一起。

除了创建Form Bean的这两种标准方法之外,Validator还提供了一个高级特性,用于将多个验证定义与一个Form Bean定义联系起来。当你使用基于validatorForm或基于DynaValidatorForm的Form Bean时,Validator使用struts-config.xml文件中的Form Bean的逻辑名称,将Form Bean映射到validation.xml文件中的验证定义。这种机制在大多数情况下非常有用,但在某些时候,Form Bean要在多个操作中共享。 一个操作可能使用Form Bean的所有域(fields),而另一个操作可能只使用这些域的一个子集。因为验证定义被连接到Form Bean,所以只使用域的一个子集的操作就无法绕过对未使用域的验证。当验证Form Bean时,就会对未使用的域生成错误消息,因为Validator无从知道不去验证未使用的域,它只是简单地把它们看作缺失或无效。

为了解决这个问题,Validator提供了两个附加的ActionForm子类,它使你能够将验证与操作相关联,而不是与Form Bean相关联。这样你就可以根据哪个操作正在使用Form Bean来指定把哪些验证用于该Form Bean了。对于特定的Form Bean,你要像下面这样声明org.apache.struts.validator.ValidatorActionForm子类:


public class AddressForm extends ValidatorActionForm {
  ...
}

对于动态Form Bean,在struts-config.xml文件中为Form Bean定义指定org.apache.struts.validator.DynaValidatorActionForm的类型,如下所示:


<form-bean name="addressForm"
          type="org.apache.struts
.validator.DynaValidatorActionForm">
  ...
</form-bean>

在validation.xml文件中,把一组验证映射到一个操作路径,而不是映射到Form Bean名,因为如果你定义了Create Address和Edit Address两个操作(它们使用同一个Form Bean),那么每个操作都会有一个惟一的操作名,如下所示:


<action-mappings>
  <action path="/createAddress"
         type="com.jamesholmes
  .minihr.CreateAddressAction"
         name="addressForm"/>
  <action path="/editAddress"
         type="com.jamesholmes
  .minihr.EditAddressAction"
         name="addressForm"/>

</action-mappings>

下面的validation.xml文件片断显示了两组验证,它们用于同一个Form Bean,但却有不同的操作路径:


<formset>
  <form name="/createAddress">
    <field property="city"
          depends="required">
      <arg0 key="prompt.city"/>
    </field>
  </form>
  <form name="/editAddress">
    <field property="state"
          depends="required">
      <arg0 key="prompt.state"/>
    </field>
  </form>
</formset>

因为Form Bean要么属于ValidatorActionForm子类,要么属于DynaValidatorActionForm子类,所以Validator知道用一个操作路径代替Form Bean的逻辑名称来找出用于Form Bean的验证。

配置validation.xml文件

validation.xml文件用于声明将应用到Form Beans的一组验证。要验证的每个Form Bean在这个文件中都有自己的定义。在这个定义中,指定要应用到该Form Bean的各域的验证。下面是一个validation.xml文件的例子,说明如何定义验证:


<!DOCTYPE form-validation
PUBLIC "-//Apache Software Foundation//
       DTD Commons Validator Rules
       Configuration 1.0//EN"
       "http://jakarta.apache.org/
      commons/dtds/validator_1_0.dtd">

<form-validation>
  <formset>
    <form name="logonForm">
      <field property="username"
            depends="required">
        <arg0 key="prompt.username"/>

      </field>
      <field property="password"
            depends="required">
        <arg0 key="prompt.password"/>
      </field>
    </form>
  </formset>
</form-validation>

validation.xml文件的第一个元素是form-validation。这个元素是该文件的主元素,而且只定义一次。在form-validation元素内定义form-set元素,它包括多个表单元素。一般来说,在文件中只定义一个form-set元素,但是如果要将验证国际化,那就要在每个地方单独使用一个form-set元素。

每个表单元素使用name属性将名称与其所包含的域验证集关联起来。Validator使用这个逻辑名称将这些验证映射到在struts-config.xml文件中定义的一个Form Bean。根据要验证的Form Bean的类型,Validator力求将该名称与Form Bean的逻辑名称或操作路径相匹配。在表单元素内,field元素定义要应用到Form Bean的特定域的验证。field元素的property属性对应于特定Form Bean中的域名。depends属性利用validator-rules.xml文件指定验证例行程序的逻辑名称,这些例行程序将应用到域验证中。

配置ApplicationResources.properties

Validator使用Struts的资源绑定(Resource Bundle)机制将错误消息具体化。不用在框架中对错误消息进行硬编码,Validator使你能在ApplicationResources.properties文件中为一个消息指定一个键值,如果验证失败则将返回该键值。validator-rules.xml文件中的每个验证例行程序都用validator标记的msg属性指定错误消息的键值,如下所示:


<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.ActionErrors, javax.servlet
.http.HttpServletRequest"
          msg="errors.required">

如果在验证例行程序运行时验证失败,则返回与msg属性指定的键值对应的消息。

下面的片段显示来自ApplicationResources.properties文件的验证出错时的默认消息集,它们由Struts示例应用程序提供。每个消息的键值对应于每个由validator-rules.xml文件中的验证例行程序所指定的消息,它们由Struts示例应用程序提供。


# Error messages for Validator framework validations
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} 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.0.   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 not a valid credit card number.
errors.email={0} is an invalid e-mail address.

请注意,每条消息都有占位符,形式为{0}、{1}或{2}。在运行期间,占位符被另一个值代替,如所验证的域的名称。这一特性特别有用,它使你能够创建可被几个不同的域重复使用的通用验证错误消息。

例如,下面给出required验证的错误消息errors.required:


errors.required={0} is required.

当你使用validation.xml文件中的该required验证时,必须定义用于替换该错误消息中的{0}的值,如下所示:


<form name="auctionForm">
  <field property="bid" depends="required">
    <arg0 key="prompt.bid"/>
  </field>
</form>

错误消息最多可以有4个占位符:{0}和{3}。这些占位符分别称为arg0到arg3,你可以通过使用arg0~arg3标记来指定它们。在上面的例子中,arg0标记指定了用于替换{0}占位符的值。该标记的key属性指定来自ApplicationResources.properties文件的一个消息键值,它的值用于替换占位符,如下所示: 下一步

阅读
关于Validator的更多文章
jakarta.apache.org/commons/validator

关于Struts Console的更多文章
www.jamesholmes.com/struts



prompt.bid=Auction Bid

使用消息键值代替占位符的值,这一方法使你不必在validation.xml文件中对替换值反复硬编码。但是,如果你不想使用Resource Bundle的键值/值机制来指定占位符的值,则可以使用arg0标记的如下语法显式地指定占位符的值:


<arg0 key="Auction Bid" resource="false"/>

在这个例子中,resource属性的值设为false,以便通知Validator要把该key属性指定的值作为占位符的值,而不要作为ApplicationResources.properties文件中消息的一个键值。

启用客户端验证

Validator除了提供了简化服务器端表单数据验证过程的框架外,它还提供了执行客户端验证时易于使用的方法。在validator-rules.xml文件中定义的每一个验证例行程序都可以随意指定JavaScript代码,这些代码可以在浏览器(客户端上的)中运行,从而执行与服务器端进行的验证相同的验证过程。在客户端进行验证时,除非所有表单都通过验证,否则这些表单不允许被提交。

为了启用客户端验证,必须在每个需要验证的JSP中放上Struts HTML Tag Library(标记库)的javascript标记,如下所示:


<html:javascript formName="logonForm"/>

javascript标记要求使用formName属性来为想要对其执行验证的表单指定validation.xml文件中给出的表单定义名,如下所示:


<form name="logonForm">
  <field property="username"
        depends="required">
    <arg0 key="prompt.username"/>
  </field>
  <field property="password"
        depends="required">
    <arg0 key="prompt.password"/>
  </field>
</form>

为表单定义指定的服务器端的所有验证都将在客户端运行。由于客户端验证用JavaScript执行,所以可以有多种方法不去执行它。要确保验证过程总是能运行,不论你是否选择启用了客户端验证,Validator都在服务器端执行这些验证。

结论

Validator框架针对表单数据的验证提供了可配置的系统,从而为核心Struts框架添加了很多有价值的功能。通过把Validator框架用于你的应用程序,你可以节约时间并简化Struts应用程序的开发过程。 [/color]
分享到:
评论

相关推荐

    BootstrapValidator-0.5.3表单验证

    在实际开发中,你可能需要结合使用jQuery或者其他的JavaScript库来操作表单元素。同时,记得在HTML中为每个需要验证的输入字段添加`data-bv-*`属性,以便BootstrapValidator识别并应用相应的验证规则。 总的来说,...

    好用的bootstrapvalidator表单验证

    6. **兼容性和优化**:确保BootstrapValidator与你当前使用的Bootstrap版本兼容,同时考虑移动设备和不同浏览器的兼容性问题。 在压缩包文件"bootstrapvalidator--0.4.5"中,可能包含了该版本的BootstrapValidator...

    bootstrap表单验证插件bootstrapvalidator

    通过上述介绍,我们可以看出BootstrapValidator是一个功能强大且易于使用的表单验证工具,它大大简化了前端数据验证的复杂性,提升了表单交互的用户体验。在项目中使用这个插件,无疑能帮助开发者更高效地完成表单...

    validator 通用JS表单验证类

    - `validator`内含的使用教程是开发者学习如何利用该类的关键资源,通常包括如何创建验证规则、如何绑定到表单元素、如何处理验证结果等内容。 - 教程可能涵盖实例代码、错误处理和自定义扩展等主题,帮助开发者...

    jquery表单验证插件Bootstrap Validator

    BootstrapValidator的使用非常直观,通过在表单元素上添加特定的属性或使用JavaScript进行初始化配置。一个基本的示例: ```html 用户名: &lt;!-- 更多表单元素... --&gt; ``` 然后在JavaScript中初始化验证...

    bootstrapvalidator

    BootstrapValidator是一款广泛应用于Web...了解并掌握以上知识点,你就能灵活地使用BootstrapValidator为你的Web应用创建功能强大的表单验证系统。这个插件的易用性和灵活性使得它成为开发者首选的前端验证工具之一。

    bootstrapvalidator是一款简单实用的Bootstrap3表单验证jQuery插件

    通过使用`.validate()`方法,插件可以在表单提交前检查所有字段,或者通过`.bootstrapValidator('validateField', 'fieldName')`对单个字段进行验证。 4. **自定义错误消息**: 开发者可以通过设置`data-message`...

    Javascript表单验证控件(Validator v1.05)

    - **表单验证**:是指在用户提交表单前,通过JavaScript检查输入数据的过程,以防止无效或错误的信息被发送到服务器。 - **验证规则**:是定义在特定字段上的条件,例如“非空”,“邮箱格式”,“数字范围”等,...

    表单验证Validator V4.0(html文件)

    在HTML表单验证中,Validator V4.0提供了丰富的验证规则,如非空检查、长度限制、邮箱格式验证、电话号码验证等。这些规则可以通过简单的配置就能应用到表单字段上,无需复杂的JavaScript代码。通过使用Validator,...

    validator验证多个Name表单.zip_validator验证多个Name表单

    在这个项目中,"validator验证多个Name表单",我们看到的是如何使用Validator库来验证多个名为"Name"的表单字段。 首先,`validator`库提供了多种验证方法,如`isAlpha`(字母验证)、`isNumeric`(数字验证)、`...

    表单验证类 Validator JS 及文档 示例代码

    Validator JS是一个专门用于前端表单验证的JavaScript库,它利用正则表达式来实现复杂的数据校验。下面将详细介绍Validator JS的使用、功能以及示例代码。 首先,Validator JS的核心是它的验证类。这个类提供了多种...

    Validator

    **Validator:通用表单验证工具详解** 在Web开发中,表单验证是不可或缺的一部分,它确保用户输入的数据符合预设的规则,从而提高数据的准确性和安全性。`Validator`就是一个专注于此任务的JavaScript库,它提供了...

    表单验证,validator

    Validator是一个常用的JavaScript库,用于确保用户在提交表单时输入的数据符合预设的规则和格式,从而提升用户体验并减少服务器端的压力。在这个压缩包中,包含的文件为我们提供了关于Validator的实践应用和相关说明...

    springMVC Validator表单验证

    在表单中,可以使用条件语句检查`BindingResult`对象是否有错误,并显示相应的错误消息。 6. **配置**:为了使验证工作,SpringMVC的配置文件(如`spring-servlet.xml`)需要包含`HandlerAdapter`和`...

    myValidator

    3. **实时验证**:为了提升用户体验,`myValidator`可能支持实时验证,即用户在输入时就能看到错误提示,而无需等待整个表单填写完毕后一次性检查。 4. **错误提示**:良好的错误提示是提高用户满意度的关键。`my...

    validator2

    ### 使用Struts Validator框架 #### 一、简介与配置 在Struts项目中集成Validator功能是提高表单验证效率及准确性的重要步骤。Struts通过一个内置的插件(Plugin)来支持Validator框架,该插件名为`org.apache....

    Struts Validator 开发指南

    这段代码指示 Struts 使用 `ValidatorPlugIn` 类,并指定了两个配置文件的位置:`validator-rules.xml` 和 `validation.xml`。`validator-rules.xml` 文件定义了各种预置的验证器,而 `validation.xml` 文件则根据...

    validator框架的应用

    当表单提交时,Validator会自动检查这些规则并返回错误信息。 2. **动作级验证**:这种验证发生在整个动作执行之前,通常是对多个字段或者业务逻辑的整体检查。开发者可以在Action类中定义一个或多个验证方法,如`...

    Struts1的validator验证框架

    使用`&lt;html:text&gt;`标签绑定表单字段到ActionForm,用`&lt;html:errors&gt;`显示验证错误: ```html ``` 4. **在Action中调用验证逻辑**: 当Action执行时,Struts会自动调用Validator框架进行数据验证,无需在...

    Struts简单的Validator 表单验证类

    在实际应用中,Validator框架会自动与ActionForm对象绑定,当用户提交表单时,Struts会调用对应的验证方法来检查数据。如果数据不合法,框架会将错误信息存储在ActionForm的`fieldErrors`属性中,然后可以通过Action...

Global site tag (gtag.js) - Google Analytics