在和XXXAction同级目录下,建立XXXAction-validation.xml即为该Action校验逻辑
该校验XMLdtd格式文件为 http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd具体内容可以展开下面代码:
http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!--
XWork Validators DTD.
Used the following DOCTYPE.
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!ELEMENT validators (field|validator)+>
<!ELEMENT field (field-validator+)>
<!ATTLIST field
name CDATA #REQUIRED
>
<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator
type CDATA #REQUIRED
-circuit (true|false) "false"
>
<!ELEMENT validator (param*, message)>
<!ATTLIST validator
type CDATA #REQUIRED
-circuit (true|false) "false"
>
<!ELEMENT param (#PCDATA)>
<!ATTLIST param
name CDATA #REQUIRED
>
<!ELEMENT message (#PCDATA)>
<!ATTLIST message
key CDATA #IMPLIED
>
可以看到数据校验XML根元素<validator>下面可以包含两种 子元素:field和validator
1、前者field 是针对字段进行校验;
2、后者validator 是非字段或者说全局范围校验
在介绍完校验是如何回事后后面会简单比较下两种校验方式区别
、字段校验:(field)
先看个基本举例
<validators>
<field name="username">
<field-validator type="required">
<message key="error.username.required"/>
</field-validator>
</field>
<field name="password">
<field-validator type="length">
<param name="trim">true</param>
<param name="minLength">4</param>
<param name="maxLength">10</param>
<message>password should be ${minLength} to ${maxLength} characters long.</message>
</field-validator>
</field>
</validators>
有几个地方需要注意下
1、field-validatortype在哪里定义?
struts2校验框架预设类在包com.opensymphony.xwork2.validator.validators中,同目录下default.xml中定义了field-validator中type名称和对应处理类
default.xml
<!-- START SNIPPET: validators-default -->
<validators>
<validator name="required" ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="required" ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="" ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="double" ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" ="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" ="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" ="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="length" ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->
其中name是上面type需要引用名字而后面则是这些validator对应类这些类中大部分都是自解释其中fieldexpression比较特殊它提供了种多个field的间比较值机制
2、param值又是在哪里找到呢?
param中name值在上述类中被定义为属性譬如说在类com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是Length对应处理类)就定义了
boolean trim;
minLength,maxLength;
及它们get/思路方法
3、message注意事项
(1)每个field都必须拥有个message;message信息最后是以addFieldError实现也就是说是field级
(2)message中可以引用param变量引用格式为${param1},如上面例子中对password验证失败报错信息
(3)message内容可以放到全局i18n属性文件中并在message中以key属性值指定比如上面例子中对username验证失败报错信息
2、非字段校验/全局校验
全局校验和字段校验其实类似使用验证器也是那些区别在于校验方式和关注点区别:
1、字段校验先指定那个字段要校验再指定用那些校验器来校验该字段;
2、全局校验不针对特定字段先指定验证器再来指定用该校验器校验那些字段
基本举例如下:
<validators>
<validator type="required" -circuit="true">
<param name="fieldName">username</param>
<param name="fieldName">password</param>
<param name="fieldName">password_confirmed</param>
<message key="error.field.required"/>
</validator>
<validator type="length">
<param name="trim">true</param>
<param name="minLength">4</param>
<param name="maxLength">10</param>
<param name="fieldName">password</param>
<param name="fieldName">password_confirmed</param>
<message>password should be ${minLength} to ${maxLength} characters long.</message>
</validator>
</validators>
举例很简单第个validator是校验“不为空串”校验“用户名”、“密码”、“确认密码”字段第 2个校验器校验“串长度6-10”校验“密码”、“确认密码”两个字段
很明显如果页面中存在些共性验证要求用这种方式就比针对字段验证要方便但这种方式可能不如前种方式清晰易读
两种验证方式可以混用
3、其他问题
1、对多验证和跳转逻辑支持
和Struts2 数据输入校验(1) —— 验证 中所说内容样校验框架也支持多验证和跳转逻辑比如说在struts.xml文件中配置了
<action name="XXXAction" ="com.myspace.myname.XXXAction" method="ExcuteName">
<result>success.jsp</result>
</action>
则校验文件名字为XXXAction-ExcuteName-validation.xml
当然在执行了上面校验的后如果存在XXXAction-validation.xml则还会执行这个文件中定义校验
同时需要注意是如果该Action存在父类则会先行执行父类相应校验
2、客户端校验
客户端校验是不安全但struts仍然提供了客户端校验
思路方法是在<s:form>中设置validate属性为true,如果该属性被设置则struts不会在服务器端验证取而代的是在客户端生成Javascript代码但这些Js代码功能较弱灵活度也比较低且不会刷新因此不推荐使用
其实strutsControl控件本身和般HTMLControl控件样如果想做客户端验证可以触发它们onXXX事件和通常HTML页面做法样
最新评论