当校验逻辑不是十分复杂时,能够用xml进行校验;逻辑十分复杂是,能够经过validate()进行校验
分类:
【字段校验】
---- field-validator
---- 字段优先,我去校验谁(字段),我用谁(校验器)来校验
---- field-validator
---- 字段优先,我去校验谁(字段),我用谁(校验器)来校验
【非字段校验】
---- validator
---- 校验器优先,我用谁(校验器)来校验,我去校验谁(字段)
---- validator
---- 校验器优先,我用谁(校验器)来校验,我去校验谁(字段)
****** 这两种只是
表现形式 不一样,底层是相同的,都是把错误信息放到fielderror中
命名:须要校验的Action名 +
-validation.xml
位置:要和须要校验的Action放在同一目录下
位置:要和须要校验的Action放在同一目录下
### 只对action中的某个方法进行校验
-1-
须要校验的Action名 + -方法名 + -validation.xml
|
对应xml中<action>的属性的name值
须要校验的Action名 + -方法名 + -validation.xml
|
对应xml中<action>的属性的name值
如: RegisterAction-add-validation.xml
--对应 /add.action --对RegisterAction中的add()方法进行校验
-2-
在不须要进行验证的方法加上annotation,即在方法前加上
@SkipValidation。
-3-
<action name=...>
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">*</param>
<param name="validation.includeMethods">须要验证的方法名称,以逗号分隔</param>
</interceptor-ref>
</action>
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">*</param>
<param name="validation.includeMethods">须要验证的方法名称,以逗号分隔</param>
</interceptor-ref>
</action>
### 校验顺序
若是 既提供了RegisterAction-validation.xml,又提供了RegisterAction-add-validation.xml
Struts2会先校验RegisterAction-validation.xml,而后再去校验RegisterAction-add-validation.xml
这两个都会被调用
### 建议:
当有多个逻辑方法时,就不要提供RegisterAction-validation.xml
只提供相应方法的xml文件,如:RegisterAction-execute-validation.xml
==============
== 字段校验 ==
==============
== 字段校验 ==
==============
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-
validator-1.0.2.dtd">
<validators>
至少提供一个 field 或 validate
name必须提供
1个 field 表示对一个属性的一次校验
<field name="username">
至少提供一个 field 或 validate
name必须提供
1个 field 表示对一个属性的一次校验
<field name="username">
<field>中至少有一个或多个<field-validator>
1个<field-validator>表示对它校验的一种方式
type类型必须提供 类型=requiredstring 表示username必填
验类型来自于 xwork-2.0.4.jar/com/opensymphony/xwork2/validator/validators/deault.xml
short-circuit:表示短路,默认false若设为true,表示:这个验证器失败了,就再也不执行后面的验证器了
1个<field-validator>表示对它校验的一种方式
type类型必须提供 类型=requiredstring 表示username必填
验类型来自于 xwork-2.0.4.jar/com/opensymphony/xwork2/validator/validators/deault.xml
short-circuit:表示短路,默认false若设为true,表示:这个验证器失败了,就再也不执行后面的验证器了
<field-validator type="requiredstring" short-circuit="true">
<field-validator>中有若干个(0 ~ N)<param>子元素 和 一个<message>子元素
这里的trim对应到requiredstring对应类RequiredStringValidator中的setTrim(boolean trim)方法设置的属性doTrim
requiredstring这种校验类型,doTrim默认设为true,因此这里写与不写trim设为true都是同样的
这里的trim对应到requiredstring对应类RequiredStringValidator中的setTrim(boolean trim)方法设置的属性doTrim
requiredstring这种校验类型,doTrim默认设为true,因此这里写与不写trim设为true都是同样的
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<message>用户名不能为空!</message>
</field-validator>
验证字符串长度
<field-validator type="stringlength">
<param name="minLength">6</param> 最小长度,默认-1
<param name="maxLength">10</param> 最大长度,默认-1
<message>用户名应该在 ${minLength} 和 ${maxLength} 之间</message>
也能够用国际化的方式:<message key="error.password.required"/>
<field-validator type="stringlength">
<param name="minLength">6</param> 最小长度,默认-1
<param name="maxLength">10</param> 最大长度,默认-1
<message>用户名应该在 ${minLength} 和 ${maxLength} 之间</message>
也能够用国际化的方式:<message key="error.password.required"/>
</field-validator>
</field>
@@@ 验证必填&字符串长度 @@@@@@@@@@@@@@@@@@@@@@@
<field name="password">
<field-validator type=" requiredstring">
<message>密码不能为空</message>
</field-validator>
<field-validator type=" stringlength">
<param name=" minLength">6</param>
<param name=" maxLength">10</param>
<message>密码应该在 ${minLength} 和 ${maxLength} 之间</message>
</field-validator>
</field>
<field-validator type=" requiredstring">
<message>密码不能为空</message>
</field-validator>
<field-validator type=" stringlength">
<param name=" minLength">6</param>
<param name=" maxLength">10</param>
<message>密码应该在 ${minLength} 和 ${maxLength} 之间</message>
</field-validator>
</field>
@@@ 验证数字 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<field name="age">
<field-validator type="required">
<message>年龄不能为空</message>
</field-validator>
<field-validator type=" int">
<param name=" min">1</param>
<param name=" max">150</param>
<message>年龄应该在 ${min} 和 ${max} 之间</message>
</field-validator>
</field>
<field-validator type="required">
<message>年龄不能为空</message>
</field-validator>
<field-validator type=" int">
<param name=" min">1</param>
<param name=" max">150</param>
<message>年龄应该在 ${min} 和 ${max} 之间</message>
</field-validator>
</field>
@@@ 验证日期 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<field name="birthday"> 类型为requiredString用于校验String类型必填
<field-validator type=" required"> 类型为required用于验证String之外的类型必填
<message>生日不能为空</message>
</field-validator>
<field-validator type=" date">
<param name=" min">2001-01-01</param>
<param name=" max">2008-08-08</param>
<message>生日应该在 ${min} 和 ${max} 之间</message>
</field-validator>
</field>
</validators>
<field-validator type=" required"> 类型为required用于验证String之外的类型必填
<message>生日不能为空</message>
</field-validator>
<field-validator type=" date">
<param name=" min">2001-01-01</param>
<param name=" max">2008-08-08</param>
<message>生日应该在 ${min} 和 ${max} 之间</message>
</field-validator>
</field>
</validators>
========================================
default.xml中提供的校验类型:
========================================
required 用于检查值是否为null
requiredstring 用于检查string是否为null或空, 参数trim,可在验证前对字符串执行trim操做
stringlength 检查string的长度是否在某个范围, 参数trim,minLength,maxLength
int/double 检查某值是否为int/double且在某个范围,参数min,max;minInclusive,maxInclusive,minExclusive,maxExclusive
date 检查date的范围, 参数min,max
email 检查输入是否为email格式
url 检查输入是否为url格式
conversion 检查是否将出现数据转换错误
expression/fieldexpression 检查某个布尔表达式的值是否为true,后者绑定到某个字段上
参数expression
参数expression
visitor 使用预约义的validators进行验证,参数context
regex 检查是否能匹配到正则表达式, 参数regex
@@@@@@@@@@@@@@
正则表达式验证:
@@@@@@@@@@@@@@
<field name="bar2">
<field-validator type="regex">
<param name="regex">[0-9],[0-9]</param>
<message>
bar2的值必须是"x, y"这样的格式 而且x、y都在0 ~ 9的范围内
</message>
</field-validator>
<field-validator type="regex">
<param name="regex">[0-9],[0-9]</param>
<message>
bar2的值必须是"x, y"这样的格式 而且x、y都在0 ~ 9的范围内
</message>
</field-validator>
@@@@@@@@@
URL
@@@@@@@@@
<field name="url">
<field-validator type="required" short-circuit="true">
<message>你须要输入一个URL。</message>
</field-validator>
<field-validator type="url" short-circuit="true">
<message>URL错误。</message>
</field-validator>
</field>
URL
@@@@@@@@@
<field name="url">
<field-validator type="required" short-circuit="true">
<message>你须要输入一个URL。</message>
</field-validator>
<field-validator type="url" short-circuit="true">
<message>URL错误。</message>
</field-validator>
</field>
@@@@@@@@@@@@
EMail
@@@@@@@@@@@@
<field name="mail">
<field-validator type="required">
<message>你须要输入一个电子邮件的地址。</message>
</field-validator>
<field-validator type="email">
<message>非法的email格式。</message>
</field-validator>
</field>
@@@@@@@@@@@@
<field name="mail">
<field-validator type="required">
<message>你须要输入一个电子邮件的地址。</message>
</field-validator>
<field-validator type="email">
<message>非法的email格式。</message>
</field-validator>
</field>
@@@@@@@@@@@@
表达式
@@@@@@@@@@@@
<validator type="expression">
<param name="expression">name.equals(desc)</param>
<message>name not the same as desc</message>
</validator>
OR
<validator type="expression>
<param name="expression">foo gt bar</param>
<message>foo必须大于bar.</message>
</validator>
OR
<validator type="expression">
<param name="expression">email.equals(email2)</param>
<message>Email不等于email2</message>
</validator>
OR
<validator type="expression" short-circuit="true">
<param name="expression">email.startsWith('mark')</param>
<message>Email没有以mark开始。</message>
</validator>
表达式
@@@@@@@@@@@@
<validator type="expression">
<param name="expression">name.equals(desc)</param>
<message>name not the same as desc</message>
</validator>
OR
<validator type="expression>
<param name="expression">foo gt bar</param>
<message>foo必须大于bar.</message>
</validator>
OR
<validator type="expression">
<param name="expression">email.equals(email2)</param>
<message>Email不等于email2</message>
</validator>
OR
<validator type="expression" short-circuit="true">
<param name="expression">email.startsWith('mark')</param>
<message>Email没有以mark开始。</message>
</validator>
================
== 非字段校验 ==
================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-
validator-1.0.2.dtd">
<validators>
<validate type="requiredstring"> 用谁来校验
<validate type="requiredstring"> 用谁来校验
去校验谁
validate中的第一个param的name属性永远都是固定的fieldName,对应与要去校验的字段名
validate中的第一个param的name属性永远都是固定的fieldName,对应与要去校验的字段名
<param name="fieldName">username</param>
<message>用户名为必填</message>
<message>用户名为必填</message>
解释:用requiredstring校验器去校验username字段,若是出错,显示<message>中的信息
</validate>
<validate type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用户名必须在 ${minLength} 和 ${maxLength} 之间</message>
</validate>
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用户名必须在 ${minLength} 和 ${maxLength} 之间</message>
</validate>
=====================================
客户端校验--功能弱,死板(不建议使用)
=====================================
1.
Struts2的<s:form>的theme必定不能设置为simple
2.
将<s:form>的validte属性设置为true
将<s:form>的validte属性设置为true
3.
Struts2的客户端校验是基于***-validation.xml中的设置生成js代码
Struts2的客户端校验是基于***-validation.xml中的设置生成js代码
==========================
自定义客户端校验
==========================
<s:form action="register" theme="simple" onsubmit="return validate();">
js:
function validate() {
//document.getElementByName("username")[0] 返回一个全部名为username的数组
//var usernameValue = document.getElementByName("username")[0].value
//document.getElementByName("username")[0] 返回一个全部名为username的数组
//var usernameValue = document.getElementByName("username")[0].value
var usernameValue = document.getElementByID("username").value;
if( usernameValue.length == 0 ) {
alert("Username should not be blank!");
return false;
}
...
}
if( usernameValue.length == 0 ) {
alert("Username should not be blank!");
return false;
}
...
}
========
= 补充 =
========
1.
集合里面存放的并非对象,而是对象的引用
如:
List list = new ArrayList();
Map map = new LinkedHashMap()'
map.put("1", list); //存放的是映射
list.add("string1");
list.add("string2");
list.add("string3");
List list = new ArrayList();
Map map = new LinkedHashMap()'
map.put("1", list); //存放的是映射
list.add("string1");
list.add("string2");
list.add("string3");
2.
若是既有xml校验,又有validate()校验
将先校验xml,而后进行validate()校验
而后将全部的错误添加进fielderror
3.
真正存放field级别错误信息的对象是LinkedHashMap
该LinkedHashMap的key是String类型的,value是ArrayList类型的
对于Action级别的错误信息,其实是放置在ArrayList中的
4. 不能经过 this.getFieldError().put("...","...");的方法,添加fielderror 由于getFieldError()返回的是一个fieldErrorMap的副本。