您的位置:首页 > 编程语言 > Java开发

struts validate校验框架

2009-06-24 13:54 435 查看
利用继承了ActionForm的普通formBean的validate方法来验证表单数据,当在validate方法返回非空的
ActionErrors对象时,ActionServlet会根据配置文件中的input属性来进行请求转发,并不会执行action的execute
方法。

----------------------------------------------------------------------------------------------------

使用validate校验框架则需要formBean继承ValidatorForm,且不可重写validate方法。或者使用动态FormBean,配置在文件中

<form-bean name="newPasswordForm"

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

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

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

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

</form-bean>

使用validate框架需要在struts-config.xml中添加<plug-in>节点

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

<set-property property="pathnames"

value="/validator-rules.xml,/myapp.validator.xml,/demo.validator.xml,/systool.validator.xml" />

</plug-in>

其中 validator-rules.xml是定义校验规则的配置文件,不需要修改。

其他的则需要手动编写。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE form-validation PUBLIC

"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"

"http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">

<form-validation>

<global>

<constant>

<constant-name>datePattern</constant-name>

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

</constant>

<constant>

<constant-name>userName</constant-name>

<constant-value>^[a-zA-Z]{1}[a-zA-Z0-9_]*$</constant-value>

</constant>

</global>

<formset>

<form name="commonLogQueryForm">

------------------------------------------------

<!--name指定所需校验的formBean-->

---------------------------------------------------

<field property="content" depends="maxlength">

<arg position="0" key="commonLog.content" resource="true" />

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

<var>

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

<var-value>200</var-value>

</var>

</field>

<field property="operatStartTime" depends="date">

<arg position="0" key="commonLog.operatStartTime" resource="true" />

<var>

<var-name>date</var-name>

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

</var>

</field>

<field property="operatEndTime" depends="date,validwhen">

<arg position="0" key="commonLog.operatEndTime" resource="true" />

<var>

<var-name>date</var-name>

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

</var>

<msg name="validwhen" key="error.operatEndTime" />

<var>

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

<var-value>(((operatStartTime==null) and

(operatEndTime==null)) or (((operatStartTime!=null) and

(operatEndTime!=null))and(*this* >= operatStartTime)) )</var-value>

</var>

</field>

</form>

</formset>

</form-validation>

---------------------------------------------------------

<!--

<field>节点对应formBean中需校验的属性,property指定属性,depends指定校验规则。

如maxlength指最大长度,在validator-rules.xml中的定义如下:

<validator name="maxlength"

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

method="validateMaxLength"

methodParams="java.lang.Object,

org.apache.commons.validator.ValidatorAction,

org.apache.commons.validator.Field,

org.apache.struts.action.ActionMessages,

org.apache.commons.validator.Validator,

javax.servlet.http.HttpServletRequest"

depends="" msg="errors.maxlength"

jsFunction="org.apache.commons.validator.javascript.validateMaxLength" />

如果违反该规则,就会加载errors.maxlength
在资源文件application.properties中所代表的错误信息

errors.maxlength={0}
不能超过{1}
个字符.

若想要自定义错误的信息格式,可以使用<msg>节点。

<msg name="validwhen" key="error.operatEndTime" />
,msg节点用来指定

当违反name所指定的规则时,按照key所制定的资源文件来加载错误信息。

若不指定<msg>节点,则按照validator-rules.xml中的msg所指定的key来加载错误信息。

在上述的错误信息中可以使用占位符{0},{1},{2},{3},{4}来加载信息,并在配置文件中使用<arg>节点来为占位符指定加载的信息。

<arg position="0" key="commonLog.content" resource="true" />

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

<var>

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

<var-value>200</var-value>

</var>


中position指定占位符。name用来指定所属的校验规则,适用于当有多个校验规则时。key用来指定在资源文件中的错误信息。resource指
定错误信息是否来源于资源文件,为true时,会到资源文件中根据key来加载错误信息,为false时,会在文件本身寻找相配的信
息,key="${var:maxlength}",即加载变量maxlength所代表的信息,即200.

当校验规则需要外界提供一些参数的时候,就会用到<arg>节点。如maxlength规则会要求外界指定最大值。

date规则会要求指定日期格式,validwhen
规则会要求指定条件等

例如:date规则

<field property="operatStartTime" depends="date">

<arg position="0" key="commonLog.operatStartTime" resource="true" />

<var>

<var-name>date</var-name>

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

</var>

</field>

其变量名称为date,值为global节点中定义的datePattern,即yyyy-MM-dd。

也可指定变量名为 datePatternStrict 值同样为${datePattern}

对于validwhen较为复杂,下面是一篇转载:

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ValidWhen主要用于关联验证,即为了验证某个域的值,可能会参考其它域的值来进行综合判断,以确定该域的值是否符合要求。 1,表达式及其注意事项

输入给validwhen的是一个布尔型表达式(对该表达式的解析使用了antlr),其引用名为test,即形如:

<var>

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

