StrutsValidator验证器使用指南(一)
关键字:struts
验证器:
从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人员包中,
后来核心代码挪到JakartaCommons包中和Struts特别扩展中作为Struts1.1
的一部分。许多开发者为方便一直使用struts验证器,这篇文档首先概述验证
器的核心功能性,然后大概介绍在struts1.1中的变化和新增功能。
如果你配置好验证器插件,你应该扩展ValidatorForm而不是ActionForm,以
便它能加载你的Validator资源。他根据文件中的action
的name属性为当前form的调用相应的验证器,因此在
中的form元素的名称属性应该与action的name属性值相匹配。
另外一种选择是扩展ValidatorActionForm而不是ValidatorForm,
ValidatorActionForm使用中action的path属性,所以path
属性的值相应的应该与中的Form的name属性匹配。
一个分离的action可以定义给多页form的每个页面,而且验证规则可以与
action关联而不是与页码,就像验证范例中的多页form范例那样。
国际化
在文件中form的验证规则可以组织为FormSet。FormSet
有与类相应的属性:如语言,国家以及变量型属性,如果他
们未定义,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="g"/>
默认的arg0-arg3元素将在消息资源中查找相应的key,如果资源属性设为
fal,她将把值直接传进去,而不从消息资源中查找。注意1.1版本中,你必
须为每个模块中明确地定义在验证中用到的消息资源,否则将使用top-level
资源。
property="integer"
depends="required,integer,intRange">
name="range"
key="${var:min}"
resource="fal"/>
name="range"
key="${var:max}"
resource="fal"/>
常量/变量
全局的常量可以在全局标签中定义,FormSet/本地常量能在formt标签中创
建。常量当前仅仅是代替字段的property属性,字段的var元素的value属性,
字段的msg元素的key属性,字段的arg0-arg3元素的key属性。字段的变量
也可以在arg0-arg3元素中被代替(例如:${var:min}))。替换的顺序是
FormSet/Locale常量第一,全局的常量第二,
argelements变量最后。
property="zip"
depends="required,mask">
验证器可以使用字段下面的变量部分来存储变量,这些变量通过字段的getVar
((Stringkey)方法取得。
property="integer"
depends="required,integer,intRange">
name="range"
key="${var:min}"resource="fal"/>
name="range"
key="${var:max}"resource="fal"/>
使用validwhen设计复杂的验证
使用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外
一个字段(比如,如果你要用户两次输入口令来确认值口令一致),另外一个就
是表单中的一个字段只有另外一个字段有确定值的时候才是必须输入的。新的
validwhen验证规则将很快被包含在1.1后的STRUTS版本中,她就是用来处理
这种情况的。
validwhen规则处理单个的变量字段,叫测试。这变量的值是一个布尔
的表达式,如果验证有效则它必须为真。可以包含这种变量的表达式有:
u单引号或双引号字符串literals,
u十进制、十六进制、八进制的Integerliterals,
unull与null和空字符串匹配,
u其它可以用属性名引用的form字段,例如customerAge,
u可以在外部因用得索引字段,例如childLastName[2],
u可以默认implicit因用得索引字段,例如childLastName[],她将作
为被索引的字段使用同样的索引到数组中,
Theliteral*这里指它包含当前测试字段的值,
作为例子,考虑一个包含通讯地址和邮箱字段的form。如果通讯地址不为空则
邮箱字段是必须的required。你能这样定义validwhen规则:
上面定义的意思是:如果通讯地址是空或不空时这个字段时有效的。
这里有个稍微复杂的例子,它使用了索引字段。假定有一个表单,允许用户输入
他们希望定购的部件号和数量。类orderLine的bean的一数组被用来在称为
orderLines的一属性保持输入项。
Ifyouwishedtoverifythateverylinewithpartnumberalsohadaquantity
entered,youcoulddoitwith:
如果你希望校验订单中有数量输入得每一行,你可以这样:
property="quantity"
indexedListProperty="orderLines"
depends="validwhen">
null))
这里的意思是:如果相应的partNumber字段是空,或这字段是不空的,则这字
段是有效的。
最后一个例子,想象一表单,用户必须输入他们的以英寸为单位的高度,如果他
们在高度在60英寸以下,则出一错误。(itisanerrortohavecheckedoff
nbaPointGuardasacareer.)
给程序员的简单说明:
所有的比较关系必须在parens封装。Allcomparisonsmustbeenclodin
parens.
只有两个itme时可以and或or链接。
如果比较的两item都可以转为整数,则使用numeric比较,否则使用字符串比
较。
可插入验证器
验证是从文件中加载的,默认的验证规则定义在
文件中,默认定义了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的正规表
达式包,所有的有效性规则存储在文件,使用的主类是
。
文件中的验证器配置范例:
classname="hecks"
method="validateRequired"
methodParams=",
torAction,
,
Errors,
rvletRequest"
msg="ed">
classname="hecks"
method="validateMask"
methodParams=",
torAction,
,
Errors,
rvletRequest"
msg="d">
定义可插入验证器
方法的参数是用逗号分隔的一些类名称列表,方法属性需要有一个符合上面的列
表的签名。列表由以下组合而成:
–要验证的Bean。
torAction–当前ValidatorAction。
–要验证的字段
Errors–如果验证错误将加入
ActionError的错误对象rvletRequest–当前
request对象。
tContext–应用的ServletContext。
tor–当前的
tor实例。
–当前用户的Locale。
多页面form
字段部分有一可选的页面属性,它可以被设为整数,页上字段的所有验证小于或
等于服务器端验证的当前页,页上字段的所有验证小于或等于客户端页上所有字
段的验证小于或等于服务器端验证的当前页验证的当前页。一个mutli-part表
单需要定义页面属性:
比较两个字段
这是一个展示你怎样才能比较两个字段是否有一样的值的例子。比如“用户改变
他们的口令“一般会有口令字段和一确认字段。
classname="Validator"
method="validateTwoFields"
msg="lds"/>
publicstaticbooleanvalidateTwoFields(
Objectbean,ValidatorActionva,
Fieldfield,ActionErrorrrors,HttpServletRequestrequest,
ServletContextapplication){
Stringvalue=
ueAsString(bean,perty());
StringsProperty2=Value("condProperty");
Stringvalue2=ueAsString(bean,sProperty2);
if(!kOrNull(value)){
try{
if(!(value2)){
((),
ionError(application,request,va,field));
returnfal;
}
}catch(Exceptione){
((),ionError(application,
request,va,field));
returnfal;
}
}
}
已知的bug
StrutsValidator依赖于CommonsValidator包,所以问题报告和增强需求可
能在两个产品中列出。
·StrutsValidatorBugzillaReports
·CommonsValidatorBugzillaReports
变更和deprecations
新建的标记属性。
使用中的DTD验证。
当前使用的验证XML文件是根据中的DTD。Struts不在
为.单独维护一个分离的DTD,另
外,commons-validator现在维护一个统一的。修改所有
文件的DTD引用为
"-//ApacheSoftwareFoundation//DTDCommonsValidatorRules
Configuration1.0//EN"
"/commons/dtds/validator_1_">
空字段。
当前默认在所有得基础验证类型中忽略空白的字段,如果你要求一个字段必须输
入,那末在你的应用的文件相应的字段定义的depends属性中
添加"required"。
新建的范围RANGE方法.
JavaScript和JAVA中都添加了intRange&floatRange方法。
有条件地REQUIRED字段.
最大的修改是添加了基于其她字段的值的有条件地require验证的能力。它允许
你定义逻辑如:“只有X字段非空的时候Y字段为’male’才有效”,这是实现
上述逻辑的推荐方法,这种方法在1.1版后的第一版将实现。在1.1版中添加的
Requiredif验证规则,将在新版中去掉。不过,如果你正准备使用requiredif,
这里有一个简短的教程。
让我们假定你有一个有3个字段的医药的信息表单,性别x,怀孕测
试pregnancyTest,测试结果testResult,如果性别为′f′or′F′,则怀孕
测试pregnancyTest是required,如果pregnancyTest不是空,测试结果
testResult是required。
你的文件的输入项应该是这样的:
这里有一个使用索引的属性更复杂的例子,如果你的有这
下面:
type="torForm">
name="dependents"
type="ent[]"size="10"/>
initial="fal"/>
这里dependentlistFormbean有lastName,firstName,dob,coverageType
四个属性,你可以这样定义一验证规则:
property="firstName"indexedListProperty="dependents"
depends="requiredif">
property="dob"indexedListProperty="dependents"
depends="requiredif,date">
property="coverageType"indexedListProperty="dependents"
depends="requiredif">
这里的意思是:
如果lastName字段是非空的,firstName字段required。因为字段Indexed为
真,这它意味着lastName的indexed必须与firstName的索引的一样,dob同
理,除非date不为空。
如果lastName用样索引时的值不空,而且非索引字段insureDependents为真,
则coverageType是onlyrequire。
你可以对字段在[n]中使用任意数字,唯一的限制是他们必须都是AND或OR,你
无法混合使用。
Deprecation:
uJavaScript和Java的range方法.
uStrutsValidator&StrutsValidatorUtil类中的Deprecation方法
StrutsValidator验证器使用指南(二)
关键字:struts
一个简明的Struts验证器API指南可以帮助你开始。
验证器资源
StrutsValidator:ValidatingTwoFieldsMatch作者MattRaible。(两个
字段匹配验证)关于使用方法的文章。(范例部分为翻译此文内容)
DynaFormsandtheValidator作者JamesTurnerandKevinBedell。Struts
Kickstart的其中一章(动态form和验证器),可以自由下载PDF).
Validatingurinput作者DavidWinterfeldtandTedHusted。Strutsin
Action的其中一章,可以自由下载(PDF)。
使用方法
作者:
丑陋&&Snowtears:经过2周的不懈努力,阅读了大量的资料,终于对Validator
有了个初步的认识,整理了一下,浅浅的谈了谈写法,希望能有一定的帮助,其
中肯定有许多说的不对不准确的地方,还请多指教
real_herozx@
王艺:
根据以上两位的文章正理而成
配置:
1、添加ApplicationResources配置文件。
如:
parameter="ationResources"/>
其中ationResources"的部分是资源文件的路径,
此文件的作用是提供错误信息的非编程定制化和多语言支持。如果我们使用中文
平台操作系统,则默认情况下将首先查找
ApplicationResource_zh_ties文件,然后是
ApplicationResources_ties,如果前两个文件没有被找到则将查找
ties文件。
为了能够在页面上显示错误提示信息,我们还需要将以下内容添加到
ties文件的末尾:
ed={0}isrequired.
gth={0}cannotbelessthan{1}characters.
gth={0}cannotbegreaterthan{2}characters.
d={0}isinvalid.
={0}mustbeanbyte.
={0}mustbeanshort.
r={0}mustbeaninteger.
={0}mustbeanlong.
={0}mustbeanfloat.
={0}mustbeandouble.
={0}isnotadate.
={0}isnotintherange{1}through{2}.
card={0}isnotavalidcreditcardnumber.
={0}isaninvalide-mailaddress.
以上仅是struts现在支持的错误类型的错误提示信息,如果你自定义了新类型
的错误验证,则还需要在此加上你自己的内容。
以上内容中的{0}指的是错误提交的参数。比如:当你需要页面上的“用户名”
不能为空时(也就是上面的ed),这个{0}就代表“用户名”,
所以如果你没有填写用户名将抛出如下错误:
用户名isrequired.(你可以根据需要修改称中文)
我们可能已经注意到了,既然错误提示信息需要配置,那么上例中“用户名”系
统是如何得到的呢?没错!也是通过修改此配置文件,内容如下:
ed=
用户名
这样当“用户名”为空时,struts后台程序将联合以上两处定义显示错误信息。
另外,上面的“ed”是在配置验
证内容时指定的。具体见以下介绍。
注意:一般情况下,你的系统只需要一个ApplicationResources文件,所以开
发组的成员不要添加自己的resource文件。只有在你的项目分组开发时才需要
使用多个ApplicationResources文件,但是,同时你的文
件也会有相同的数量对应。
2、在文件中加入
validator插件:
加入这个插件后你的应用就具备使用Validator的环境,如:
className="torPlugIn">
value="/WEB-INF/,/WEB-INF/"
property="pathnames"/>
这里如果是想使用多个***.xml文件的话,value部分写法如下
value="/WEB-INF/,/WEB-INF/,
/WEB-INF/,/WEB-INF/"
在
validate="true"
四种使用方法
1、用Javascript在客户端进行验证
配置:在需要验证的JSP文件中写入
validateXXXX(this);">
这里的XXX是与要进行验证的forwardname,validateXXXX(this);里面的
XXXX是需要进行验证的ActionForm名。
在文件中写入验证代码就可以进行基本的验证了。这种方法是
在客户端进行验证,客户端可以看到JAVASCRIPT部分的全代码。安全性不高
2、ValidatorForm的validate方法
1、validate()方法:使自己的ActionForm继承ValidatorForm类,在里面编
写自己的方法:
publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequest
request){
ActionErrorrrors=newActionErrors();
。。。。。。
if(("aaa")){
//("mytext",newActionError(""));
}
。。。。。。
returnerrors;
}
此时,如果写了这个方法,就会屏蔽掉在中定义的验证部分,
换句话说就是系统运行时,里对应此ActionForm的定义的错误
验证部分不实行,如果不写这个方法的话,系统运行时会进行
里对应此ActionForm的定义的错误验证部分的操作。此类方法是在服务器端进
行验证,验证部分代码客户端不可见。
2、创建你的ActionForm并让它继承
torForm类。创建你的Action实现,并
和上面定义的ActionForm关联。这里需要注意的是,在定义此Action时一定将
validate属性设置为true,并且在你定义的ActionForm中不要实现它的
validate方法――这就意味着你将使用ValidatorForm的validate方法,这样
才能保证你的错误验证正常进行。配置文件。基本内容如下:
depends="required,maxlength">校验
内容
key="iCode"/>ApplicationResource文件中对应
name="maxlength"resouce="fal"/>
确定最长限制的长度
注意:此处的arg0和arg1就代表了ApplicationResources文件中使用“{}”
括起来的参数。比如:
={0}isnotintherange{1}through{2}.
定义了三个参数,所以你这里也要定义
整的显示错误信息。
gth={0}cannotbegreaterthan{2}characters.
定义了0、2两个参数,所以你就需要定义
depends="required,maxlength">
name="maxlength"resouce="fal"/>
depends="email">
depends="required">
在校验页面的
前添加如下内容:3、DynaValidatorForm
不需要再写对应的ActionForm,只需在里把自己的
ActionForm进行配置:
DynaValidatorForm">
在form-property里设置相应的项目,比如说mytext,mytextarea什么的,执
行的时候会动态生成ActionForm,再在里写入所希望的验证代
码,就可以了。JSP文件里不需要写入任何东西,验证也是在服务器端进行,验
证部分代码在JSP中不可见。
4、组合验证
如果使用动态验证DynaValidatorForm的话,不许编写自己的对应的
ActionForm,相应的特殊验证会受到相当程度的限制。这个时候,需要将特殊验
证部分写入对应的Action,
if(("aaa")){//MyExample
ActionErrorrrors=newActionErrors();
("***",newActionError("***.error"));
saveErrors(request,errors);
return(rward("fal"));
}
就可以实现特殊验证了。
实际上你的FORM还可以继承ValidatorActionForm和
DynaValidatorActionForm,这两种与他们对应的ValidatorForm和
DynaValidatorForm的唯一区别正如开篇就讲到的:在中查
找对应的FORM类时,前者根据ACTION的PATH值,而后者使用NAME值。
范例:
Struts验证器:验证两个字段匹配
在使用指南中,有一节讲述怎样创建验证器来验证两个字段匹配,我用这个服务
器端验证器(象例子中显示的那样)做口令,确定口令验证。这个已经可以正常
工作了;但我还想用客户端的javascript验证器来试一试。我写了自己的程序
来比较两个字段,但他们和推荐给你的那个不同()。
所以昨天,我补充了怎样添加JavaScript方法到。这里
就是怎样配置的的整个过程(大部分在使用指南中已经包含了,保存
JavaScript)。
怎样添加两个字段的验证器
Step1:生成一个包含validateTwoFields方法的类。在我的代码重,我的类定
义为ValidationUtil,他有下列方法:
publicstaticbooleanvalidateTwoFields(
Objectbean,
ValidatorActionva,
Fieldfield,
ActionErrorrrors,
HttpServletRequestrequest){
Stringvalue=ueAsString(bean,
perty());
StringsProperty2=Value("condProperty");
Stringvalue2=ueAsString(bean,sProperty2);
if(!kOrNull(value)){
try{
if(!(value2)){
((),
ionError(request,va,
field));
returnfal;
}
}catch(Exceptione){
((),
ionError(request,va,field));
returnfal;
}
}
returntrue;
}
Step2:编辑,加入"twofields"规则。
classname="tionUtil"
method="validateTwoFields"
methodParams=",
torAction,
,
Errors,
rvletRequest"
depends="required"msg="lds">
functionvalidateTwoFields(form){
varbValid=true;
varfocusField=null;
vari=0;
varfields=newArray();
oTwoFields=newtwofields();
for(xinoTwoFields){
varfield=form[oTwoFields[x][0]];
varcondField=
form[oTwoFields[x][2]("condProperty")];
if(==′text′||
==′textarea′||
==′lect-one′||
==′radio′||
==′password′){
varvalue;
varcondValue;
//getfield′svalue
if(=="lect-one"){
varsi=edIndex;
value=s[si].value;
condValue=s[si].value;
}el{
value=;
condValue=;
}
if(value!=condValue){
if(i==0){
focusField=field;
}
fields[i++]=oTwoFields[x][1];
bValid=fal;
}
}
}
if(>0){
();
alert((′n′));
}
returnbValid;
}]]>
Step3:在中为你的表单配置验证:
这里lds的字段′{0}′必须与字段′{1}′的值相同。第三步
的一个可选的工作就时使用XDoclet来生成。requires(1)配
置XDoclet(当然)和(2)在你的表单中添加添加一些@struts标签tPassword
方法。
/**
*Returnsthepassword.
*@returnString
*
*@tortype="required"msgkey="ed"
*@tortype="twofields"msgkey="lds"
*@tor-argsarg1resource="rd"
*@tor-argsarg1resource="mPassword"
*@tor-varname="condProperty"value="confirmPassword"
*/
publicStringtPassword(){
returnpassword;
}
本文发布于:2022-12-28 07:17:00,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/45367.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |