Struts1.x系列教程(10):Validator验证框架入

系统 1780 0

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇: Struts1.x系列教程(9):上传任意多个文件

Struts2教程4:使用validate方法验证数据

Struts2教程5:使用Validation框架验证数据

一、 Validator 框架的优势



Validator 框架是一个 Struts 插件,最初由 David Winterfeldt 设计并实现。 Validator 框架从 Struts 0.5 时代就可以使用,但那时 Validator 框架只是被捐助的一个 jar 包。 Apache 组织为了使开发人员更方便地使用 Validator 框架,决定从 Struts1.1 开始,将 Validator 框架作为 Struts 的一部分同 Struts 一起发布。

Validator 框架可以在 XML 文件中配置验证规则和验证对象。因此,使用 Validator 框架可以无需在 ActionForm 的子类中覆盖 validate 方法就可以很方便地验证客户端的提交数据。由于 Validator 框架内置了很多预定义的验证机制,如验证某个属性是否存在,验证 EMail 是否合法等。所以在一般情况下,只需要配置 XML 文件就可以满足我们的验证需求。

在使用 Validator 框架时,就会发现这种方式要比直接使用 validate 方法进行验证会给我们带来如下的好处:

1. 更容易维护。 由于验证信息可以被放置在同一个配置文件中,因此,我们可以更容易地来维护这些验证信息。

2. 标准化。 由于很多简单的验证都是相同的。如用户名和密码都要求由字母、数字以及下划下组成。如果将这些验证都写在 validate 方法中,对这些验证进行标准化非常困难。而在 Validator 框架中的这些验证机制都是预先定义的,因此,标准化相同的验证对于 Validator 框架来说将是一件非常轻松的事。

3. 避免重造轮子。 虽然一些验证很简单,但如果想正确实现它们也是非常困难的。一个典型的例子是验证 EMail 地址的格式。如果这个验证要想完美无缺,就必须按着 RFC-2822 规范的要求来验证 EMail 地址。而如果我们使用 Validator 框架,就无需再重造轮子来验证 EMail 地址了。

4. 减少重复代码的数量。 由于 Validator 框架提供了很多预定义的验证,因此,我们可以避免自己写很多重复的代码进行验证。当然,我们也可以将大量使用的验证封装在类的方法中,这些虽然可以避免大量的重复劳动,但这就意味着我们团队的新成员要使用这些被封装的验证方法之前必须先学习它们。而最糟糕的情况是很多开发人员可能会忘记使用这些由其他成员实现的验证库,而自己重新编写具有同样功能的验证库。当然,这一切如果使用 Validator 框架就都可以得到解决。

5. 客户端和服务端验证自动切换。 我们只需要简单地在 JSP 页面中放一个单独的 <html::javascript/> 元素就可以将服务端的验证转换为客户端验证(基于 JavaScript 的验证)
虽然 Validator 框架的预定义验证已经可以满足大多数的验证需求了,但在某些特殊情况下,这些预定义验证就无法满足我们的需求了,为此, Validator 框架也为开发人员提供了扩展验证机制的功能。这也使得 Validator 框架可以完成更复杂的验证工作。
<!--[endif]-->

二、配置和使用 Validator 框架

1. 安装 Validator 框架

由于 Validator Struts 的一个插件,因此,就需要在 struts-config.xml 文件中按着 Struts 插件的方式来安装 Validator 框架。打开 struts-config.xml 文件,在 <struts-config> 元素中加入一个 <plug-in> 子元素,如下面的代码所示:

< plug-in className ="org.apache.struts.validator.ValidatorPlugIn" >
< set-property property ="pathnames" value ="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml" />
</ plug-in >

其中 <set-property> 元素设置了插件中使用的 pathnames 属性的值。在 pathnames 属性值中包含了两个 xml 文件。

1 validator-rules.xml :在这个文件中声明了 Validator 框架的预定义验证。这个文件可以在 Struts 的发行包的 lib 目录中可以找到这个文件。在使用 MyEclipse Web 工程添加 Struts 功能后,会自动将这个文件加到 WEB-INF 目录中。

