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