[学习笔记]Validator框架配置

 

Validator框架配置

 

1. 标准ActionForm与动态ActionForm

标准ActionForm: org.apache.struts.action.ActionForm

动态ActionForm: org.apache.struts.action.DynaActionForm

以用户登录为例:

表单需要提交三个字段用户名(username),密码(password),验证码(code)


[学习笔记]Validator框架配置_第1张图片
 

 

 

标准ActionForm配置方法:

<form-beans>

  <form-bean name="loginForm" type="com.iteye.jarg.LoginForm" />

</form-beans>

 

 

com.iteye.jarg.LoginForm类内容:

 

public class LoginForm extends ActionForm

{

    private String username;

    private String password;

    private String code;

 

 

    public String getUsername()

    {

       return username;

    }

 

    public void setUsername(String username)

    {

       this.username = username;

    }

 

    public String getPassword()

    {

       return password;

    }

 

    public void setPassword(String password)

    {

       this.password = password;

    }

 

    public String getCode()

    {

       return code;

    }

 

    public void setCode(String code)

    {

       this.code = code;

    }

 

}

 

优点:

相对灵活

方便扩展对表单进行验证,可以对表单进行验证,灵活重置表单,可以处理跨页面表单

 

缺点:

1. 对于不同的表单,对应地需要添加一个ActionForm,导致ActionForm过多

2. 当页面表单字段名或者个数需要修改时,需要修改代码(这是一种硬编码方式)

 

 

动态ActionForm配置方法:

<form-beans>

  <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">

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

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

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

  </form-bean>

</form-beans>

 

优点:

a) 动态Actionform减少了繁多的ActionForm

b) 当页面表单字段名或者个数需要修改时,只需要修改配置文件,无须进行硬编码

 

缺点:

不够灵活

无法对表单进行验证,无法灵活对表单进行重置,无法处理跨页面表单

 

 

 

2. Validator框架引入

对于上述动态ActionForm验证问题,现在可以使用Validator框架.

同样,对于标准ActionForm验证,可以避免硬编码,validator()验证部分从ActionForm移到配置文件中.

 

需要验证框架的理由:

如果在ActionForm类中提供验证逻辑(validation logic)。采用这种做法时,你必须为每个你想验证的性质编写单独的验证逻辑。如果检测到某个错误,你得自行创建一个ActionError对象,将其加进ActionErrors集合中。虽然这种做法行得通,但存在着一些问题。

 

第一个问题是你得在每个ActionForm类中编写验证逻辑,这会让整个应用程序到处都是冗余的验证逻辑。对单一的Web 应用程序而言,各种 HTML表单所需要做的验证都非常类似。举例来说,应用程序中有许多地方常常都要验证必要的字段是否有值,以及要验证日期、时间以及数字,等等。大多数有用(nontrivial)的应用程序都会拥有多份HTML 表单,让用户输入必须经过验证的数据。即使整个应用程序只用到一个ActionForm对象,你还是得针对不同的性质分别创建重复的验证逻辑。

 

第二个主要的问题是维护困难。如果你要修改或改进ActionForm里的验证逻辑,必须重新编译源代码。如此一来,应用程序的配置会很麻烦。

 

有了Validator框架,你就可以把验证逻辑从ActionForm全面撤出,并且通过外部的XML文件以声明的方式来为应用程序配置所需的验证逻辑。 没有什么验证逻辑是非得放在ActionForm里不可的,因此应用程序的开发和维护就会变得较为容易。Validator的另一个突出优点是它具有很高的扩展性;它本身就提供有很多验证规则,即使你需要其他的验证规则,也能很容易地扩展此框架,从而把你自己所写的规则加进来(而不用去修改你的应用程序)。

 


[学习笔记]Validator框架配置_第2张图片
 <!--[endif]-->

优点:

a) 避免硬编码,验证内容放在配置文件

b) 内置一些验证方法,方便验证,代码可复用,移植性好

c) 验证规则易扩展

 

 

3. ValidatorStruts集成

Validator框架以Struts插件的形式与Struts集成.

在配置文件struts-config.xml中配置插件Validator框架,其中value/WEB-INF/validator-rules.xml/WEB-INF/validation.xml分别表示默认的验证规则定义,以及针对当前Struts应用的使用,关联表单验证规则.

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

    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

</plug-in>

 

 

 

4. Validator框架验证

