首页
登录 | 注册

Validator验证框架



5.4  Validator验证框架
Struts1.1及以上版本,在提供了动态ActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架。

Validator验证框架是通过配置验证规则实现验证功能的,开发人员不需要编写代码,同时也能够最大限度重用同一个验证规则。因此,这种验证方式在目前的Struts应用中得到了广泛的应用。

在使用Validator验证框架时,需要用到两个基于XML的配置文件进行验证规则的配置,一个是validator-rules.xml,另一个是validation.xml。这两个文件应该部署在相应的Web应用中的WEB-INF文件夹下。此外,Validator还应在struts-config.xml中进行配置。

其中,validator-rules.xml文件包含了一组通用的验证规则,对所有Struts应用都可以使用,Struts软件包中本身提供了这个文件。一般不需要开发人员进行修改,直接将其部署在相应的WEB-INF文件夹中即可。

5.4.1  Validator的安装
Struts1.2发布版中包含了Validator框架用到的所有文件和包。Validator作为Jakarta的commons工程的一部分,可以从地址http://jakarta.apache.org/commons/下载其最新版本。

Validator框架依赖的两个最重要的包即jakarta-oro.jar和commons-validator.jar。

l         akarta-oro.jar:提供了一组处理正则表达式、文本的替换、过滤和分割等功能。

l         commons-validator.jar:提供了一个简单的、可扩展的验证框架,包含了一些通用的标准验证规则和验证方法。

使用Validator验证框架时,需要在配置文件validator-rules.xml和validation.xml中配置验证规则。这两个文件应该部署在相应的Web应用中的WEB-INF文件夹下。此外,Validator还应在struts-config.xml中进行配置。

5.4.2  在struts-config.xml中配置Validator
Validator框架是作为一个Struts插件配置到Struts应用程序中的,即Struts扩展中的PlugIn机制。通过在Struts配置文件struts-config.xml中配置Validator插件,Struts应用在启动时就能够知道Validator框架正在被使用,加载并初始化Validator框架。以下代码是一个典型的在struts-config.xml中配置Validator的方式:

<plug-in className="org.apache.struts.validator.ValidatorPlugin">

    <set-property property="pathnames"

    value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>

    <set-property property="stopOnFirstError" value="false"/>

</plug-in>

应用程序启动时,Struts框架将调用validatorPlugIn类的init()方法初始化Validator框架。Init()方法根据pathnames属性,加载相应的validator-rules.xml文件和validation.xml文件,把验证信息读入到内存中。

StopOnFirstError属性的作用是指定客户端JavaScript验证的执行方式。当该值为false时,JavaScript会在验证全部需要验证的表单字段后发出错误警告信息;否则在发现第一个验证错误时就返回。

5.4.3  validator-rules.xml的配置
validator-rules.xml配置文件包含了一组通用的有效性规则,这些通用性的验证规则可以满足大部分验证需求,而且该文件也是独立于应用程序的,可以被任何Struts应用程序使用。该文件内含于Struts的发行包中,在一般情况下,无须对该文件做任何改动。只有当打算扩展或修改默认的验证规则时才需修改这个文件。

Validator-rules.xml文件的根元素是<form-validation>,该元素包含零个或多个global元素。Global元素包含零个或多个validator元素。这些元素在dtd文件中的定义如下:

<!ELEMENT form-validation (global*, formset*)>

<!ELEMENT global (validator*, constant*)>

每个validator元素定义了一个唯一的有效性验证规则。以下代码是validator-rules.xml文件中一个名为integer的有效性验证规则。

<validator name="integer"

        classname="org.apache.struts.validator.FieldChecks"

        method="validateInteger"

        methodParams="java.lang.Object,

            org.apache.commons.validator.ValidatorAction,

            org.apache.commons.validator.Field,

            org.apache.struts.action.ActionErrors,

            org.apache.commons.validator.Validator,

            javax.servlet.http.HttpServletRequest"

        depends=""

        msg="errors.integer"

jsFunctionName="IntegerValidations"/>

validator元素有8个属性,它们的含义列于表5-2中。

表5-2  validator元素的属性

属    性
 描    述

name
 指定验证规则的逻辑名称,该名称在validator-rules.xml文件中必须是唯一的

classname
 指定实现验证规则的逻辑的类

method
 指定实现验证规则的逻辑的方法

methodParams
 在method属性中指定的方法的参数列表

msg
 指定资源包中的一个消息key。当出现一个有效性验证错误时,Validator框架将使用这个key到资源包中查找匹配的消息文本

depends
 指定在调用当前验证规则执行当前验证逻辑之前,应该先调用的其他验证规则

jsFunctionName
 指定生成JavaScript函数的名称,如果没有指定该属性,则JavaScript函数名称使用validator的名称

jsFunction
 指定一些传递到页面中的JavaScript用于执行表单验证


在默认情况下,Validator框架使用以下消息文本:

# Struts Validator Error Messages

errors.required={0} is required.

errors.minlength={0} can not be less than {1} characters.

errors.maxlength={0} can not be greater than {1} characters.

errors.invalid={0} is invalid.

errors.byte={0} must be a byte.

errors.short={0} must be a short.

errors.integer={0} must be an integer.

errors.long={0} must be a long.

errors.float={0} must be a float.

errors.double={0} must be a double.

errors.date={0} is not a date.

errors.range={0} is not in the range {1} through {2}.

errors.creditcard={0} is an invalid credit card number.

errors.email={0} is an invalid e-mail address.

应该把以上的内容添加到Struts资源文件中。如果打算使用自定义的消息文本替换这些默认的消息文本,可以修改validator-rules.xml文件中validator元素的msg属性,也可以直接修改以上的消息文本。

5.4.4  validation.xml的配置
validation.xml文件是Validator框架需要的另一个配置文件。该文件是特定于应用程序的,由开发人员自己来创建。它描述了那些具体应用中的ActionForm所使用的validator-rules.xml文件中的有效性验证规则。通过ActionForm在validation.xml文件中配置所需要的验证规则,开发人员就不必将验证逻辑硬编码放在ActionForm的内部。一个简单的validation.xml文件如例程5-7所示。

例程5-7  validation.xml实例

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!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="loginActionForm">

          <field property="username"

                    depends="required">

                <arg0 key="prompt.username"/>

          </field>

          <field property="password"

                    depends="required, minlength,maxlength">

                <arg0 key="prompt.password"/>

                <arg1 key="${var:minlength}" name="minlength"

                   resource="false"/>

                <arg2 key="${var:maxlength}" name="maxlength"

                   resource="false"/>

                <var>

                    <var-name>maxlength</var-name>

                    <var-value>16</var-value>

                </var>

                <var>

                    <var-name>minlength</var-name>

                    <var-value>3</var-value>

                </var>

            </field>

        </form>

    </formset>

</form-validation>

validation.xml文件中包含form-validation、global、formset、form、field、msg、arg、var等元素。下面对它们一一进行介绍。

1.form-validation元素
<form-validation>元素是validation.xml文件的根元素。它包含2个子元素,即<global>元素和<formset>元素,其在dtd中的定义如下:

<!ELEMENT form-validation (global*, formset*)>

2.global元素
global元素允许开发人员配置可以用在文件其他部分中的constant元素,也就是全局常量。这与在Java文件中定义一个常量,然后在类中使用该常量的方式相似。constant元素以名字和值的方式出现。例如:

<form-validation>

<global>

    <constant>

        <constant-name>zip</constant-name>

        <constant-value>^\d{5}\d*$</constant-value> <!--常量值,这里是一个正则表达式-->

    </constant>

<global>

<formset>

    <form name="registerForm">

        <field property ="zipPostal" depends="required, mask">

            <arg0 key="registerForm.zippostal.displayname"/>

            <var>

                <var-name>mask</var-name>

                <var-value>${zip}</var-value>

            </var>

       </field>

    </form>

  </formset>

<form-validation>

在以上代码中,在<global>元素中定义了一个常量zip,在<formset>元素中可以通过${constant-name}的形式,如${zip},来引用这个常量。

3.formset元素
<formset>元素包含两个子元素,即<constant>元素和<form>元素。<constant>元素可以出现零次或多次,<form>元素至少出现一次。这里的<constant>元素中定义的constant常量是局部常量,只能在当前<formset>元素内引用。

<formset>元素有2个属性,即language和country,它们用于国际化。

