spring的validate验证需要两个bean(
ValidatorFactory
、
BeanValidator)及两xml文件(
validator-rules.xml
、
validation.xml)的支持,
ValidatorFactory用于制造
BeanValidator,后者则是在程序中执行校验的控制bean。
Validatorrules.xml中定义了各种验证的规则,如字段不为空,字段输入
值必须为整数等等。
Validation.xml中则定义了那些bean及bean中的哪些属性字段需要验证,使用哪些验证规则。validate 分为两级验证,客户端验证(
javascript)和服务器端验证。以下是使用validate的步骤:
1. 在配置文件中声明
ValidatorFactory 和
BeanValidator:
<
bean
id
=
"validatorFactory"
class
=
"org.springmodules.commons.validator.DefaultValidatorFactory"
>
-----
①
<
property
name
=
"validationConfigLocations"
>
-----
②
<
list
>
<
value
>
/WEB-INF/validator-rules.xml
</
value
>
<
value
>
/WEB-INF/validation.xml
</
value
>
</
list
>
</
property
>
</
bean
>
<
bean
id
=
"beanValidator"
class
=
"org.springmodules.commons.validator.DefaultBeanValidator"
>
-------
③
<
property
name
=
"validatorFactory"
>
<
ref
bean
=
"validatorFactory"
/>
--------
④
</
property
>
</
bean
>
① 声明
validatoFactory 这里我们使用spring 的
DefaultValidatorFactory
② 定义其
validationConfigLocations属性,将
validator-rules.xml和
validation.xml传入
③ 声明
beanValidator 这里我们使用spring的
DefaultBeanValidator
④ 在其属性中指明要使用的
validatorFactory 。这里我们使用刚刚定义的
validatorFactory
2. 在需要进行验证的controller(即要使用form表单或者command的controller)中声明validate。
<bean
id="
xxxxController" ……
>
<property
name="
commandName"
value="
userCommand"
/>
-----
①
<property
name="
commandClass"
value="
com.resoft.User"
/>
-----
②
<property
name="
validator"
ref="
beanValidator"
/>
-------
③
……
</bean>
①
commandName 用于指明需要验证的
command的名字,这个名字必须和
validation.xml中<
form
name
=
"
xxxxx
"
> 所写的名字保持一致。
②
commandClass用于指定这个
command的类型。其必须与你
jsp提交的
form最后形成的
command类型相一致。
③ 声明该
controller使用
validator,这里将我们刚刚定义的
beanValidator传入进去。
3. 在
validation.xml文件中,定义你要校验的
formbean(或者说是
command) ,定义这个
bean中有哪几个
field需要验证,使用何种规则验证。(
注意:这里定义的
form name
必须和前面
controller
中定义的
commandName
保持一致)以下是几种常用的验证示例:
<
form-validation
>
<
formset
>
<
form
name
=
"
userCommand
"
> -----
①
<
field
property
=
"userId"
depends
=
"required"
> -----
②
<
arg0
key
=
"
用户代码
"
/>
-------
③
</
field
>
①
这里是定义要验证的
bean
的名字,要求去上面定义的
commandName
相同
②
这里定义要验证的
bean
属性为
userId
,
使用规则为
required
(
不为空
)
③ 这里定义的是显示信息,
arg0
表示位置 0 的显示信息,显示
key
所标明的信息
(如果你还有多个信息就用
arg1
,
arg2
等)出错信息将会显示为:
用户代码
不能为空
<
field
property
=
"age"
depends
=
"required,integer,mask"
>
-----
①
<
arg0
key
=
"
年龄
"
/>
<
msg
name
=
"mask"
key
=
"errors.negative"
/>
-----
②
<
var
>
<
var
-name
>
mask
</
var
-name
>
<
var
-value
>
^[1-9]
</
var
-value
>
-------
③
</
var
>
</
field
>
①
mask
标记验证,使用正则表达式来约束表单输入值。(如:只能输入数字,字母或指定的字符)
②
msg
标签用来定义
验证规则和出错信息的关联,这里表示当出现
mask
校验失败时,显示
errors.negative
指明的信息。
③
整个<var>标签就是用来定义具体的规则的,如<var-name>mask</var-name>指明是用于mask的规则,<var-value>^[1-9]</var-value> 表示只允许1-9这几个数字开头。
所以上面验证信息是年龄字段不可以为空,必须为整数,而且必须为1-9开头 也就杜绝了负数和零的情况。
<
field
property
=
"birthday"
depends
=
"required,date"
>
-----
①
<
arg0
key
=
"
生日
"
/>
<
var
>
<
var
-name
>
datePatternStrict
</
var
-name
>
-----
②
<
var
-value
>
yyyy-MM-dd
</
var
-value
>
-----
③
</
var
>
</
field
>
</
formset
>
① 使用“date”加入对日期的格式的校验
②
开始定义日期格式,
var
-name
必须写为
datePatternStrict
③
定义你希望的日期格式如:
yyyy-mm-dd
yy/mm/dd
等等都可以。
<
field
property
=
"startDate"
depends
=
"required,date"
>
<
arg0
key
=
"
开始日期
"
/>
<
var
>
<
var
-name
>
datePatternStrict
</
var
-name
>
<
var
-value
>
yyyy-MM-dd
</
var
-value
>
</
var
>
</
field
>
<
field
property
=
"endDate"
depends
=
"required,date,compareTwoField"
>
-----
①
<
arg0
key
=
"
结束日期
"
/>
<
arg1
key
=
"
开始日期
"
/>
-----
②
<
var
>
<
var
-name
>
datePatternStrict
</
var
-name
>
<
var
-value
>
yyyy-MM-dd
</
var
-value
>
</
var
>
<
var
>
<
var
-name
>
secondField
</
var
-name
>
-------
③
<
var
-value
>
startDate
</
var
-value
>
</
var
>
</
field
>
①
这里演示的是两个日期的验证,要达到开始日期不能晚于结束日期,加入
compareTwoField
验证规则
②
定义第
2
个显示参数
agr1
“开始日期”
③
加入一个
var
其
var
-name
为
secondField
(这个是在程序中写死的,必须写为
secondField
)
④
var
-value
定义为开始日期的属性名,如在本例中为
startDate
注:compareTwoField 是我们自己编写的一个校验规则,用于比较两个字段值大小。
4.
在jsp页面中定义错误信息显示语句:
<
spring:bind
path
=
"tableCrashDO.*"
>
-----
①
<
c:if
test
=
"
${not empty status.errorMessages}">
<
div
class
=
"error"
>
<
c:forEach
var
=
"error"
items
=
"
${status.errorMessages}">
<
c:out
value
=
"
${error}"escapeXml="false"/><br/>
</
c:forEach
>
</
div
>
</
c:if
>
</
spring:bind
>
①
这里的
path
必须要与传入该
jsp
的
bean
的名字一样。如传入该
jsp
的数据
bean
叫
tableCrashDO
,path就应该写为
tableCrashDO
.*
。
5
.
使客户端产生
javascript
代码:
<
v:javascript
formName
=
"tableCrashDO"
-----
①
staticJavascript
=
"false"
xhtml
=
"true"
cdata
=
"false"
/>
<
script
type
=
"text/javascript"
src
=
"
<
c:url
value
=
"scripts/validator.jsp"
/>
"
></
script
>
①
v:javascript
标签是
spring
的标签,定义在
spring-commons-validator.tld
。其中
formName
必须与
validation.xml
中
form
的
name
保持一致。
如此以来,基本上可以算完成了
validate
的验证配置。
(特别注意:
controller
中的
commandName
;
validation.xml
中的
form name
;
jsp
中
v:javascript
标签的
formName
三者必须保持一致。)