要在 Struts 项目中使用 Validator 功能 , 首先需要配置 Struts 项目 , 使其支持 Validator 框架 .Struts 通过一个插件 (Plugin) 来使 Struts 项目支持 Validator . 这个 Plugin Struts 默认提供 , 用户也可以自己开发自己的 Validator Plugin.Struts 默认提供的 Plugin :

org.apache.struts.validator.ValidatorPlugIn .

       用户必须在 struts-config.xml 文件中配置这个 Plugin , 才能使 Struts 项目支持 Validator . 配置方法比较简单 , 通过任何文本编辑器打开 struts-config.xml 文件 , 在这个文件的末尾加上下面的代码 , 重新启动 J2EE 服务器就可以实现对 Validator 的支持了 .

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

     <set-property  property="pathnames"

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

</plug-in>

Jbuilder 开发环境中可以通过下面的方法使 Struts 项目支持 Validator 框架 .

1.         在项目管理器中用鼠标右键点击 Web 项目 ( 在我们的项目中是 WebModule ).

2.         选择菜单的 “Properties…” 菜单项 .

3.         在弹出的对话框的左边树型结构中选中 “web” 节点 .

4.         在右边的 “JSP/Servlet frameworks” 框中勾选 “sturts1.1” 节点以及 “struts” 节点下的 “validation” 子节点 .

5.         点击 “OK” 按钮完成配置 .

6.         检查 struts-config.xml 文件 , 可以看到配置文件里已经加入了 Validator Plugin.

Validator-rules.xml 文件

Validator-rules.xml 文件是校验器的定义文件 . 指定了每一个校验器的基本信息和执行校验的 JavaScript 代码 .Struts 默认提供了十四个校验器 , 这些校验器可以满足我们平时项目开发中碰到的绝大多数的输入校验要求 . 如果这些校验器不能满足用户的校验要求 , 那么我们也可以开发自己的校验器 . 我们项目主就实现了一个校验密码的一致性的 Validator .

Struts 提供的校验器包括 Required Validator ,RequiredifValidator, MinLengthValidator , MaxLengthValidator , Mask Validator , Byte Validator , Short Validaotr , Integer Validator , Long Validator , Float Validator , Double Validator , Date Validator , Range Validator , IntRangeValidator , FloatRangeValidator , CrediteCardValidator , Email Validator 等校验器 . 后面我 将讲述一些比较常用的校验器的使用方法 .

Validator.xml 文件

Validator.xml 文件用来定义用户需要校验的每一个 JSP Form 中的每一个字段的校验规则 , 这个文件是我们在 Struts 项目开发中使用 Validator 框架所需要配置的文件 . 这个文件的根节点是 <form-validator>, 在根节点下的 <formset> 节点的 <form> 子节点就对应了我们在开发 JSP 文件是所定义的 Form 标记 , 也对应这 struts-config.xml 中的 form bean 的定义 . 一个 <form> 节点由多个 <field> 节点组成 , 每个 <field> 节点的结构大概如下 :

       <field property="password" depends="required,minlength,twofields">

              <msg name="required" key="test.required"/>

              <msg name="minlength" key="test.minlength"/>

              <msg name="twofields" key="test.twofields"/>

              <arg0 key="test.password" />

              <arg1 name="minlength" key="${var:minlength}" resource="false" />

              <var>

                     <var-name>minlength</var-name>

                     <var-value>8</var-value>

              </var>

              <var>

                     <var-name>secondProperty</var-name>

                     <var-value>password2</var-value>

              </var>

       </field>

 

其中一个 <Field> 对应于一个 Form Bean 的一个 Field,<Field> 标记的 property 属性说明了这个 Field 对应的 Form Bean Field 名称 , 这个名称要跟 struts-config.xml 文件中的 <form-bean> 中定义的名字一致 .depends 属性说明了这个 Field 依赖于那些校验器的校验 , 可以使用多个校验器 , 各个校验器之间使用逗号隔开 .<msg> 标记说明了当这个 Field 通不过校验的时候向用户提供的错误信息 .name 属性指定了对应的校验器 ,key 属性指定了定义在 ApplicationResources.properties 文件中的错误信息 .<arg0> <arg1> 是传递给校验器的参数 .<var> 标记定义了参数的名字和参数值 . 上面的这个例子说明了 password 字段由 Required,Minlength,Twofields 校验器进行校验 . 指定了这个 Field 不能为空 , 而且最小长度不能小于 8 , 并且必须和同一个 Form 中的另一个名为 password2 的字段相同 . 如果用户的输入不能满足这些要求 , 校验器将会抛出异常 .

下面开始将怎么在这个配置文件中配置各个校验器实现 form 中的多中类型 field 进行校验 .

Required Validator

这个校验器用来校验 Form 的输入数据不能为空 . 如果某一个 Form Field 依赖于这个校验器 , 那么如果用户在 Form 中没有输入这个 Field 对应的输入数据时 ,Required 校验器将会触发一个 Exception, 这个 Exception 的错误信息可以在页面或者服务端被捕捉到 .

例子 :

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

              <msg name="required" key="test.required"/>

              <arg0 key="test.testField.displayName"/>

       </field>

上面的例子说明了 test 字段的校验规则是不能为空 , ApplicationResources.properties 中的相应的定义信息可能是下面这样的情况 :

Test.testField.displayName = 测试字段 # 上面在 <arg0> 标记中定义的 key= “test.testField 对应这个信息

Test.required ={0} 不能为空 , 请重新输入 . # 在上面定义的 <msg> 标记对应这个信息

如果 Validator 校验到用户没有输入 test 这个字段 , 就会将 test.testField 对应的信息作为 test.required 的参数传递给校验器 , 如果在 JSP 页面中捕捉了错误信息 , 错误信息将会是下面的这个形式 :

       测试字段 不能为空 , 请重新输入

Mask Validator

Mask Validator 校验用户输入的数据是否遵照一定的规则 , 这个规则由开发者在 validator.xml 文件中定义 .

例子 :

<field property="postalCode" depends="mask">

 

<arg0 key="test.postalCode.displayname"/>

 

<arg1 name=”mask” key="${var:mask}" resource="false"

 

<var>

 

<var-name>mask</var-name>

 

<var-value>^0\d*$</var-value>

 

</var>

 

</field>

 

上面的 <arg1> 标记说明了这个校验的第二个参数是定义在下面的 <var> 标记的名为 mask 的值 .<var-value> 的值说明了这个字段必须是以数字 0 开头 , 以任意数字字符结尾的一个串 .

Range Validator

这个校验器校验字段是否在一个数字范围内 .

例子 :

       <field property="age" depends="range">

              <msg name="range" key="test.rang"/>

              <arg0 key="test.age"/>

              <arg1 name="range" key="${var:min}" resource="false"/>

              <arg2 name="range" key="${var:max}" resource="false"/>

              <var>

                     <var-name>min</var-name>

                     <var-value>1</var-value>

              </var>

              <var>

                     <var-name>max</var-name>

                     <var-value>100</var-value>

              </var>

       </field>

Range Validator 需要三个参数 (arg), 第一个参数 arg0 是指定这个字段的名字 , 第二个和第三个参数指定范围的最大和最小值 , 分别的名称是 max min.

Maxlength Validator

Maxlength 校验器校验一个字符串的最大长度 , 它需要两个参数 ,arg0 说明字段的名称 ,arg1 说明最大长度 .

例子 :

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

              <msg name="maxlength" key="test.minlength"/>

              <arg0 key="test.password" />

              <arg1 name="maxlength" key="${var:maxlength}" resource="false" />

              <var>

                     <var-name>maxlength</var-name>

                     <var-value>8</var-value>

              </var>

       </field>

Minlength Validator

这个校验器类似于上面的 Maxlength Validator, 参数一样 , 校验规则也一样 , 只是作为参数的变量名字为 minlength

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

              <msg name="minlength" key="test.minlength"/>

              <arg0 key="test.password" />

              <arg1 name="minlength" key="${var:minlength}" resource="false" />

              <var>

                     <var-name>minlength</var-name>

                     <var-value>8</var-value>

              </var>

       </field>

Email Validator

