Struts validator 验证器使用指南.docx
《Struts validator 验证器使用指南.docx》由会员分享,可在线阅读,更多相关《Struts validator 验证器使用指南.docx(23页珍藏版)》请在冰豆网上搜索。
Strutsvalidator验证器使用指南
StrutsValidator验证器使用指南
(根据StrutsValidatorGuide)
作者:
DavidWinterfeldt大卫
JamesTurner詹姆斯
RobLeland罗伯特
翻译:
侯思超
验证器:
从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人员包中,后来核心代码挪到JakartaCommons包中和Struts特别扩展中作为Struts1.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属性。
errormessages的可以设置arg0-arg3等参数元素。
如果没有设置arg0-arg3的name属性,errormessages将使用他们作为默认的构建参数值。
如果设置了name属性,你就可以把参数指定给一特定的可插入验证器,然后这些参数将在构造错误信息时被使用。
property="lastName"
depends="required,mask">
name="mask"
key="registrationForm.lastname.maskmsg"/>
mask
^[a-zA-Z]*$
默认的arg0-arg3元素将在消息资源中查找相应的key,如果资源属性设为false,她将把值直接传进去,而不从消息资源中查找。
注意1.1版本中,你必须为每个模块中明确地定义在验证中用到的消息资源,否则将使用top-level资源。
property="integer"
depends="required,integer,intRange">
name="range"
key="${var:
min}"
resource="false"/>
name="range"
key="${var:
max}"
resource="false"/>
min
10
max
20
常量/变量
全局的常量可以在全局标签中定义,FormSet/本地常量能在formset标签中创建。
常量当前仅仅是代替字段的property属性,字段的var元素的value属性,字段的msg元素的key属性,字段的arg0-arg3元素的key属性。
字段的变量也可以在arg0-arg3元素中被代替(例如:
${var:
min}))。
替换的顺序是FormSet/Locale常量第一,全局的常量第二,
argelements变量最后。
zip
^\d{5}(-\d{4})?
$
property="zip"
depends="required,mask">
mask
${zip}
验证器可以使用字段下面的变量部分来存储变量,这些变量通过字段的getVar((Stringkey)方法取得。
property="integer"
depends="required,integer,intRange">
name="range"
key="${var:
min}"resource="false"/>
name="range"
key="${var:
max}"resource="false"/>
min
10
max
20
使用validwhen设计复杂的验证
使用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外一个字段(比如,如果你要用户两次输入口令来确认值口令一致),另外一个就是表单中的一个字段只有另外一个字段有确定值的时候才是必须输入的。
新的validwhen验证规则将很快被包含在1.1后的STRUTS版本中,她就是用来处理这种情况的。
validwhen规则处理单个的变量字段,叫测试。
这变量的值是一个布尔的表达式,如果验证有效则它必须为真。
可以包含这种变量的表达式有:
◆ 单引号或双引号字符串literals,
◆ 十进制、十六进制、八进制的Integerliterals,
◆ null与null和空字符串匹配,
◆ 其它可以用属性名引用的form字段,例如customerAge,
◆ 可以在外部因用得索引字段,例如childLastName[2],
◆ 可以默认implicit因用得索引字段,例如childLastName[],她将作为被索引的字段使用同样的索引到数组中,
Theliteral*这里指它包含当前测试字段的值,
作为例子,考虑一个包含通讯地址和邮箱字段的form。
如果通讯地址不为空则邮箱字段是必须的required。
你能这样定义validwhen规则:
test
((sendNewsletter==null)or(*this*!
=null))
上面定义的意思是:
如果通讯地址是空或不空时这个字段时有效的。
这里有个稍微复杂的例子,它使用了索引字段。
假定有一个表单,允许用户输入他们希望定购的部件号和数量。
类orderLine的bean的一数组被用来在称为orderLines的一属性保持输入项。
Ifyouwishedtoverifythateverylinewithpartnumberalsohadaquantityentered,youcoulddoitwith:
如果你希望校验订单中有数量输入得每一行,你可以这样:
property="quantity"
indexedListProperty="orderLines"
depends="validwhen">
test
((orderLines[].partNumber==null)or(*this*!
=null))
这里的意思是:
如果相应的partNumber字段是空,或这字段是不空的,则这字段是有效的。
最后一个例子,想象一表单,用户必须输入他们的以英寸为单位的高度,如果他们在高度在60英寸以下,则出一错误。
(itisanerrortohavecheckedoffnbaPointGuardasacareer.)
test
((heightInInches>=60)or(*this*==null))
给程序员的简单说明:
所有的比较关系必须在parens封装。
Allcomparisonsmustbeenclosedinparens.
只有两个itme时可以and或or链接。
如果比较的两item都可以转为整数,则使用numeric比较,否则使用字符串比较。
可插入验证器
验证是从validation.xml文件中加载的,默认的验证规则定义在validation.xml文件中,默认定义了required,mask,byte,short,int,long,float,double,date(没有本地支持),andanumericrange。
"mask"方式依赖于默认值安装要求,那意味着"required"可以完成,在"'mask"将运行以前"required"和"mask"方式被默认包含进框架中了。
任何字段如果不是"required"而且是空或有零长度将跳过其他验证。
如果使用了Javascript标签,客户端javascript在validator'sjavascript属性中查找值而且产生一个有验证form方法的对象,要得到更多的关于JavascriptValidator标签工作细节的详细的解释,参阅html标签API参考。
"'mask'"方式让你用一正则表达式掩码验证字段,它使用jakarta的正规表达式包,所有的有效性规则存储在validator-rules.xml文件,使用的主类是org.apache.regexp.RE。
validation.xml文件中的验证器配置范例:
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
mons.validator.ValidatorAction,
mons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required">
classname="org.apache.struts.validator.FieldChecks"
method="validateMask"
methodParams="java.lang.Object,
mons.validator.ValidatorAction,
mons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.invalid">
定义可插入验证器
方法的参数是用逗号分隔的一些类名称列表,方法属性需要有一个符合上面的列表的签名。
列表由以下组合而成:
java.lang.Object–要验证的Bean。
mons.validator.ValidatorAction–当前ValidatorAction。
mons.validator.Field–要验证的字段
org.apache.struts.action.ActionErrors–如果验证错误将加入ActionError的错误对象javax.servlet.http.HttpServletRequest–当前request对象。
javax.servlet.ServletContext–应用的ServletContext。
mons.validator.Validator–当前的mons.validator.Validator实例。
java.util.Locale–当前用户的Locale。
多页面form
字段部分有一可选的页面属性,它可以被设为整数,页上字段的所有验证小于或等于服务器端验证的当前页,页上字段的所有验证小于或等于客户端页上所有字段的验证小于或等于服务器端验证的当前页验证的当前页。
一个mutli-part表单需要定义页面属性:
hiddenproperty="page"value="1"/>。
比较两个字段
这是一个展示你怎样才能比较两个字段是否有一样的值的例子。
比如“用户改变他们的口令“一般会有口令字段和一确认字段。
classname="com.mysite.StrutsValidator"
method="validateTwoFields"
msg="errors.twofields"/>
secondProperty
password2
publicstaticbooleanvalidateTwoFields(
Objectbean,ValidatorActionva,
Fieldfield,ActionErrorserrors,HttpServletRequestrequest,
ServletContextapplication){
Stringvalue=ValidatorUtils.getValueAsString(bean,field.getProperty());
StringsProperty2=field.getVarValue("secondProperty");
Stringvalue2=ValidatorUtils.getValueAsString(bean,sProperty2);
if(!
GenericValidator.isBlankOrNull(value)){
try{
if(!
value.equals(value2)){
errors.add(field.getKey(),
Resources.getActionError(application,request,va,field));
returnfalse;
}
}catch(Exceptione){
errors.add(field.getKey(),Resources.getActionError(application,request,va,field));
returnfalse;
}
}
}
已知的bug
StrutsValidator依赖于CommonsValidator包,所以问题报告和增强需求可能在两个产品中列出。
∙ StrutsValidatorBugzillaReports
∙ CommonsValidatorBugzillaReports
变更和deprecations
新建的标记属性。
javascript>标记有新的属性定义.
使用commons-validator.jar中的DTD验证。
当前使用的验证XML文件是根据commons-validator.jar中的DTD。
Struts不在为validator-rules.xmlandvalidator.xml.单独维护一个分离的DTD,另外,commons-validator现在维护一个统一的validator.dtd。
修改所有validator.xml文件的DTD引用为
DOCTYPEform-validationPUBLIC
"-//ApacheSoftwareFoundation//DTDCommonsValidatorRulesConfiguration1.0//EN"
"http:
//jakarta.apache.org/commons/dtds/validator_1_0.dtd">
空字段。
当前默认在所有得基础验证类型中忽略空白的字段,如果你要求一个字段必须输入,那末在你的应用的validator.xml文件相应的字段定义的depends属性中添加"required"。
新建的范围RANGE方法.
JavaScript和JAVA中都添加了intRange&floatRange方法。
有条件地REQUIRED字段.
最大的修改是添加了基于其她字段的值的有条件地require验证的能力。
它允许你定义逻辑如:
“只有X字段非空的时候Y字段为’male’才有效”,这是实现上述逻辑的推荐方法,这种方法在1.1版后的第一版将实现。
在1.1版中添加的Requiredif验证规则,将在新版中去掉。
不过,如果你正准备使用requiredif,这里有一个简短的教程。
让我们假定你有一个有3个字段的医药的信息表单,性别sex,怀孕测试pregnancyTest,测试结果testResult,如果性别为'f'or'F',则怀孕测试pregnancyTest是required,如果pregnancyTest不是空,测试结果testResult是required。
你的validation.xml文件的输入项应该是这样的:
field[0]
sex
fieldTest[0]
EQUAL
fieldValue[0]
F
field[1]
sex
fieldTest[1]
EQUAL
fieldValue[1]
f
fieldJoin
OR
field[0]
pregnancyTest
fieldTest[0]
NOTNULL
这里有一个使用索引的属性更复杂的例子,如果你的struts-config