4.form元素
form元素定义了一套将要进行有效性验证的域(field),其name属性指定对应表单的名字,并且name属性与Struts配置文件中的form-bean元素的name属性一致。

form元素可以包含多个field元素。

5.field元素
一个field元素对应于一个表单中需要验证的字段。它的属性如表5-3所示。

表5-3  field元素的属性

属    性
 描    述

property
 将要进行有效性验证的ActionForm的属性名

depends
 指定字段的验证规则,多个规则之间以逗号分开

page
 如果对应的ActionForm是一个跨页表单,可能包括一个page属性与表单中的page属性相对应,用户指定该字段应该在哪一页被处理

indexedListProperty
 后循环列表,执行该域的有效性验证


field元素可以包含几个子元素:msg元素、arg元素及var元素。

6.msg元素
field元素的msg子元素指定验证规则对应的消息文本。该消息文本将替代默认的消息文本,即validator-rules.xml中定义的消息文本。msg元素的值必须是应用程序消息资源包中的某个消息资源的关键字。例如:

<field property="lastName" depends="required, mask" page="1">

    <msg name="mask" key="registerForm.lastname.maskmsg"/>

    <arg0 key="registerForm.lastname.displayname"/>

    <var>

        <var-name>mask</var-name>

        <var-value>^[a-zA-Z]*$</var-value>

    </var>

</field>

当lastName字段有效性验证失败时,显示的错误消息是消息资源中registerForm. lastname.masking键所指的消息文本。

msg元素的属性如表5-4所示。

表5-4  msg元素的属性

属    性
 描    述

key
 指定绑定的消息资源中的消息文本或直接指定消息文本

name
 指定验证规则的名字

bundle
 指定绑定的消息资源的名称

resource
 当该属性值为true时,表示使用来自消息资源的消息文本;当该属性值为false时,表示直接在key属性中设置消息文本。默认值为true。


7.arg元素
arg元素可以用来向消息文本中传递参数。它有name、key、resource和position等几个属性,name、key、resource属性的含义与msg元素的属性相当。position属性用来指定消息文本中的替换位置。

例如,例程5-8是关于minlength验证规则的配置文件。

例程5-8  minlength验证规则的配置文件

<field property="password"

    depends="required, minlength">

    <arg0 key="prompt.password" />

    <arg1 key="${var:minlength}" name="minlength"

    resource="false" position="1"/>

    <var>

        <var-name>minlength</var-name>

        <var-value>3</var-value>

    </var>

</field>

在validator-rules.xml文件中,minlength验证规则的默认消息文本是:

{0} can not be less than {1} characters.

在例程5-8中,position属性的值为1的arg元素定义中,name属性的值为minlength,表示仅适用于minlength验证规则,resource属性的值为false,表示可直接在key属性中设定消息文本,即key属性的值为${var:minlength},在这里是3。把以上代码中两个arg的key值分别放入minlength验证规则的默认消息文本中的相应位置,最后返回的消息文本应该是:

password can not be less than 3 characters.

8.var元素
var元素用来向验证规则传递参数。例如在例程5-7中,定义了maxlength和minlength两个参数,分别传递给maxlength和minlength验证规则。

arg元素也可以访问var元素,语法形式是${var:var-name}。例如,在例程5-7中的${var:maxlength}和${var:minlength}的使用。

5.4.5  DynaValidatorForm类及其子类
Validator框架不能用于验证标准的ActionForm类,使用Validator时应该使用与之匹配的ActionForm类:ValidatorForm类或DynaValidatorForm类,以及其子类ValidatorActionForm和DynaValidatorActionForm。它们都是ActionForm类的子类。它们之间的关系如图5-3所示。

 

图5-3  DynaValidatorForm类的类关系图

5.4.6  Validator的应用示例
以登录系统为例来示例如何应用Validator来实现自动表单输入验证功能。本节的示例程序是在第3讲的登录系统的程序基础上进行修改所得。本实例的代码在本书附带的光盘的code/ch5/validator目录中。

(1)修改登录页面login.jsp,如例程5-9所示。

例程5-9  修改后的登录页面login.jsp

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@page contentType="text/html; charset=gb2312" %>

<html:html>

<head><title>登录页面</title></head>

<body>