<var-value>expression</var-name>

</var>

即,当expression为真(true)时,该域验证通过,其中,expression可以使用的元素包括:

1)表单中其它域属性的名称,例如:

<var>

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

<var-value>(color=="red")</var-name>

</var>

例子中color为表单中其它某个域的属性名。

2)*this*,用于表示该域的属性名称,即对正在验证的属性自身,其变量的引用为*this*,例如:

<var>

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

<var-value>((color=="red") and (*this* != null))</var-name>

</var>

3)可以使用一些常规运算符,如 >、<、==、>=、<=、!=、+、-、*、/、%等等。例如:

<var>

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

<var-value>((color=="red") and (age>=25))</var-name>

</var>

4)可以使用逻辑运算 and 、or,例如:

<var>

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

<var-value>(((color=="red") and (age>=25)) or (color!="red"))</var-name>

</var>

在使用and和or时要注意一点,在同一级的逻辑运算中,同时只能存在一个逻辑运算符,要么是and,要么是or,即:

xxx and yyy

或者

xxx or yyy

如果在同一级出现多于一个的and或or或and和or的组合,那么是不合法的,例如下面的表达式是不合法的:

xxx and yyy and zzz

或者

xxx or yyy or zzz

或者

xxx and yyy or zzz

等等

为了让复杂的表达变得合法,可以让一个复杂的表达式变为多级的表达形式,每一级只有一个and或一个or就可以了,例如:

xxx and yyy and zzz是错误的,进行一下简单的变换:

(xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。

5)其他合法的输入,例如可以使用双引号和单引号引用literal字符串等等。

2,错误消息的定制

无论是validwhen还是其它验证例程,都可以定制验证出错后的错误信息,定制消息有两种方式,即全局方式和本地方式。

1)全局方式,即在validator-rules.xml中某个validator里面定义的消息,参数名为msg,例如:

<validator name=
"email"

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

method=
"validateEmail"

methodParams=
"java.lang.Object,

org.apache.commons.validator.ValidatorAction,

org.apache.commons.validator.Field,

org.apache.struts.action.ActionMessages,

org.apache.commons.validator.Validator,

javax.servlet.http.HttpServletRequest"

depends=
""

msg=
"errors.email"
/>

其中,msg的值为resource bundle中的一个属性名

。例如在resource bundle文件中存在如下定义:

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

2)本地方式,即在validation.xml中的field中定义的错误消息,格式为:

<msg key="value" resource="booleanValue"/>

例如:

<field property=
"endDate"

depends=
"validwhen,date"
>

<msg name=
"validwhen"
key=
"date.validwhen"
/>

<arg0 key=
"start time"
resource=
"false"
/>

<arg1 key=
"end time"
resource=
"false"
/>

<var>

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

<var-value>
((
*
this

* !=
null

)
and
(
*
this

*>startDate
))
</var-value>

</var>

</field>

这里需要注意的是

* <msg>的name属性的值应该为某个验证例程的名称,例如name="validwhen
"、name="date
"等,这指明了当该field的该验证例程(本例是validwhen
、date
)出错时所显示的错误信息。

*如果全局已经定义了msg的信息,而且本地的msg的key与全局的msg的key相同,那么在该field的验证中,本地的msg将覆盖全局的msg。

*<arg0>
到<arg4>的属性中也有name属性,即该arg参数所应用的验证例程,例如<arg0
key="label.startDate"/>,即该参数用于date验证的出错信息。注意,对于一个field,需要的验证规则有时不止一个,
例如depends="required,date",而多个验证规则中的每一个都需要出错时传入一些参数信息,如果它们所需要的参数个数、名称和顺序都
相同,那么只要定义<arg0...、<arg1...等等即可。但是如果它们需要的参数的个数、名称和顺序不同怎么办,如果我们对于第一个
输入参数只定义一个arg0,那么这个arg0用于哪个验证消息,因此这时必须通过arg标签的name属性来表示该参数所服务的验证。

3,例子

场景:在一个表单中,有两个文本域,用于得到一个时间段,一个文本域输入起始日期(startDate),另一个输入终止日期(endDate)。

约束:日期格式为:年(四位数)-月(两位数)-日(两位数),而且终止日期大于起始日期。

根据上述条件,验证规则如下:

<field property="startDate"

depends="date">

<arg0 key="form.date.start"/>

<var>

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

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

</var>

</field>

<field property="endDate"

depends="validwhen,date">

<msg name="validwhen" key="date.validwhen"/>

<arg0 name="validwhen" key="form.date.start"/>

<arg1 name="validwhen" key="form.date.end"/>

<arg0 name="date" key="form.date.end"/>

<var>

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

<var-value>
((
*
this

* !=
null

)
and
(
*
this

*>startDate
))
</var-value>

</var>

<var>

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

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

</var>

</field>

在资源文件中加入如下message:

form.date.start=起始日期

form.date.end=终止日期

date.validwhen= {0}不能大于{1}!

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

-->

---------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: