转载于http://www.blogjava.net/nokiaguy/archive/2009/02/12/254421.html

一、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]-->

<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文件,代码如下:

  1. package actionform;
  2. import org.apache.struts.validator.ValidatorForm;
  3. public class FirstValidatorForm extends ValidatorForm // 必须从ValidatorForm继承
  4. {
  5. private String name;
  6. private String age;
  7. private String email;
  8. public String getName()
  9. {
  10. return name;
  11. }
  12. public void setName(String name)
  13. {
  14. this.name = name;
  15. }
  16. public String getEmail()
  17. {
  18. return email;
  19. }
  20. public void setEmail(String email)
  21. {
  22. this.email = email;
  23. }
  24. public String getAge()
  25. {
  26. return age;
  27. }
  28. public void setAge(String age)
  29. {
  30. this.age = age;
  31. }
  32. }

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

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

  1. package action;
  2. import javax.servlet.http.*;
  3. import org.apache.struts.action.*;
  4. public class ValidatorAction extends Action
  5. {
  6. public ActionForward execute(ActionMapping mapping, ActionForm form,
  7. HttpServletRequest request, HttpServletResponse response)
  8. {
  9. response.setCharacterEncoding("GBK");
  10. try
  11. {
  12. response.getWriter().println("验证成功!");
  13. }
  14. catch (Exception e)
  15. {
  16. }
  17. return null;
  18. }
  19. }

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

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

配置FirstValidatorForm和ValidatorAction的代码如下所示

  1. <form-bean name="firstValidatorForm" type=" actionform.FirstValidatorForm" />
  2. <action name="firstValidatorForm" path="/firstValidator" scope="request" type=" action.ValidatorAction" input="/firstValidator.jsp"/>

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

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

  1. <%@ page pageEncoding="GBK"%>
  2. <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
  3. <html>
  4. <head>
  5. <title>第一个Validator程序</title>
  6. </head>
  7. <body>
  8. <html:form action="firstValidator" >
  9. 姓 名:
  10. <html:text property="name" />&nbsp;&nbsp;<font color="red"><html:errors property="name"/></font><p>
  11. 年 龄:
  12. <html:text property="age"/>&nbsp;&nbsp;<font color="red"><html:errors property="age"/></font><p>
  13. EMail:
  14. <html:text property="email"/>&nbsp;&nbsp;<font color="red"><html:errors property="email"/></font><p>
  15. <html:submit value="提交"/>
  16. </html:form>
  17. </body>
  18. </html>

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

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

  1. <!--[endif]-->
  2. <?xml version="1.0" encoding="GBK" ?>
  3. <!DOCTYPE form-validation PUBLIC
  4. "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
  5. "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
  6. <form-validation>
  7. <formset>
  8. <form name="firstValidatorForm">
  9. <field property="name" depends="required,maxlength,minlength,mask">
  10. <msg name="required" key="error.name.blank" />
  11. <msg name="minlength" key="error.name.minLength" />
  12. <msg name="maxlength" key="error.name.maxLength" />
  13. <msg name="mask" key="error.name.alphanum" />
  14.  
  15. <arg name="minlength" key="${var:minlength}" position="0" resource="false" />
  16. <arg name="maxlength" key="${var:maxlength}" position="0" resource="false" />
  17. <var>
  18. <var-name>minlength</var-name>
  19. <var-value>5</var-value>
  20. </var>
  21. <var>
  22. <var-name>maxlength</var-name>
  23. <var-value>10</var-value>
  24. </var>
  25. <var>
  26. <var-name>mask</var-name>
  27. <var-value>^[a-zA-Z0-9]*$</var-value>
  28. </var>
  29. </field>
  30. <field property="age" depends="required,integer,intRange">
  31. <msg name="required" key="error.age.blank" />
  32. <msg name="integer" key="error.age.integer" />
  33. <msg name="intRange" key="error.age.intRange" />
  34.  
  35. <arg name="intRange" key="${var:min}" position="0" resource="false" />
  36. <arg name="intRange" key="${var:max}" position="1" resource="false" />
  37. <var>
  38. <var-name>min</var-name>
  39. <var-value>18</var-value>
  40. </var>
  41. <var>
  42. <var-name>max</var-name>
  43. <var-value>60</var-value>
  44. </var>
  45. </field>
  46. <field property="email" depends="required,email">
  47. <msg name="required" key="error.email.blank" />
  48. <msg name="email" key="error.email.invalid" />
  49. </field>
  50. </form>
  51. </formset>
  52. </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文件,在文件的后面添加如下的内容:

  1. error.name.blank = 姓名不能为空
  2. error.name.minLength = 姓名的长度不能小于{0}
  3. error.name.maxLength = 姓名的长度不能大于{0}
  4. error.name.alphanum = 姓名必须由字母和数字组成
  5. error.age.blank = 年龄不能为空
  6. error.age.integer = 年龄必须为数字
  7. error.age.intRange = 年龄必须在{0}和{1}之间

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

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