Validator框架不能用于验证标准的org.apache.struts.action.ActionForm.如果要使用Validator框架,应该采用ActionForm类的两个子类:org.apache.struts.validator.ValidatorForm,org.apache.struts.validator.DynaValidatorForm.

DynaValidatorForm支持在动态ActionForm中使用Validator框架,ValidatorForm支持在标准ActionForm中使用Validator框架.无论是对于动态ActionForm还是标准ActionForm,配置Validator框架的方式都是一样的.

DynaValidatorFormValidatorForm类都实现了validate()方法,所以当创建它们的子类时,不必覆盖validate()方法.

 

 

ValidatorForm有一个子类ValidatorActionForm.这二个类的区别:


[学习笔记]Validator框架配置_第3张图片

 

<form-bean>使用org.apache.struts.validator.ValidatorForm,validation.xml<form>标签name属性struts-config.xml<action>标签name属性相应.

 

使用ValidatorForm类配置

<form-beans>

  <form-bean name="loginForm" type="org.apache.struts.validator.ValidatorForm" />

</form-beans>

 

<action-mappings>

  <action input="/index.jsp" path="/user" name="loginForm" validate="true" type="com.iteye.jarg.action.UserAction" scope="request">

    <forward name="success" path="/WEB-INF/jsp/success.jsp"></forward>

    <forward name="failure" path="/WEB-INF/jsp/failure.jsp"></forward>

  </action>

</action-mappings>

 

 

表单验证配置文件validation.xml

<form name="loginForm">

  <field property="username" depends="required,minlength">

    <arg0 key="login.username" />

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

    <var>

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

      <var-value>6</var-value>

    </var>

  </field>

</form>

 

 

<form-bean>使用org.apache.struts.validator.ValidatorActionForm,validation.xml<form>标签name属性struts-config.xml<action>标签path属性相应.

 

使用ValidatorActionForm类配置

<form-beans>

  <form-bean name="loginForm" type="org.apache.struts.validator.ValidatorActionForm" />

</form-beans>

 

<action-mappings>

  <action input="/index.jsp" path="/user" name="loginForm" validate="true" type="com.iteye.jarg.action.UserAction" scope="request">

    <forward name="success" path="/WEB-INF/jsp/success.jsp"></forward>

    <forward name="failure" path="/WEB-INF/jsp/failure.jsp"></forward>

  </action>

</action-mappings>

 

 

表单验证配置文件validation.xml

<form name="/user">

  <field property="username" depends="required,minlength">

    <arg0 key="login.username" />

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

    <var>

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

      <var-value>6</var-value>

    </var>

  </field>

</form>

 

Validator框架提供这两种类的目的在于可以更加精确地控制执行验证的条件.

因为有些ActionForm Bean可能会对应多个Action,这种情况则可以通过path作为<form>标签name属性来区分.

 

对于动态ActionForm,也有DynaValidatorFormDynaValidatorActionForm之分,它们的区别与ValidatorFormValidatorActionForm的区别一样.

 

 

 

5. validator-rules.xmlvalidition.xml

Struts框架能够在ActionForm Beanvalidate()方法中对用户输入的表单数据进行验证。这种验证有两个局限:

必须通过程序代码来实现验证逻辑。如果验证逻辑发生变化,必须重新编写和编译程序代码。

 

当系统中有多个ActionForm Bean,并且他们包含一些相同的验证逻辑时,开发人员必须对每个ActionForm Bean进行重复编程,完成相同的验证逻辑。这会降低代码的可重用性。

 

如今,Validator框架在struts应用中得到广泛的运用,Apache组织已经把它添加到Jarkarta工程中,在struts软件中系带了Validator框架。Validator框架主要依赖两个jar文件:

jakarta-oro.jar,提供一组处理文本的类,具有文本替换,过滤和分割等功能。

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

也可以从http://jakarta.apache.org/commons/下载单独的Validator框架软件。

 

1 validator-rules.xml文件

validator-rules.xml包含了一组通用的验证规则,对所有的struts应用都适用。struts软件中自带了这个文件。一般情况下没有必须要修改该文件,除非需要修改或扩展默认的规则。如果想扩展默认的验证规则,最好把自定义的客户规则放在另一个xml文件中,而不是直接添加到validator-rules.xml中。

 

validator-rules_1_1.dtd定义了validator-rules.xml文件的语法:validator-rules.xml文件的根元素为<form-validation>,它可以包含一个或多个<global>元素,<global>元素可以包含一个或多个<validator>元素。

每个<validator>元素定义一个唯一的验证规则。例:

<validator name="required"

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

           method="validateRequired"

           methodParams="java.lang.Object,

                         org.apache.commons.validator.ValidatorAction,

                         org.apache.commons.validator.Field,

                         org.apache.struts.action.ActionMessage,

                         javax.servlet.http.HttpServletRequest"

           msg="errors.required">

</validator>

<validator>元素有7个属性,它们在DTD的顺序为:

name,classname,method,methodParams,msg,depends,jsFunctionName

 

name,指定验证规则的逻辑名,这个名字必须是唯一的。

 

classnamemethod属性,分别指定实现验证规则逻辑的类和方法。对于以上required验证规则,由FieldChecks类的validateRequired()方法来实现。

 

methodParams属性用来指定验证的方法包含的参数,多个参数之间以逗号隔开。

 

msg,指定来自于Resource Bundle中的消息key。当验证失败时,validator框架将根据这个消息keyResource Bundle中查找匹配的消息文本。

 

depends,指定在调用当前验证规则之前必须先调用的其他验证规则。如:以下minLength验证规则的配置代码中就使用了depends属性 ,表明在调用minLength验证规则之前,应该先调用required规则。

<validator name="minLength"

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

           method="validateMinLength"

           methodParams="java.lang.Object,

                         org.apache.commons.validator.ValidatorAction,

                         org.apache.commons.validator.Field,

                         org.apache.struts.action.ActionMessage,

                         javax.servlet.http.HttpServletRequest"

           depends="required"

           msg="errors.minlength">

</validator>

如果depends属性包含多个验证规则,则用逗号隔开。如:

depends="required,integer"

如果depends属性指定的验证规则时验证失败,就不会在调用下一个规则。

 

2 Validator的验证规则

Validator框架提供了基本的,通用的验证规则,对struts应用以及非struts应用都适用。org.apache.commons.validator.GenericValidator类提供了一组实现这些规则的静态方法:

isBlankOrNull,验证字段是否为null或长度是否为0

isByte,验证字段是否可以被转换为有效的byte类型的数据

isCreditCard,验证字段是否为有效的信用卡号

isDate,验证是否为有效的日期

isDouble,验证字段是否可以被转换为有效的double类型的数据

isEmail,验证字段是否为有效的Email地址

isFloat,验证字段是否可以被转换为有效的float类型的数据

isInRange,验证字段是否介于最小值或最大值之间。

isInt,验证字段是否可以被转换为有效的int类型的数据

isLong,验证字段是否可以被转换为有效的long类型的数据

isShort,验证字段是否可以被转换为有效的short类型的数据

maxLength,验证字段是否小于或等于最大值

minLength,验证字段是否大于或等于最小值。

mathRegexp,验证字段是否和一个给定的Jakarta正规表达式匹配。与validateMask一个意思。

 

Jakarta正规表达式,如:

^[a-zA-Z]*$表示字符串必须只包含字母

^\d{5}\d*$表示字符串必须是五位数字

 

struts框架中定义了专门用于验证表单字段的org.apache.struts.validator.FieldChecks类,它提供了和GenericVaidator类似的方法,以下是FieldChecks类包含的验证方法:

validateByte

validateCreditCard

validateDate

validateDouble

validateEmail

validateFloat

validateInteger

validateLong

validateMinLength

validateMaxLength

validateRange

validateRequired

validateShort

validateMask

在对表单字段进行验证时,会调用FieldChecks类的相关方法,如果验证失败,就会创建包含错误消息的ActionMessage对象,并把该对象添加到ActionMessage集合对象中。

 

3 validation.xml文件

Validate框架的第二个配置文件为validation.xml。这个文件是针对某个具体struts应用的,需要开发人员来创建,它可以应用中的ActionForm配置所需的验证规则,取代ActionForm中以编程的方式来实现验证逻辑。

 

<form-validation>元素

validator_1_3_0.dtd描述了validation.xml文件的语法。validation.xml文件的根元素为<form-validation>元素,它包含两个子元素:<global><formset><global>元素可以出现零次或多次,<formset>元素可以出现一次或多次。它们的DTD定义顺序:global,formset

 

<global>元素