<font color="red"><html:errors/></font>

    <html:form action="loginAction" method="post">

        用户名: <html:text property="username" size="15"/><br><br>

        密&nbsp&nbsp码:   <html:password property="password" size="15"/><br><br>

        <html:submit value="登录" property="submit"/><br>

    </html:form>

</body>

</html:html>

(2)修改struts-config.xml文件,如例程5-10所示。

例程5-10  修改后的struts-config.xml文件

?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1

//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

    <form-beans>

        <form-bean name="loginActionForm"

            type="org.apache.struts.validator.DynaValidatorForm">

            <form-property name="username" type="java.lang.String"/>

            <form-property name="password" type="java.lang.String"/>

        </form-bean>

    </form-beans>

    <action-mappings>

        <action input="/login.jsp" name="loginActionForm"

            path="/loginAction" scope="request"

            type="login.LoginAction" validate="true" >

            <forward name="Success" path="/main.jsp"/>

            <forward name="Fail" path="/register.jsp"/>

        </action>

    </action-mappings>

    <message-resources parameter="ApplicationResources"/>

    <plug-in  className="org.apache.struts.validator.ValidatorPlugIn">

        <set-property

        property="pathnames"

        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>

        <set-property property="stopOnFirstError" value="false"/>

    </plug-in>

</struts-config>

(3)创建和部署验证规则及验证内容文件。

通常可以使用Struts原有的验证规则文件validator-rules.xml,将Struts二进制发布包的lib/目录下的该文件复制到当前应用程序的WEB-INF/目录下即可。具体要验证的表单数据内容和采用何种规则进行验证只能由开发者自己规定,具体做法是在应用程序的WEB-INF/目录下创建XML文件validation.xml。本项目的validation.xml如例程5-11所示。

例程5-11  validation.xml

<?xml version="1.0" encoding="iso-8859-1"?>

<!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="loginActionForm">

        <field

            property="username"

            depends="required,minlength">

            <arg0 key="label.username"/>

            <arg1 name="minlength" key="${var:minlength}"  resource="false" position="1"/>

          <var>

               <var-name>minlength</var-name>

               <var-value>3</var-value>

          </var>

         </field>

         <field

            property="password"

            depends="required,minlength">

            <arg0 key="label.password"/>

            <arg1 name="minlength" key="${var:minlength}"

            resource="false" position="1"/>

            <var>

                <var-name>minlength</var-name>

                <var-value>3</var-value>

            </var>

        </field>

        </form>

    </formset>

</form-validation>

(4)创建资源包属性文件ApplicationResources.properties,如例程5-12所示。

例程5-12  ApplicationResources.properties

# Simple properties file for test.

title.login = Login Page

item.submit = Submit

error.name.required=A UserName is Required

error.psw.required=A Password is Required

label.username=Username

label.password=Password

errors.required={0} can not be null

errors.minlength={0} can not less than {1} char.

errors.maxlength={0} can not be greater than {1} characters.

errors.invalid={0} is invalid.

(5)修改Action类——LoginAction.java,如例程5-13所示。

例程5-13  LoginAction.java

package login;

import org.apache.struts.action.*;

import org.apache.struts.validator.DynaValidatorForm;

import javax.servlet.http.*; java.util.*;

public class LoginAction extends Action {

    public ActionForward execute(ActionMapping actionMapping, ActionForm form,

          HttpServletRequest request, HttpServletResponse response)

        throws Exception {

        //从Form Bean中取出表单数据

        DynaValidatorForm loginActionForm = (DynaValidatorForm)form;

        String username = (String)loginActionForm.get("username");

        String password = (String)loginActionForm.get("password");

        //生成一个Session 对象

        HttpSession session = request.getSession(true);

        session.removeAttribute("username");

        session.setAttribute("username",username);

        //生成一个ArrayList对象,并把用户名和密码的值存入该对象中

        ArrayList arr = new ArrayList();

        arr.add(username);

        arr.add(password);

        String prompt;

        //调用模型组件loginHandler,检查该用户是否已注册

        LoginHandler login = new LoginHandler();

        boolean mark = login.checkLogin(arr);

        if(mark)  prompt = "Success";

            else  prompt = "Fail";

        return actionMapping.findForward(prompt);

    }

}



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号