Struts1.x 中的 Validate 框架的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  2. 用JQuery Validate框架,在IE8下验证报错问题解决

    网站后台用了JQuery Validate框架,版本是jQuery Validation Plugin 1.8.1 因为用的时间比较久了,一直没有更新新版本. 最近公司信息录入员有调整,没有IE11浏 ...

  3. struts2:数据校验,通过Action中的validate()方法实现校验,图解

    根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...

  4. struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)

    前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...

  5. 用一天的时间学习Java EE中的SSH框架

    首先说明一下,本人目前主要从事.NET领域的工作,但对于C++.Java.OC等语言也略知一二,周末闲来无事,特花费一天的时间学习了一下Java中的SSH框架,希望把学习过程中的心得体会与园友们进行分 ...

  6. Struts2中的校验框架

    Struts2提供的客户端校验 尽管这种支持比较弱,但采用Struts2中的客户端校验时需要注意以下几点 1..将<s:form validate="true">的va ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...

  8. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  9. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

随机推荐

  1. Django(四)

    一.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? 1.Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpResp ...

  2. C++ 模拟Map

    JDK中的Map类型采用键值对的方式保存数据,且键(key)不能重复.在HashMap的实现中实际采用了Hash分类加数组排序的方式.在C++中我没有采用这样的算法.而是通过首先对Key值进行二叉树排 ...

  3. Time crumbles things; everything grows old under the power of Time and is forgotten through the lapse of Time

    Time crumbles things; everything grows old under the power of Time and is forgotten through the laps ...

  4. MVC中view和controller相互传值的方法

    MVC项目中,在view层如果使用前台框架,框架中会有封装好的相互传值方法.但是,那些postdata[][]方法不一定能够满足功能需求,反而一些常用的传值方法可能会刚好解决它们的不足.总结如下: 一 ...

  5. Flesch Reading Ease -POJ3371模拟

    Flesch Reading Ease Time Limit: 1000MS Memory Limit: 65536K Description Flesch Reading Ease, a reada ...

  6. 用STM32CubeMX创建FreeRTOS项目

    1. 目标, PG13,PG14双线程双闪灯. 2. 测试平台 stm32f429i-disco keil v5.13.0.0 CubeMx 4.8.0 3. 步骤 3.1 打开cube, PG13, ...

  7. HTML 5 音频

    HTML 5 音频 ================================================================================= 音频是视频的重要 ...

  8. Discuz!模板解析语法

    <!--{eval echo autostart("); }--> PHP中使用template()函数显示已存在模板 在Discuz!程序执行中可以通过 include tem ...

  9. eval 简单应用

     --> 循环来定义变量 //想定义四个变量 one,two,three,four var initVar = ['one','two','three','four']; initVar.for ...

  10. Spark在Hadoop集群上的配置(spark-1.1.0-bin-hadoop2.4)

    运行Spark服务,需要在每个节点上部署Spark. 可以先从主节点上将配置修改好,然后把Spark直接scp到其他目录. 关键配置 修改conf/spark-env.sh文件: export JAV ...