一Validator框架的优势
Validator框架是一个Struts插件最初由David Winterfeldt设计并实现Validator框架从Struts 时代就可以使用但那时Validator框架只是被捐助的一个jar包Apache组织为了使开发人员更方便地使用Validator框架决定从Struts开始将Validator框架作为Struts的一部分同Struts一起发布
Validator框架可以在XML文件中配置验证规则和验证对象因此使用Validator框架可以无需在ActionForm的子类中覆盖validate方法就可以很方便地验证客户端的提交数据由于Validator框架内置了很多预定义的验证机制如验证某个属性是否存在验证EMail是否合法等所以在一般情况下只需要配置XML文件就可以满足我们的验证需求
在使用Validator框架时就会发现这种方式要比直接使用validate方法进行验证会给我们带来如下的好处
更容易维护 由于验证信息可以被放置在同一个配置文件中因此我们可以更容易地来维护这些验证信息
标准化由于很多简单的验证都是相同的如用户名和密码都要求由字母数字以及下划下组成如果将这些验证都写在validate方法中对这些验证进行标准化非常困难而在Validator框架中的这些验证机制都是预先定义的因此标准化相同的验证对于Validator框架来说将是一件非常轻松的事
避免重造轮子虽然一些验证很简单但如果想正确实现它们也是非常困难的一个典型的例子是验证EMail地址的格式如果这个验证要想完美无缺就必须按着RFC规范的要求来验证EMail地址而如果我们使用Validator框架就无需再重造轮子来验证EMail地址了
减少重复代码的数量由于Validator框架提供了很多预定义的验证因此我们可以避免自己写很多重复的代码进行验证当然我们也可以将大量使用的验证封装在类的方法中这些虽然可以避免大量的重复劳动但这就意味着我们团队的新成员要使用这些被封装的验证方法之前必须先学习它们而最糟糕的情况是很多开发人员可能会忘记使用这些由其他成员实现的验证库而自己重新编写具有同样功能的验证库当然这一切如果使用Validator框架就都可以得到解决
客户端和服务端验证自动切换我们只需要简单地在JSP页面中放一个单独的<htmljavascript/>元素就可以将服务端的验证转换为客户端验证(基于JavaScript的验证)
虽然Validator框架的预定义验证已经可以满足大多数的验证需求了但在某些特殊情况下这些预定义验证就无法满足我们的需求了为此Validator框架也为开发人员提供了扩展验证机制的功能这也使得Validator框架可以完成更复杂的验证工作
<!——[endif]——>
二配置和使用Validator框架
安装Validator框架
由于Validator是Struts的一个插件因此就需要在strutsconfigxml文件中按着Struts插件的方式来安装Validator框架打开strutsconfigxml文件在<strutsconfig>元素中加入一个<plugin>子元素如下面的代码所示
<pluginclassName=orgapachestrutsvalidatorValidatorPlugIn>
<setpropertyproperty=pathnames value=/WEBINF/validatorrulesxml/WEBINF/validatorxml/>
</plugin>
其中<setproperty>元素设置了插件中使用的pathnames属性的值在pathnames属性值中包含了两个xml文件
()validatorrulesxml在这个文件中声明了Validator框架的预定义验证这个文件可以在Struts的发行包的lib目录中可以找到这个文件在使用MyEclipse为Web工程添加Struts功能后会自动将这个文件加到WEBINF目录中
()validatorxml这个文件定义了要验证的对象实际上在这个文件中包含了一个或多个ActionForm的子类及其要验证的属性和验证规则因此这个文件就相当于validate方法在Validator框架中可以有多个定义验证对象的xml文件(可以将不同的ActionForm的子类分散到不同的xml文件中)中间用逗号()隔开如下面的代码所示<!——[endif]——>
<pluginclassName=orgapachestrutsvalidatorValidatorPlugIn>
<setpropertyproperty=pathnames value=/WEBINF/validatorrulesxml/WEBINF/validatorxml
/WEBINF/validatorxml /WEBINF/validatorxml/>
</plugin>
使用Validator框架的一个例子
在本节将举一个例子来演示如何使用Validator框架来验证数据我们需要按着如下的六步来完成这个例子
【第步】建立FirstValidatorForm类(ValidatorForm的子类)
在<samples工程目录>\src\actionform目录中建立一个FirstValidatorFormjava文件代码如下
packageactionform;
importorgapachestrutsvalidatorValidatorForm;
publicclassFirstValidatorFormextendsValidatorForm//必须从ValidatorForm继承
{
privateStringname;
privateStringage;
privateStringemail;
publicStringgetName()
{
returnname;
}
publicvoidsetName(Stringname)
{
thisname=name;
}
publicStringgetEmail()
{
returnemail;
}
publicvoidsetEmail(Stringemail)
{
thisemail=email;
}
publicStringgetAge()
{
returnage;
}
publicvoidsetAge(Stringage)
{
thisage=age;
}
}
要注意的是要想使用Validator框架验证数据Form类就必须从ValidatorForm继承而不能从ActionForm继承这是因为ValidatorForm类是从ActionForm继承的在ValidatorForm类中已经覆盖了validate方法来自动进行验证工作因此我们在ValidatorForm的子类中就不用写validate方法了
<!——[endif]——>
【第步】建立ValidatorAction类(Action的子类)
在<samples工程目录>\src\action目录中建立一个ValidatorActionjava文件代码如下
packageaction;
importjavaxservlethttp*;
importorgapachestrutsaction*;
publicclassValidatorActionextendsAction
{
publicActionForwardexecute(ActionMappingmappingActionFormform
HttpServletRequestrequestHttpServletResponseresponse)
{
responsesetCharacterEncoding(GBK);
try
{
responsegetWriter()println(验证成功!);
}
catch(Exceptione)
{
}
returnnull;
}
}
ValidatorAction类是一个空的Struts动作类(除了输出一行验证成功!字符串)这个动作是为了正常运行含有Struts元素的JSP程序所编写的在以后的代码中会经常使用到这个Struts动作类
【第步】配置strutsconfigxml文件
配置FirstValidatorForm和ValidatorAction的代码如下所示
<formbeanname=firstValidatorFormtype=actionformFirstValidatorForm/>
<actionname=firstValidatorFormpath=/firstValidatorscope=request type=actionValidatorActioninput=/firstValidatorjsp/>
其中firstValidatorjsp是用户录入信息的界面也是显示错误信息的界面
【第步】建立firstValidatorjsp在Web根目录建立一个firstValidatorjsp文件代码如下<!——[endif]——>
<%@pagepageEncoding=GBK%>
<%@tagliburi=htmlprefix=html%>
<html>
<head>
<title>第一个Validator程序</title>
</head>
<body>
<html:formaction=firstValidator>
姓名
<html:textproperty=name/> <fontcolor=red><html:errorsproperty=name/></font><p>
年龄
<html:textproperty=age/> <fontcolor=red><html:errorsproperty=age/></font><p>
EMail
<html:textproperty=email/> <fontcolor=red><html:errorsproperty=email/></font><p>
<html:submitvalue=提交/>
</html:form>
</body>
</html>
从firstValidatorjsp中可以看出不管是否使用Validator框架进和验证对于JSP代码来说是完全一样的仍然是使用<htmlerrors>元素来显示错误信息但要注意在使用Validator框架时<htmlerrors>标签的property属性的值就是所对应ValidatorForm的子类的属性名
【第步】配置validatorxml文件在本例中只使用了一个XML文件(validatorxml)来配置要验证的对象validatorxml的代码如下<!——[endif]——>
<?xmlversion=encoding=GBK?>
<!DOCTYPEformvalidationPUBLIC
//ApacheSoftwareFoundation//DTDCommonsValidatorRulesConfiguration//EN
___dtd>
<formvalidation>
<formset>
<formname=firstValidatorForm>
<fieldproperty=namedepends=requiredmaxlengthminlengthmask>
<msgname=requiredkey=errornameblank/>
<msgname=minlengthkey=errornameminLength/>
<msgname=maxlengthkey=errornamemaxLength/>
<msgname=maskkey=errornamealphanum/>
<argname=minlengthkey=${var:minlength}position=resource=false/>
<argname=maxlengthkey=${var:maxlength}position=resource=false/>
<var>
<varname>minlength</varname>
<varvalue></varvalue>
</var>
<var>
<varname>maxlength</varname>
<varvalue></varvalue>
</var>
<var>
<varname>mask</varname>
<varvalue>^[azAZ]*$</varvalue>
</var>
</field>
<fieldproperty=agedepends=requiredintegerintRange>
<msgname=requiredkey=errorageblank/>
<msgname=integerkey=errorageinteger/>
<msgname=intRangekey=errorageintRange/>
<argname=intRangekey=${var:min}position=resource=false/>
<argname=intRangekey=${var:max}position=resource=false/>
<var>
<varname>min</varname>
<varvalue></varvalue>
</var>
<var>
<varname>max</varname>
<varvalue></varvalue>
</var>
</field>
<fieldproperty=emaildepends=requiredemail>
<msgname=requiredkey=erroremailblank/>
<msgname=emailkey=erroremailinvalid/>
</field>
</form>
</formset>
</formvalidation>
validatorxml文件中的所有配置都放到<formvalidation>元素中在<formvalidation>元素中有一个<formset>子元素这个元素可以定义多个<Form>元素这个元素用来定义要验证的ValidatorForm类的子类其中name属性值就是<formbean>元素中的name属性值
<field>元素用来定义某个属性的约束条件如第一个<field>元素定义了name属性必须存在(required)必须要满足最小长度(minlength)和最大长度(maxlength)以及还要通过mask所指的正则表达式的验证
<msg>元素用来定义出错信息在属性文件中的Key(所有的出错信息都在属性文件中)<arg>元素用来向出错信息中的参数传递参数值<var>元素用来定义变量名和变量值
【第步】在ErrorDescriptionproperties文件中添加错误信息
打开ErrorDescriptionproperties文件在文件的后面添加如下的内容
errornameblank=姓名不能为空
errornameminLength=姓名的长度不能小于{}
errornamemaxLength=姓名的长度不能大于{}
errornamealphanum=姓名必须由字母和数字组成
errorageblank=年龄不能为空
errorageinteger=年龄必须为数字
errorageintRange=年龄必须在{}和{}之间
启动Tomcat在IE中输入如下的URL来测试程序
//localhost/samples/%firstValidatorjsp
在输入一些错误信息后点击提交按钮将出现类似下图的效果