这个校验器校验电子邮件字段 , 当用户输入的电子邮件地址不合法的时候 , 校验器抛出异常 .

例子 :

       <field    property="email" depends="required,email">

              <msg name="required" key="test.required"/>

              <msg name="email" key="test.error.email"/>

              <arg0 key="test.email"/>

       </field>

Form Bean 的编写

要使用 Struts Validator 框架进行自动校验的 Form Bean 不能继承自普通的 ActionForm , 必须继承自 ValidatorForm 或者 ValidatorActionForm . 我们项目组都是继承自 ValidatorForm .

ValidatorForm 根据 struts-config.xml 文件中的 action name 属性为当前 form 的调用相应的验证器,因此在 validation.xml 中的 <form-bean> 元素的名称属性 (name) 应该与 <action> name 属性值相匹配。

ValidatorActionForm 使用 struts-config.xml action path 属性,所以 path 属性的值相应的应该与 validation.xml 中的 Form name 属性匹配。

Struts- config.xml 文件的配置

要使用 Validator 框架的自动校验机制 , 还必须在 Struts-config.xml 文件中作相应的配置 . 除了前面已经说明了的配置 Validator Plugin 意外 , 还需要对需要校验的 form action 进行配置 . 主要有两个地方需要配置 , 一个是 <action> input 属性 , 一个是 <action> validate 属性 .input 属性必须指定包含校验 Form jsp 页面的路径 , 以便 Struts 的校验框架校验失败的时候可以重新导向到原来的页面让用户重新输入 .validator 属性是一个 boolean 类型的属性 , 必须设置为 true struts 才会启动自动校验机制 .

JSP 页面捕捉错误信息

Validator 的校验机制可以定义在服务端进行校验或者通过 Javascript 在浏览器端进行校验 . 这两种不同的方式在 JSP 页面编写的时候有很大的区别 .

捕捉服务端的错误信息

要捕捉服务端校验的错误信息比较简单 . 只需要在 JSP 页面中嵌入一下的代码就可以在页面中显示错误信息 , 这些错误信息也可以自定义显示风格 .

 

<logic:messagesPresent>

   <bean:message key="test.error.descript"/>

   <html:messages id="error">

      <li><bean:write name="error"/></li>

   </html:messages>

</logic:messagesPresent>

<bean:message key=test.error.descript/> 通过 ApplicationResources.properties 文件中定义的信息向用户报告错误发生的原因和简单说明 .

<html:messages id=”error”>

       <li><bean:write name=”error” /></li>

</html:messages>

则是显示具体的由 Validator 框架产生的错误信息 .

捕捉 JavaScript 的错误信息

要捕捉 JavaScript 产生的错误信息首先要使 JSP 页面产生 Validator 生成的 Javascript 代码 , 并在用户点击提交按钮的时候让提交按钮触发相应的校验函数 . 实现方法如下 :

首先要让 JSP 触发校验函数 , 使用这样的 HTML 代码 :

<html:form action="/testAction.do" onsubmit="return validateTestForm(this);">

其中 action 指定这个 form 对应的 action, 这个跟普通的 form 没有区别 ,onsubmit 属性就指定了校验函数 , 它的规则是 : return + 空格 + validator+ ValidatorForm 的名字 + (this)

注意这样的组合规则是不能变的 , 否则会导致页面错误并不能实现校验功能 . 还要注意 ValidatorForm 的名字的第一个字母一定要大写 , 不管在 Struts-congfig.xml 文件中的定义是否大写 , 这里都要把它作为大写字母 .

然后还要在 JSP 页面中产生可以实现校验的 JavaScript 代码 , 这个步骤也很简单 , 只需要在 JSP 页面的末尾加上下面一句 :

<html:javascriptformName="testForm" staticJavascript="true"/>

其中 formName 的名字要跟 struts-config.xml 文件中配置的一致 , 大小写也要一致 .staticJavascript true 的时候 Validator 将使用 JavaScript 代码进行校验 ( 这些 Javascript 代码由 Struts validator 框架自动产生 , 我们只需要配置 validator.xml 文件 ),staticJavascript false 的时候 validator 将使用服务端代码进行校验 , 这些服务端的校验代码也不需要我们编写 .