<global>元素中可以定义<constant>子元素,它用来定义常量表达式,在文件的其余地方可以引用这些常量表达式。如:

<global>

<constant>

          <constant-name>phone</constant-name>

          <constant-value>^\d{8}\d*$</constant-value>

</constant>

</global>

以上代码定义了常量phone,<formset>元素中可以通过${constant-name}的形式来引用它们。(${phone})

 

<formset>元素

<formset>元素包含两个子元素:<constant><form><constant>可以出现零次或多次;<form>元素可以出现一次或多次。

<global>中定义的<constant>元素代表全局常量,而在<formset>元素中定义的<constant>元素代表局部常量,后者只能在当前<formset>元素中使用。

 

<form>元素

<formset>元素的<form>子元素用于为表单配置验证规则。它的name属性指定了表单的名字(它的取值将与配置文件中的action中的name属性或attribute属性取值一样)<form>元素可以包含一个或多个<field>子元素。

*****************************

在一般情况下,actionForm是被存储在一定的scope(requestsession,通过actionscope属性来配置),当我们在配置时,指定name而不指定attribute,那么指定的name值就作为actionForm存储在scope中的key值,我们可以在action中通过httpServletRequest.getAttribute("指定的name属性值")来获得这个actionForm;当我们既配置了name又配置了attribute,那么actionForm存储在scope中的key值就采用attribute属性指定的值了,这时要通过httpServletRequest.getAttribute("指定的attribute属性值")来获得actionForm,此时通过httpServletRequest.getAttribute("指定的name属性值")是不能获得actionForm的。 

 

所以,是否配置attribute属性就决定了actionForm存储在scope中的key值是采用name,还是采用attribute。当我们配置了attribute属性那么我们就要让<form>name取值为attritute属性的值否则取name属性的值会提示类似以下的错误:

form 'user' is not found in 'zh_CN'

***************************

 

<field>元素

<form>元素的<field>子元素用于配置表单中字段的验证规则。<field>元素的属性:

property,指定ActionForm Bean中需要进行验证的字段的名字。

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

 

<field>元素包含一些子元素,它的DTD定义如下:

<!element field(msg?,arg?,var*)>

<msg>元素指定验证规则所对应的消息文本,该消息文本将替换validator-rules.xml文件中配置的默认消息文本。例如:

<field property="phone" depends="required,mask,minlength">

<msg name="mask" key="phone.Invalidformat"/>

...

</field>

<msg>元素的属性:

name,指定验证规则(minlength,mask,maxlength)的名字

key,当resource属性为true时,key属性指定消息key,该消息key应该在Resource Bundle中存在。

resource,当此项为true时,表示使用来自Resource Bundle的消息,如果为false,表示直接在key属性中设置消息文本。默认为true

 

<arg>元素,用于替换复合消息中的参数,<arg>position属性指定了它的替换位置(0开始)。每个arg元素包含三个属性:namekeyresource。这些属性的用法和<msg>元素很相似。如果没有指定name则将应用于depends所指定的所有验证规则。strut1.3以前的版本使用arg0,arg1,arg2...元素来指定符合消息中的参数,而没有position属性。

例如:

<field property="age" depends="intRange">

<arg key="test.age" position="0" resource="true"/>

<arg key="${var:min}" name="intRange" position="1" resource="false"/>

<arg key="${var:max}" name="intRange" position="2" resource="false"/>

<var>

<var-name>min</var-name>

<var-value>1</var-value>

</var>

<var>

<var-name>max</var-name>

<var-value>100</var-value>

</var>

</field>

 

            <field

                property="logName"

                depends="required,minlength,maxlength">

                    <arg key="Form.logname" position="0"/>

                    <arg name="minlength" key="6" position="1" resource="false"/>

                    <arg name="maxlength" key="10" position="1" resource="false"/>

                    <var>

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

                        <var-value>6</var-value>

                    </var>

                    <var>

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

                        <var-value>10</var-value>

                    </var>

            </field>

 

要知道一个xml文件怎样写,查看dtd就可以了,在xml文件的开始都会有引用

http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd

上面没有配置<msg>元素,如果minlengt6h验证规则失败,将用validator-rules.xml中的配置默认消息文本(errors.minlength匹配的消息)errors.minlength因为为:

errors.minlength={0}不能少于{1}字符。

{0},{1}分别与<arg positon="0"><arg position="1">相对应。

 