2 validator.xml :这个文件定义了要验证的对象。实际上,在这个文件中,包含了一个或多个 ActionForm 的子类及其要验证的属性和验证规则。因此,这个文件就相当于 validate 方法。在 Validator 框架中,可以有多个定义验证对象的 xml 文件(可以将不同的 ActionForm 的子类分散到不同的 xml 文件中),中间用逗号 (,) 隔开,如下面的代码所示:
<!--[endif]-->

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < plug-in className ="org.apache.struts.validator.ValidatorPlugIn" >
< set-property property ="pathnames" value ="/WEB-INF/validator-rules.xml,/WEB-INF/validator1.xml,
/WEB-INF/validator2.xml, /WEB-INF/validator3.xml"
/>
</ plug-in >

2. 使用 Validator 框架的一个例子



在本节将举一个例子来演示如何使用 Validator 框架来验证数据。我们需要按着如下的六步来完成这个例子:



【第 1 步】 建立 FirstValidatorForm 类( ValidatorForm 的子类)

<samples 工程目录 >\src\actionform 目录中建立一个 FirstValidatorForm.java 文件,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> package actionform;
import org.apache.struts.validator.ValidatorForm;
public class FirstValidatorForm extends ValidatorForm // 必须从ValidatorForm继承
{
private Stringname;
private Stringage;
private Stringemail;
public StringgetName()
{
return name;
}
public void setName(Stringname)
{
this .name = name;
}
public StringgetEmail()
{
return email;
}
public void setEmail(Stringemail)
{
this .email = email;
}
public StringgetAge()
{
return age;
}
public void setAge(Stringage)
{
this .age = age;
}
}

要注意的是,要想使用 Validator 框架验证数据, Form 类就必须从 ValidatorForm 继承,而不能从 ActionForm 继承。这是因为 ValidatorForm 类是从 ActionForm 继承的,在 ValidatorForm 类中已经覆盖了 validate 方法来自动进行验证工作,因此,我们在 ValidatorForm 的子类中就不用写 validate 方法了。
<!--[endif]-->

【第 2 步】 建立 ValidatorAction 类( Action 的子类)
<samples 工程目录 >\src\action 目录中建立一个 ValidatorAction.java 文件,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> package action;
import javax.servlet.http. * ;
import org.apache.struts.action. * ;
public class ValidatorAction extends Action
{
public ActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
{
response.setCharacterEncoding(
" GBK " );
try
{
response.getWriter().println(
" 验证成功! " );
}
catch (Exceptione)
{
}
return null ;
}
}

ValidatorAction 类是一个空的 Struts 动作类(除了输出一行“验证成功!”字符串)。这个动作是为了正常运行含有 Struts 元素的 JSP 程序所编写的。在以后的代码中会经常使用到这个 Struts 动作类。

【第 3 步】 配置 struts-config.xml 文件

配置 FirstValidatorForm ValidatorAction 的代码如下所示

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < form-bean name ="firstValidatorForm" type ="actionform.FirstValidatorForm" />
< action name ="firstValidatorForm" path ="/firstValidator" scope ="request" type ="action.ValidatorAction" input ="/firstValidator.jsp" />

其中 firstValidator.jsp 是用户录入信息的界面,也是显示错误信息的界面。

【第 4 步】 建立 firstValidator.jsp
Web 根目录建立一个 firstValidator.jsp 文件,代码如下:
<!--[endif]-->

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < %@page pageEncoding ="GBK" % >
< %@taglib uri ="http://struts.apache.org/tags-html" prefix ="html" % >
< html >
< head >
< title > 第一个Validator程序 </ title >
</ head >
< body >
< html:form action ="firstValidator" >
姓名:
< html:text property ="name" /> &nbsp;&nbsp; < font color ="red" >< html:errors property ="name" /></ font >< p >
年龄:
< html:text property ="age" /> &nbsp;&nbsp; < font color ="red" >< html:errors property ="age" /></ font >< p >
EMail:
< html:text property ="email" /> &nbsp;&nbsp; < font color ="red" >< html:errors property ="email" /></ font >< p >
< html:submit value ="提交" />
</ html:form >
</ body >
</ html >

