Struts Validator验证器使用指南<o:p></o:p>
(根据Struts Validator Guide)<o:p></o:p>
作者:<o:p></o:p>
David Winterfeldt大卫 James Turner詹姆斯 Rob Leland罗伯特<o:p></o:p>
翻译: 侯思超<o:p></o:p>
验证器:<o:p></o:p>
从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人员包中,后来核心代码挪到Jakarta Commons包中和Struts特别扩展中作为 Struts 1.1的一部分。许多开发者为方便一直使用struts验证器,这篇文档首先概述验证器的核心功能性,然后大概介绍在 struts1.1中的变化和新增功能。<o:p></o:p>
如果你配置好验证器插件,你应该扩展ValidatorForm而不是ActionForm,以便它能加载你的Validator资源。他根据struts-config.xml文件中的action的name属性为当前form的调用相应的验证器,因此在validator-rules.xml中的form元素的名称属性应该与action的name属性值相匹配。<o:p></o:p>
另外一种选择是扩展ValidatorActionForm 而不是ValidatorForm,ValidatorActionForm使用struts-config.xml中action的path属性,所以path属性的值相应的应该与validator-rules.xml中的Form的name属性匹配。<o:p></o:p>
一个分离的action可以定义给多页form的每个页面,而且验证规则可以与action关联而不是与页码,就像验证范例中的多页form范例那样。<o:p></o:p>
国际化<o:p></o:p>
在validator-rules.xml 文件中form的验证规则可以组织为FormSet。FormSet 有与java.util.Locale 类相应的属性:如语言, 国家以及变量型属性,如果他们未定义,FormSet 将把它设置为默认值。一个FormSet 也可以有关联的常量。另外还可以定义与FormSet 同一级别的全局global元素,他与FormSet同样也有常量。<o:p></o:p>
注意:你必须在国际化的FormSet前声明一个没有国际化的默认FormSet。这样如果Validator没有找到locale时可以有一个默认版本。<o:p></o:p>
可插入验证器的默认错误信息值可以被msg元素覆盖。所以为mask验证器生成错误信息的替代方法就是使用msg属性,如果字段的name属性与验证器的name属性匹配,那末将使用字段的msg属性。<o:p></o:p>
error messages的可以设置arg0-arg3 等参数元素。如果没有设置arg0-arg3的name属性, error messages将使用他们作为默认的构建参数值。如果设置了name属性,你就可以把参数指定给一特定的可插入验证器,然后这些参数将在构造错误信息时被使用。<o:p></o:p>
<field <o:p></o:p>
property="lastName" <o:p></o:p>
depends="required,mask"><o:p></o:p>
<msg <o:p></o:p>
name="mask" <o:p></o:p>
key="registrationForm.lastname.maskmsg"/><o:p></o:p>
<arg0 key="registrationForm.lastname.displayname"/><o:p></o:p>
<var><o:p></o:p>
<var-name>mask</var-name><o:p></o:p>
<var-value>^[a-zA-Z]*$</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
默认的arg0-arg3元素将在消息资源中查找相应的key,如果资源属性设为false,她将把值直接传进去,而不从消息资源中查找。注意1.1版本中,你必须为每个模块中明确地定义在验证中用到的消息资源,否则将使用top-level资源。<o:p></o:p>
<field<o:p></o:p>
property="integer" <o:p></o:p>
depends="required,integer,intRange"><o:p></o:p>
<arg0 key="typeForm.integer.displayname"/><o:p></o:p>
<arg1 name="range"<o:p></o:p>
key="${var:min}"<o:p></o:p>
resource="false"/><o:p></o:p>
<arg2 name="range"<o:p></o:p>
key="${var:max}"<o:p></o:p>
resource="false"/><o:p></o:p>
<var><o:p></o:p>
<var-name>min</var-name><var-value>10</var-value><o:p></o:p>
</var><o:p></o:p>
<var><o:p></o:p>
<var-name>max</var-name><var-value>20</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
常量/变量<o:p></o:p>
全局的常量可以在全局标签中定义,FormSet/本地常量能在formset 标签中创建。常量当前仅仅是代替字段的property属性,字段的var 元素的 value属性,字段的msg 元素的 key属性,字段的arg0-arg3 元素的 key属性。字段的变量也可以在arg0-arg3 元素中被代替(例如:${var:min}))。替换的顺序是FormSet/Locale常量第一,全局的常量第二,<o:p></o:p>
arg elements 变量最后。<o:p></o:p>
<global><o:p></o:p>
<constant><o:p></o:p>
<constant-name>zip</constant-name><o:p></o:p>
<constant-value>^\d{5}(-\d{4})?$</constant-value><o:p></o:p>
</constant><o:p></o:p>
</global><o:p></o:p>
<o:p></o:p>
<field <o:p></o:p>
property="zip" <o:p></o:p>
depends="required,mask"><o:p></o:p>
<arg0 key="registrationForm.zippostal.displayname"/><o:p></o:p>
<var><o:p></o:p>
<var-name>mask</var-name> <var-value>${zip}</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
验证器可以使用字段下面的变量部分来存储变量,这些变量通过字段的getVar((String key)方法取得。<o:p></o:p>
<field <o:p></o:p>
property="integer" <o:p></o:p>
depends="required,integer,intRange"><o:p></o:p>
<arg0 key="typeForm.integer.displayname"/><o:p></o:p>
<arg1 <o:p></o:p>
name="range" <o:p></o:p>
key="${var:min}" resource="false"/><o:p></o:p>
<arg2 <o:p></o:p>
name="range" <o:p></o:p>
key="${var:max}" resource="false"/><o:p></o:p>
<var><o:p></o:p>
<var-name>min</var-name> <var-value>10</var-value><o:p></o:p>
</var><o:p></o:p>
<var><o:p></o:p>
<var-name>max</var-name> <var-value>20</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
使用validwhen设计复杂的验证<o:p></o:p>
使用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外一个字段(比如, 如果你要用户两次输入口令来确认值口令一致),另外一个就是表单中的一个字段只有另外一个字段有确定值的时候才是必须输入的。新的validwhen验证规则将很快被包含在1.1后的STRUTS版本中,她就是用来处理这种情况的。<o:p></o:p>
validwhen 规则处理单个的变量字段,叫测试。这变量的值是一个布尔的表达式,如果验证有效则它必须为真。可以包含这种变量的表达式有:<o:p></o:p>
u 单引号或双引号字符串literals,<o:p></o:p>
u 十进制、十六进制、八进制的Integer literals,<o:p></o:p>
u null与null和空字符串匹配,<o:p></o:p>
u 其它可以用属性名引用的form字段,例如customerAge,<o:p></o:p>
u 可以在外部因用得索引字段, 例如childLastName[2],<o:p></o:p>
u 可以默认implicit因用得索引字段, 例如childLastName[], 她将作为被索引的字段使用同样的索引到数组中,<o:p></o:p>
The literal *这里指它包含当前测试字段的值,<o:p></o:p>
作为例子,考虑一个包含通讯地址和邮箱字段的form。如果通讯地址不为空则邮箱字段是必须的required。你能这样定义validwhen 规则:<o:p></o:p>
<field property="emailAddress" depends="validwhen"><o:p></o:p>
<arg0 key="userinfo.emailAddress.label"/><o:p></o:p>
<var><o:p></o:p>
<var-name>test</var-name><o:p></o:p>
<var-value>((sendNewsletter == null) or (*this* != null))</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
上面定义的意思是:如果通讯地址是空或不空时这个字段时有效的。<o:p></o:p>
这里有个稍微复杂的例子,它使用了索引字段。假定有一个表单,允许用户输入他们希望定购的部件号和数量。类orderLine 的bean的一数组被用来在称为orderLines 的一属性保持输入项。<o:p></o:p>
If you wished to verify that every line with part number also had a quantity entered, you could do it with:<o:p></o:p>
如果你希望校验订单中有数量输入得每一行,你可以这样:<o:p></o:p>
<field <o:p></o:p>
property="quantity" <o:p></o:p>
indexedListProperty="orderLines" <o:p></o:p>
depends="validwhen"><o:p></o:p>
<arg0 key="orderform.quantity.label"/><o:p></o:p>
<var><o:p></o:p>
<var-name>test</var-name><o:p></o:p>
<var-value>((orderLines[].partNumber == null) or (*this* != null))</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
这里的意思是:如果相应的partNumber 字段是空, 或这字段是不空的,则这字段是有效的。<o:p></o:p>
最后一个例子,想象一表单,用户必须输入他们的以英寸为单位的高度,如果他们在高度在60英寸以下,则出一错误。(it is an error to have checked off nbaPointGuard as a career.)<o:p></o:p>
<field property="nbaPointGuard" depends="validwhen"><o:p></o:p>
<arg0 key="careers.nbaPointGuard.label"/><o:p></o:p>
<var><o:p></o:p>
<var-name>test</var-name><o:p></o:p>
<var-value>((heightInInches >= 60) or (*this* == null))</var-value><o:p></o:p>
</var><o:p></o:p>
</field><o:p></o:p>
<o:p></o:p>
给程序员的简单说明:<o:p></o:p>
所有的比较关系必须在parens 封装。All comparisons must be enclosed in parens.<o:p></o:p>
只有两个itme时可以and或or链接。<o:p></o:p>
如果比较的两item都可以转为整数,则使用numeric比较,否则使用字符串比较。<o:p></o:p>
可插入验证器<o:p></o:p>
验证是从validation.xml 文件中加载的,默认的验证规则定义在validation.xml 文件中,默认定义了required, mask ,byte, short, int, long, float, double, date (没有本地支持), and a numeric range。<o:p></o:p>
" mask "方式依赖于默认值安装要求,那意味着"required "可以完成,在"'mask "将运行以前"required "和" mask "方式被默认包含进框架中了。任何字段如果不是"required "而且是空或有零长度将跳过其他验证。<o:p></o:p>
如果使用了Javascript 标签,客户端javascript在validator's javascript 属性中查找值而且产生一个有验证form方法的对象,要得到更多的关于Javascript Validator 标签工作细节的详细的解释,参阅html标签API参考。<o:p></o:p>
"'mask' "方式让你用一正则表达式掩码验证字段,它使用jakarta的正规表达式包,所有的有效性规则存储在validator-rules.xml 文件,使用的主类是org.apache.regexp.RE。<o:p></o:p>
validation.xml文件中的验证器配置范例:<o:p></o:p>
<validator name="required"<o:p></o:p>
classname="org.apache.struts.validator.FieldChecks"<o:p></o:p>
method="validateRequired"<o:p></o:p>
methodParams="java.lang.Object,<o:p></o:p>
org.apache.commons.validator.ValidatorAction, <o:p></o:p>
org.apache.commons.validator.Field,<o:p></o:p>
org.apache.struts.action.ActionErrors,<o:p></o:p>
javax.servlet.http.HttpServletRequest"<o:p></o:p>
msg="errors.required"><o:p></o:p>
<validator name="mask"<o:p></o:p>
classname="org.apache.struts.validator.FieldChecks"<o:p></o:p>
method="validateMask" <o:p></o:p>
methodParams="java.lang.Object, <o:p></o:p>
org.apache.commons.validator.ValidatorAction, <o:p></o:p>
org.apache.commons.validator.Field, <o:p></o:p>
org.apache.struts.action.ActionErrors,<o:p></o:p>
javax.servlet.http.HttpServletRequest" <o:p></o:p>
msg="errors.invalid"><o:p></o:p>
定义可插入验证器<o:p></o:p>
方法的参数是用逗号分隔的一些类名称列表,方法属性需要有一个符合上面的列表的签名。列表由以下组合而成:<o:p></o:p>
java.lang.Object – 要验证的Bean。<o:p></o:p>
org.apache.commons.validator.ValidatorAction – 当前ValidatorAction。<o:p></o:p>
org.apache.commons.validator.Field – 要验证的字段<o:p></o:p>
org.apache.struts.action.ActionErrors – 如果验证错误将加入ActionError的错误对象javax.servlet.http.HttpServletRequest –当前request 对象。<o:p></o:p>
javax.servlet.ServletContext – 应用的ServletContext。<o:p></o:p>
org.apache.commons.validator.Validator–当前的org.apache.commons.validator.Validator实例。<o:p></o:p>
分享到:
相关推荐
### Struts Validator 验证器使用指南 #### 一、Struts Validator 概览 **Struts Validator** 是一个强大的框架,用于简化Web应用程序中的表单验证过程。它首次出现在Struts 0.5版本中,并逐渐发展成为Struts 1.1...
### Struts Validator 验证器使用指南 #### 一、简介 Struts Validator是一个用于Java Web应用程序中的数据验证框架,它是Struts框架的一个扩展模块。该验证器支持多种形式的数据验证,包括基本类型验证、复杂对象...
通过配置 `struts-config.xml` 和 `validation.xml` 文件,以及利用 `Validator-rules.xml` 中的预定义验证器,开发者可以确保用户提交的数据符合预期格式和规则,从而降低程序出错的可能性并提高应用的质量。
Validator验证在Struts应用程序中扮演着至关重要的角色,它能够确保用户输入的数据符合预设的规则,从而提高应用的健壮性和用户体验。在这个实例和文档中,我们将深入探讨Struts Validator的工作原理、配置以及如何...
另一个文件"Struts2QuickValidation.pdf"很可能是一个用户指南或文档,详细介绍了如何使用Struts2 Plus进行数据验证,包括如何配置插件、定义验证规则、处理验证错误以及如何在视图层展示验证结果等。这个文档对于...
- Struts2使用OGNL进行类型转换,提供了基本类型和常见对象的转换器。 9. **验证**: - Struts1.x支持手动验证或通过Commons Validator扩展进行验证,但对子对象的验证较弱。 - Struts2支持通过配置文件或注解...
同时,Struts 2内置了验证框架,类似于Struts 1的Validator,但更加强大和易于使用。开发者可以通过注解或XML配置文件定义验证规则,并能轻松地处理错误信息。 **validator-strut2-11.pdf**: 这份文档很可能是关于...
- **`struts2struts1validator`** 模块:这部分源码可能展示了如何在Struts2中使用Struts1的Validator框架进行数据验证。Struts2提供了内置的验证框架,但也可以与Struts1的Validator规则文件和验证类集成,以利用...
本快速学习指南将帮助初学者深入理解Struts框架的核心概念、架构和使用方法,从而快速上手开发Java Web应用。 首先,我们来了解Struts的基本架构。Struts通过分离业务逻辑、视图展示和控制流程,实现了应用的模块化...
Struts2支持许多第三方验证框架,如Hibernate Validator和Apache Commons Validator。这些框架提供了丰富的验证注解和API,可以方便地在Action类或模型对象上定义验证规则。这种方式提高了验证的灵活性和扩展性,...
3. **文档**:可能包含`docs`目录,其中包含API文档、用户指南和开发者文档,帮助用户快速上手并了解如何使用验证器。 4. **配置文件**:如`conf`目录下的`validation.xml`,这是Validator的核心配置文件,用于定义...
本资源包含《Struts2权威指南》光盘中的第18至21章的源码,这些章节主要涉及Struts2框架的深入应用和集成其他技术,如Struts1、Hibernate等。以下将对这些章节的知识点进行详细阐述。 1. **Struts2与Struts1集成** ...
尽管这个例子展示了如何使用Struts标签库(struts-bean.tld和struts-html.tld)和Validator插件进行表单验证,但同时也暴露出将大量业务逻辑放入Action的不良实践,这在实际开发中应避免,以便更好地分离关注点,...
Struts的Validator框架允许开发者定义表单验证规则,自动检查用户输入的有效性,减少业务逻辑中的错误。 七、Struts 2的发展 随着技术的发展,Struts 1逐渐被Struts 2所取代。Struts 2融合了更多框架的优点,如...
- 集成Apache Commons BeanUtils和Validator框架,提供强大的表单验证功能,可以自定义验证规则。 9. ** strut2-action 和 strut2-convention**: - `struts2-action`是传统的基于XML配置的Action实现,而`struts...
学习Struts的过程中,可以参考"struts快速学习指南",深入理解其原理和实践操作,结合实际项目进行练习,以提升技能。同时,了解其演进历程和替代框架,可以帮助你更好地适应不断变化的Web开发环境。
同时,Struts2的Validator框架允许开发者定义表单验证规则,确保输入数据的有效性。 9. **Ajax支持**:通过Struts2的AJAX插件,可以轻松实现部分页面的异步更新,提升用户体验。 10. **插件架构**:Struts2拥有...