一、
Validator
框架的优势
Validator 框架是一个 Struts 插件,最初由 David Winterfeldt 设计并实现。 Validator 框架从 Struts 0.5 时代就可以使用,但那时 Validator 框架只是被捐助的一个 jar 包。 Apache 组织为了使开发人员更方便地使用 Validator 框架,决定从 Struts1.1 开始,将 Validator 框架作为 Struts 的一部分同 Struts 一起发布。
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 框架的预定义验证已经可以满足大多数的验证需求了,但在某些特殊情况下,这些预定义验证就无法满足我们的需求了,为此, 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 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]-->
<!--[endif]-->
<
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 >
< 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 的子类)
在本节将举一个例子来演示如何使用 Validator 框架来验证数据。我们需要按着如下的六步来完成这个例子:
【第 1 步】 建立 FirstValidatorForm 类( ValidatorForm 的子类)
在
<samples
工程目录
>\src\actionform
目录中建立一个
FirstValidatorForm.java
文件,代码如下:
package
actionform;
import org.apache.struts.validator.ValidatorForm;
public class FirstValidatorForm extends ValidatorForm // 必须从ValidatorForm继承
{
private String name;
private String age;
private String email;
public String getName()
{
return name;
}
public void setName(String name)
{
this .name = name;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this .email = email;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this .age = age;
}
}
import org.apache.struts.validator.ValidatorForm;
public class FirstValidatorForm extends ValidatorForm // 必须从ValidatorForm继承
{
private String name;
private String age;
private String email;
public String getName()
{
return name;
}
public void setName(String name)
{
this .name = name;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this .email = email;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this .age = age;
}
}
要注意的是,要想使用
Validator
框架验证数据,
Form
类就必须从
ValidatorForm
继承,而不能从
ActionForm
继承。这是因为
ValidatorForm
类是从
ActionForm
继承的,在
ValidatorForm
类中已经覆盖了
validate
方法来自动进行验证工作,因此,我们在
ValidatorForm
的子类中就不用写
validate
方法了。
<!--[endif]-->
<!--[endif]-->
【第
2
步】
建立
ValidatorAction
类(
Action
的子类)
在 <samples 工程目录 >\src\action 目录中建立一个 ValidatorAction.java 文件,代码如下:
在 <samples 工程目录 >\src\action 目录中建立一个 ValidatorAction.java 文件,代码如下:
package
action;
import javax.servlet.http. * ;
import org.apache.struts.action. * ;
public class ValidatorAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
response.setCharacterEncoding( " GBK " );
try
{
response.getWriter().println( " 验证成功! " );
}
catch (Exception e)
{
}
return null ;
}
}
import javax.servlet.http. * ;
import org.apache.struts.action. * ;
public class ValidatorAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
response.setCharacterEncoding( " GBK " );
try
{
response.getWriter().println( " 验证成功! " );
}
catch (Exception e)
{
}
return null ;
}
}
ValidatorAction
类是一个空的
Struts
动作类(除了输出一行“验证成功!”字符串)。这个动作是为了正常运行含有
Struts
元素的
JSP
程序所编写的。在以后的代码中会经常使用到这个
Struts
动作类。
【第 3 步】 配置 struts-config.xml 文件
【第 3 步】 配置 struts-config.xml 文件
配置
FirstValidatorForm
和
ValidatorAction
的代码如下所示
<
form-bean
name
="firstValidatorForm"
type
=" actionform.FirstValidatorForm"
/>
< action name ="firstValidatorForm" path ="/firstValidator" scope ="request" type =" action.ValidatorAction" input ="/firstValidator.jsp" />
< action name ="firstValidatorForm" path ="/firstValidator" scope ="request" type =" action.ValidatorAction" input ="/firstValidator.jsp" />
其中
firstValidator.jsp
是用户录入信息的界面,也是显示错误信息的界面。
【第 4 步】 建立 firstValidator.jsp
在 Web 根目录建立一个 firstValidator.jsp 文件,代码如下:
<!--[endif]-->
【第 4 步】 建立 firstValidator.jsp
在 Web 根目录建立一个 firstValidator.jsp 文件,代码如下:
<!--[endif]-->
<
%@ 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" /> < font color ="red" >< html:errors property ="name" /></ font >< p >
年 龄:
< html:text property ="age" /> < font color ="red" >< html:errors property ="age" /></ font >< p >
EMail:
< html:text property ="email" /> < font color ="red" >< html:errors property ="email" /></ font >< p >
< html:submit value ="提交" />
</ html:form >
</ body >
</ html >
< %@ 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" /> < font color ="red" >< html:errors property ="name" /></ font >< p >
年 龄:
< html:text property ="age" /> < font color ="red" >< html:errors property ="age" /></ font >< p >
EMail:
< html:text property ="email" /> < 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]-->
【第 5 步】 配置 validator.xml 文件
在本例中只使用了一个 XML 文件 (validator.xml) 来配置要验证的对象。 validator.xml 的代码如下:
<!--[endif]-->
<?
xml version="1.0" encoding="GBK"
?>
<! DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.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 >
<! DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.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 文件,在文件的后面添加如下的内容:
打开 ErrorDescription.properties 文件,在文件的后面添加如下的内容:
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 }之间
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
在输入一些错误信息后,点击“提交”按钮,将出现类似下图的效果。
http://localhost:8080/samples/%20firstValidator.jsp
在输入一些错误信息后,点击“提交”按钮,将出现类似下图的效果。
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215191,如需转载请自行联系原作者