firstValidator.jsp 中可以看出,不管是否使用 Validator 框架进和验证,对于 JSP 代码来说是完全一样的。仍然是使用 <html:errors> 元素来显示错误信息。但要注意,在使用 Validator 框架时, <html:errors> 标签的 property 属性的值就是所对应 ValidatorForm 的子类的属性名。



【第 5 步】 配置 validator.xml 文件
在本例中只使用了一个 XML 文件 (validator.xml) 来配置要验证的对象。 validator.xml 的代码如下:
<!--[endif]-->

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <? xmlversion="1.0"encoding="GBK" ?>
<! DOCTYPEform-validationPUBLIC
"-//ApacheSoftwareFoundation//DTDCommonsValidatorRulesConfiguration1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"
>
< form-validation >
< formset >
< form name ="firstValidatorForm" >
< field property ="name" depends ="required,maxlength,minlength,mask" >
< msg name ="required" key ="error.name.blank" />
< msg name ="minlength" key ="error.name.minLength" />
< msg name ="maxlength" key ="error.name.maxLength" />
< msg name ="mask" key ="error.name.alphanum" />

< arg name ="minlength" key ="${var:minlength}" position ="0" resource ="false" />
< arg name ="maxlength" key ="${var:maxlength}" position ="0" resource ="false" />
< var >
< var-name > minlength </ var-name >
< var-value > 5 </ var-value >
</ var >
< var >
< var-name > maxlength </ var-name >
< var-value > 10 </ var-value >
</ var >
< var >
< var-name > mask </ var-name >
< var-value > ^[a-zA-Z0-9]*$ </ var-value >
</ var >
</ field >
< field property ="age" depends ="required,integer,intRange" >
< msg name ="required" key ="error.age.blank" />
< msg name ="integer" key ="error.age.integer" />
< msg name ="intRange" key ="error.age.intRange" />

< arg name ="intRange" key ="${var:min}" position ="0" resource ="false" />
< arg name ="intRange" key ="${var:max}" position ="1" resource ="false" />
< var >
< var-name > min </ var-name >
< var-value > 18 </ var-value >
</ var >
< var >
< var-name > max </ var-name >
< var-value > 60 </ var-value >
</ var >
</ field >
< field property ="email" depends ="required,email" >
< msg name ="required" key ="error.email.blank" />
< msg name ="email" key ="error.email.invalid" />
</ field >
</ form >
</ formset >
</ form-validation >

validator.xml 文件中的所有配置都放到 <form-validation> 元素中。在 <form-validation> 元素中有一个 <formset> 子元素,这个元素可以定义多个 <Form> 元素,这个元素用来定义要验证的 ValidatorForm 类的子类。其中 name 属性值就是 <form-bean> 元素中的 name 属性值。

<field> 元素用来定义某个属性的约束条件,如第一个 <field> 元素定义了 name 属性必须存在 (required) 、必须要满足最小长度( minlength )和最大长度( maxlength )以及还要通过 mask 所指的正则表达式的验证。

<msg> 元素用来定义出错信息在属性文件中的 Key (所有的出错信息都在属性文件中)。 <arg> 元素用来向出错信息中的参数传递参数值。 <var> 元素用来定义变量名和变量值。

【第 6 步】 ErrorDescription.properties 文件中添加错误信息

打开 ErrorDescription.properties 文件,在文件的后面添加如下的内容:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> error.name.blank = 姓名不能为空
error.name.minLength
= 姓名的长度不能小于{ 0 }
error.name.maxLength
= 姓名的长度不能大于{ 0 }
error.name.alphanum
= 姓名必须由字母和数字组成
error.age.blank
= 年龄不能为空
error.age.integer
= 年龄必须为数字
error.age.intRange
= 年龄必须在{ 0 }和{ 1 }之间

启动Tomcat,在IE中输入如下的URL来测试程序:

http://localhost:8080/samples/%20firstValidator.jsp



在输入一些错误信息后,点击“提交”按钮,将出现类似下图的效果。




下一篇:
Struts1.x系列教程(11):Validator验证框架高级应用



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》 发布

《Java Web开发速学宝典》 出版,欢迎定购

Struts1.x系列教程(10):Validator验证框架入门


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论