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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Struts1.x系列教程(9):上传任意多个文件 Struts2教程4:使用validate方法验证数据 Struts2教程5:使用Validation框架验证数据 一、Validator框架的优势       Validator框架是一个Struts插件,最初由David Winterfeldt设计并实现。

一、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页面中放一个单独的元素就可以将服务端的验证转换为客户端验证(基于JavaScript的验证)
    虽然Validator框架的预定义验证已经可以满足大多数的验证需求了,但在某些特殊情况下,这些预定义验证就无法满足我们的需求了,为此,Validator框架也为开发人员提供了扩展验证机制的功能。这也使得Validator框架可以完成更复杂的验证工作。

二、配置和使用Validator框架

 

1.  安装Validator框架

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

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

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

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

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

<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的子类)

工程目录>/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;
      }
  }

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

【第2步】建立ValidatorAction类(Action的子类)
    工程目录>/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;
      }
  }

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

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

    配置FirstValidatorFormValidatorAction的代码如下所示

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

  <%@ 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>

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



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

  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>

        validator.xml文件中的所有配置都放到元素中。在元素中有一个子元素,这个元素可以定义多个

元素,这个元素用来定义要验证的ValidatorForm类的子类。其中name属性值就是元素中的name属性值。

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

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

【第6步】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}之间

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

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



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




目录
相关文章
|
安全 Java API
ServletRequest类及其使用方法介绍
ServletRequest类及其使用方法介绍
598 6
|
10月前
|
DataWorks 监控 数据建模
DataWorks产品体验评测
DataWorks产品体验评测
|
11月前
|
存储 消息中间件 人工智能
《多模态数据信息提取》解决方案测评
先预示一下,本次测评有福利彩蛋哟,快过年了,喜庆的对联需要吧;大冬天的,保暖触屏手套需要吧;走过路过不要错过。
321 10
|
11月前
|
存储 弹性计算 运维
云服务诊断体验测评
一文带你了解云服务诊断产品的优与劣
399 40
|
10月前
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
546 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
10月前
|
数据采集 人工智能 分布式计算
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
在数据驱动的时代,大数据分析和AI模型训练对数据预处理的效率要求极高。传统的Pandas工具在小数据集下表现出色,但面对大规模数据时力不从心。阿里云推出的Python分布式计算框架MaxFrame,以“Pandas风格”为核心设计理念,旨在降低分布式计算门槛,同时支持超大规模数据处理。MaxFrame不仅保留了Pandas的操作习惯,还通过底层优化实现了高效的分布式调度、内存管理和容错机制,并深度集成阿里云大数据生态。本文将通过实践评测,全面解析MaxFrame的能力与价值,展示其在大数据和AI场景中的卓越表现。
252 4
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
|
10月前
|
人工智能 监控 API
体验《多模态数据信息提取》
体验《多模态数据信息提取》
|
11月前
|
机器学习/深度学习 算法 数据处理
《MaxFrame:数据处理的卓越实践与提升》
MaxFrame是一款融合AI技术和Pandas库的数据处理工具,提供智能分析、预测及高效的数据清洗、转换功能。它在图像识别和结构化数据处理方面表现出色。然而,在大规模数据处理时性能有待提升,建议优化算法和内存管理。此外,增加数据可视化、机器学习集成等功能,改进用户界面并加强数据安全保障,将使MaxFrame更全面地满足用户需求,成为数据处理领域的领先产品。
176 32
|
11月前
|
数据可视化 测试技术 UED
《多模态数据信息提取》解决方案评测报告
1. **部署操作界面**:整体直观,通过点击和拖拽完成配置,但复杂配置环节界面元素密集,需优化布局;部分步骤缺乏提示信息,错误处理不够明确。 2. **部署文档**:表述逻辑清晰,引导准确,但在环境依赖和参数配置上存在不足,建议增加详细列表和示例,补充错误处理章节。 3. **函数应用模板**:简化了部署流程,但部分模板参数说明不清晰,适用场景描述不足,需完善参数说明和适用条件。
《多模态数据信息提取》解决方案评测报告