<var>元素

<field>元素还可以包含零个或多个<var>元素,<var>元素用来验证规则传递参数。

phone常量被传递给mask验证规则:

<var>

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

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

</var>

phone常量的值为^\d{8}\d*$它定义一种字符模式,表示字符长度为8位,并只有数字。

 

arg元素可以引用<var>元素的值${var:varname}。如:${var:minlength}

 

例如,一个简单validation.xml文件样例

<form-validation>

<!--定义一个全局的常量-->

<global>

<constant>

<constant-name>phone</constant-name>

<constant-value>^\d{8}\d*$</constant-value>

</constant>

</global>

<formset>

<!--要进行验证的表单的名字-->

<form name="checkoutForm">

<!--要对表单中的名称为phone的字段进行required,mask,minlength三项验证-->

<field property="phone" depends="required,mask,minlength">

<!--定义向复合消息要传递的两个参数arg0arg1-->

<arg key="label.phone" position="0"/>

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

<!--定义要向验证规则传递的参数-->

<var>

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

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

</var>

<var>

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

<var-value>7</var-value>

</var>

</field>

</form>

</formset>

</form-validation>

 

Validator插件

为了在struts框架中使用Validator,可以采用插件机制把Validator加入到框架中,这需要在

struts-config.xml中配置ValidatorPlugIN插件,代码如下:

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

<set-property property="pathnames"

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

</plug-in>

当应用启动时,struts框架会加载ValidatorPlugin插件并调用它的init()方法,init()方法根据pathnames属性,加载相应的validator-rules.xmlvalidation.xml文件,把验证信息读入到内存中。

 

***************

/org/apache/struts/validator/validator-rules.xml表明validator-rules.xml已经被包含在struts软件中,我们只需要制作validation.xml

用户在提交后进行表单的验证(validator),如果验证失败是不会执行任何语句的,而是直接跳转到input所指定的文件。

****************

4 Validator框架和ActionForm

Validator不能用于验证标准的org.apache.struts.action.ActionForm类,如果要使用Validator框架,应该采用ActionForm类的两个子类:org.apache.struts.validator.DynaValidatorFormorg.apache.struts.validator.ValidatorForm.

 

DynaValidatorForm支持在动态ActionForm中使用Validator框架,ValidatorForm支持在标准ActionForm中使用Validator框架。无论对于动态的ActionForm还是标准ActionForm,配置Validator框架的方式都是一样的。

 

DynaValidatorFormValidatorForm类都实现了validate()方法,所以当创建它们的子类时,不必在覆盖validate()方法。如果验证失败,就会创建包含错误消息的ActionMessage对象,并把该对象添加到ActionErrors集合对象中。validate()方法最后返回ActionErrors集合对象。(注意在返回的ActionErrors集合对象中,用ValidatorForm的属性名作为ActionMessage对象的key).如:只输出某个属性的错误

<html:errors property="age"/>

注意,在使用Validator框架时,<htmlerrors/>标签的property属性的值就是ActionForm(或其子类)属性名,并将与之对应。

 

ValidatorForm有一个子类ValidatorActionForm。这两种类的区别:

ValidatorForm

Struts配置文件的<action>元素的name属性与validation.xml<form>元素的name属性对应

ValidatorActionForm

Struts配置文件的<action>元素的path属性与validation.xml<form>元素的name属性对应

 

对于动态的ActionForm,也有DynaValidatorFormDynaValidatorActionForm之分,与上面的区别一样。

 

DynaVlidatorFormValidatorForm类的流程与标准的ActionForm一样,RequestProcessor调用它们的validate()方法进行表单验证。如果验证失败,***注意RequestProcessor就把validate()方法返回的ActionErrors()对象保存在request范围内。***struts的一些客户化的标签能够和Validator框架协同工作,其中<html:errors/><html:message>标签都能够访问request范围内的ActionMessages或其子类ActionErrors对象,用于显示Validator框架生成的验证错误消息。

 

***********************************************************************************

综上所述,我们首先需要续写一个ValidatorFormDynaValidatorFormValidatorActionFormDynaValidatorActionForm的子类(我使用ValidatorForm),其内容和编写ActionForm子类差不多。

 

然后就需要编写好validation.xml,再在struts-config.xml加上Validator插件

 

最后输出显示ActionErrors集合中的错误信息

 

