`
weigang.gao
  • 浏览: 482339 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

struts1.x简单的数据校验

 
阅读更多

一、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框架可以完成更复杂的验证工作。

二、配置和使用Validator框架

 1.  安装Validator框架

    由于ValidatorStruts的一个插件,因此,就需要在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文件。

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

<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;
      }
  }

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

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

        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" />&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的代码如下:

  <?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文件中的所有配置都放到<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文件,在文件的后面添加如下的内容:

  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和struts2.x区别

    Struts1.x的验证机制基于ActionForm,利用Commons Validator等库进行数据校验,而Struts2.x则采用了更为强大的验证框架,如XWork Validator,支持链式验证和更复杂的验证规则,使得数据验证更加全面和细致。...

    Struts1.x系列教程(网摘-全)

    10. **数据校验**:ActionForm的validate()方法可以实现服务器端的数据校验,错误信息可以通过ActionErrors对象返回并显示在JSP页面上。 11. **Tiles框架集成**:Struts1.x可与Tiles框架结合使用,实现页面布局和...

    Struts1.x_Project.zip

    在这个"Struts1.x_Project.zip"压缩包中,我们可以看到一个使用Struts1.x框架构建的简易订餐系统的实例。这个项目将帮助我们深入理解MVC架构以及Struts1.x的核心特性。 **MVC模式详解:** MVC模式是软件设计中的一...

    struts1.x 常用知识详解

    2. **数据校验**:ActionForm可以包含数据校验逻辑,确保提交的数据符合预期格式和规则。 三、JSP与标签库 1. **Struts标签库**:Struts1.x提供了丰富的JSP标签,如logic、bean、html等,简化了页面开发,提高了...

    Struts1.x 中文帮助文档

    它会涵盖基本的表单提交、文件上传下载、异常处理、国际化、数据校验等多个方面,帮助初学者快速上手。尽管Struts1.x的时代已过去,但其设计理念和模式仍然是现代Web开发的重要基础。通过深入研究,你不仅能提升自己...

    struts in action (struts1.x)

    `Struts 1.x` 提供了内置的表单验证机制,允许开发者在 `ActionForm` 类中定义校验规则,便于在客户端和服务器端进行数据验证。 ### 8. 整合其他技术 `Struts 1.x` 可以很好地与其他开源技术集成,如Hibernate...

    Struts2与Struts1.x的深度比较

    - **Struts1.x** 验证通常在ActionForm中实现,通过自定义校验逻辑,如果验证失败,需要手动设置错误信息并跳转回表单页面。 - **Struts2** 验证可以通过注解或XML配置实现,可以将验证逻辑移到模型对象中,更加...

    Struts1.x使用回顾

    Struts1.x是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。在Web开发领域,Struts1.x曾是广泛使用的框架,它帮助开发者构建结构清晰、易于维护的Web...

    Struts2.x 项目实战

    Struts2.x提供了丰富的拦截器(Interceptor),这些拦截器可以对Action执行前后的流程进行定制,比如日志记录、权限验证、数据校验等。拦截器链使得业务逻辑的处理更加灵活和模块化。 配置方面,Struts2.x使用XML...

    struts1.x_Tags

    Struts1.x_Tags是Apache Struts框架的一个重要组成部分,它是用于构建MVC(Model-View-Controller)架构Web应用程序的标签库。Struts1.x_Tags提供了丰富的JSP标签,使得开发者能够更加方便地创建动态用户界面,提高...

    structs1.x的配置及一个简单的登陆和增删改查的例子

    Struts1.x是一个经典的Java Web框架,用于构建MVC(模型-...在这个"SIMS"项目中,我们可以看到Struts1.x被用于构建一个包含登录功能和CRUD操作的简单系统。学习并熟练掌握这些基础知识对于理解Java Web开发至关重要。

    struts2.x文件上传

    Struts2提供了一套完整的验证机制,可以通过在Action类中定义校验规则或者在struts.xml中配置校验规则来检查文件大小、类型等。如果上传过程中出现错误,可以通过返回特定的结果代码来跳转到错误页面。 7. **文件...

    SSH(spring,struts2.x,spring +mysql+toncat)登录实例

    SSH(Spring、Struts2.x 和 Hibernate)是一个经典的Java企业级开发框架组合,常用于构建高效、可维护的Web应用程序。这个登录实例是基于这些框架的集成应用,结合了MySQL数据库和Tomcat服务器,提供了用户登录和...

    传智播客struts2全程学习笔记

    5. **输入校验改进**:Struts2的输入校验功能得到了显著增强,它可以针对特定的方法进行校验,解决了Struts1中存在的问题,提高了开发效率。 6. **国际化支持**:Struts2提供了更好的国际化支持,可以方便地管理...

    struts拦截器jar 包

    拦截器在请求处理流程中扮演了重要角色,它允许我们在Action执行前后插入自定义的逻辑,如日志、权限检查、数据校验等。 标题中的"struts拦截器jar包"指的是用于增强Struts 1.x框架功能的特定库,它们是`saif-0.1....

    java-web-tld.rar_java tld

    3. **Struts2.x标签库**:介绍Struts2.x提供的标签,如`s:form`标签用于创建表单,`s:property`标签用于显示对象属性,`s:action`标签用于执行Action,以及各种数据校验和国际化标签。 4. **TLD注册与使用**:解释...

    Struts.2权威指南--基于WebWork核心的MVC开发.0003.pdf

    2. **类型转换和校验**:Struts.2支持自动的参数类型转换和数据校验,简化了开发者的编码工作。 3. **国际化和本地化支持**:通过资源文件,Struts.2能够轻松实现多语言支持和本地化设置,满足全球化需求。 4. **...

    Struts2入门教程(全新完整版)

    10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置相关 8 4.分工合作include:指定多个配置文件 10 5.tomcat认证访问 10 6.初识拦截器 11 7....

Global site tag (gtag.js) - Google Analytics