Validator框框架使用的默认消息文本也应该添加到应用的Resource Bundle中。如:

errors.required={0}是必须的。

errors.minlength={0}不能少于{1}字符。

errors.maxlength={0}不能多于{1}字符。

errors.invalid={0}无效

errors.byte={0}必须为byte类型

errors.short={0}必须为short类型

errors.integer={0}必须为integer类型

errors.long={0}必须为long类型

errors.float={0}必须为float类型

errors.double={0}必须为double类型

errors.date={0}不是有效的日期类型

errors.range={0}不再范围{1}{2}之间

errors.creditcard={0}不是有效的信用卡号

errors.email={0}不是有效的Email地址

 

******************************************************************************************

列出了Validator框架预定义的验证:

Validator     变量

required

validwhen     test   验证test条件是否成立,如果不成立则会添加到ActionErrors

minlength     minlength

maxlength     maxlength

mask          mask

 

byte,short

integer,long  验证字段是否可以被转换为相应的类型数据

float,double

 

date          datePatterndatePatternStrict  验证字段是否可以按指定的格式被转换为日期类型数据

validator将使用java.text.SimpleDatFormat来转换日期。例如:

<field property="saledate" depends="required,date">

        <arg key="myForm.saledate" position="0"/>

        <var><var-name>datePattern</var-name>

        <var-value>MM/dd/yyyy</var-value></var>

</field>

   

<field property="saledate" depends="required,date">

        <arg key="sale.orderdate" position="0"/>

        <var><var-name>datePatternStrict</var-name>

        <var-value>MM/dd/yyyy</var-value></var>

</field>

datePatterndatePatternStrict区别在于datePatternStrict要求长度相同,如1/1/2004datePatternStrictMM/dd/yyyy中验证将会失败,但datePattern可以通过。

 

intRange       min,max

floatRange     min,max

doubleRange    min,max

 

creditCard     验证字段是否是一个信用卡号

 

email

 

url            allowallschemes,allow2slashed,nofragments,schemes  验证字段是否是一个URL

allowallschemes定义是否所有的协议都允许。取值为truefalse默认为false

allow2slashes定义是否要求//字符取值为truefalse默认为false.

nofragments定义是否可以分段取值为truefalse默认为false可以分

shemes用逗号分隔要用到的协议。默认取值为http,https,ftp

 

return mapping.getInputForward();

 

例如使用validawhen的例子

<field property="password" 

                depends="required,minlength,maxlength">  

                <arg key="lable.password" position="0" />  

                <var>  

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

                    <var-value>5</var-value>  

                </var>  

                <var>  

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

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

                </var>  

            </field>  

            <field property="repeatedPassword" depends="validwhen">  

                <arg key="password.notequals.repeated" positon="0" />  

                <var>  

                    <var-name>test</var-name>  

                    <var-value>(password==repeatedPassword)</var-value>  

                </var>  

            </field>

其实可以用*this*替代repeatedPassword: 

<var-value>(password==*this*)</var-value> 

 

 

http://java.chinaitlab.com/Struts/776627_2.html

http://java.chinaitlab.com/Struts/776213_2.html

http://java.chinaitlab.com/Struts/776220.html

http://www.jarbao.com/jar/jakarta-oro-2.0.8.jar.html/[email protected]/123456

http://www.jar114.com

 

 

 

6. 显示验证消息

<html:messages>

<html:errors property="待验证的字段name">

e.g.若对username进行字符长度不小于6的验证时,验证失败后的错误消息则显示在<html:errors property="username" />.

<input type="text" name="username" value="admin" />

<html:errors property="username" />

 

为了达到消息弹出目的,可以设置资源包中消息键errors.required值为:

<script type="text/javascript">alert("{0} 不能为空")</script>

 

 

值得注意的是:

1. 如果使用自定义的资源包,则需要在资源包中加入如下键;否则,会报找不到消息资源错误.

<!--

   These are the default error messages associated with

   each validator defined in this file.  They should be

   added to your projects ApplicationResources.properties

   file or you can associate new ones by modifying the

   pluggable validators msg attributes in this file.

 

   # 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.

-->

 

2. 未加入到资源包中的错误消息,也可能通过<msg name="required" key="my.errors.required" />标签在validation.xml<field>标签下设置,其中,name对应于validator.xml中定义的规则名.

 

你可能感兴趣的:(Validator)