一种方式:
Struts2推荐采用配置文件的方式进行数据校验
a.继承ActionSupport类
b.修改struts2.xml文件:删除method属性
c.在需要验证的Action类的相同包下,写一个校验器文件
d.加入头信息以具有提示功能
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
Field-Validator(校验器)的使用
校验器文件需要和其保护的Action类在同一目录下,命名格式为:
所保护的Action的实现类名−要保护的成员方法−validation.xml
如
LoginAction-execModifyPassword-validation.xml
LoginAction 对应 ActionClassName,execModifyPassword 对应 action 请求,validation.xml固定写法
校验器文件的书写格式是:
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="要校验的注入字段名">
<field-validator type="校验器类型">
<param name="扩展校验功能">值</param>
<message>校验失败时提示信息</message>
</field-validator>
</field>
<field name="要校验的注入字段名">
<field-validator type="校验器类型">
<message key="校验失败时提示信息" />
</field-validator>
</field>
</validators>
可以为一个校验文件设定多个校验字段,可以为一个校验字段设定多个校验器,可以为一个校验器做多次扩展。
校验不通过信息的位置
当校验器校验不通过时,会返回"input"逻辑视图,在struts.xml对应的Action下配置它。
通过使用:
<s:fielderror>
<s:param>要校验的注入字段名</s:param>
</s:fielderror>
或
<s:fielderror fieldName="要校验的注入字段名"/>
struts2表单验证里field-validator type值可以取哪些值?
int 整数;
date 日期;
email Email地址;
requiredstring 必须字符;
stringlength 输入字符长度限制;
url web地址
regex 正则表达式验证
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!-- 用户修改密码验证 -->
<validators>
<!-- 新密码 -->
<field name="password">
<!-- 验证字符串不能为空 -->
<field-validator type="requiredstring" short-circuit="true">
<!-- 去空格 -->
<param name="trim">true</param>
<!-- 错误提示信息 -->
<message key="password.required"></message>
</field-validator>
<field-validator type="passwordCharFilter" short-circuit="true">
<message key="password.dengbaoilleqalchar"></message>
</field-validator>
<!-- 验证字符串长度 -->
<field-validator type="stringlength">
<param name="trim">true</param>
<param name="maxLength">12</param>
<param name="minLength">6</param>
<message key="password.length"></message> <!-- 密码长度应在6到12个字符之间 -->
</field-validator>
</field>
<!-- 旧密码 -->
<field name="oldPassword">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message key="oldPassword.required"></message>
</field-validator>
<!--<field-validator type="passwordCharFilter" short-circuit="true">
<message key="password.dengbaoilleqalchar"></message>
</field-validator>-->
<field-validator type="stringlength" short-circuit="true">
<param name="trim">true</param>
<param name="maxLength">12</param>
<param name="minLength">6</param>
<message key="oldPassword.length"></message>
</field-validator>
</field>
<!-- 重复密码 -->
<field name="repassword">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message key="repassword.required"></message>
</field-validator>
<field-validator type="passwordCharFilter" short-circuit="true">
<message key="password.dengbaoilleqalchar"></message>
</field-validator>
<field-validator type="stringlength" short-circuit="true">
<param name="trim">true</param>
<param name="maxLength">12</param>
<param name="minLength">6</param>
<message key="repassword.length"></message>
</field-validator>
<!-- 两次密码是否一致 -->
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression"><![CDATA[(#parameters.password[0] == #parameters.repassword[0])]]></param>
<message key="repassword.noEquals"></message>
</field-validator>
</field>
</validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">100</param>
<message>年龄应在1到100之间</message>
</field-validator>
</field>
<!-- 验证字符串为日期类型 -->
<field name="birthday">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2008-10-16</param>
<message>出生日期应在1900-01-01到2008-10-16</message>
</field-validator>
</field>
<field name="email">
<field-validator type="email">
<message key="必须是有效的邮件地址!" />
</field-validator>
</field>
<field name="url">
<field-validator type="url">
<message key="必须是有效的网址!" />
</field-validator>
</field>
<field name="yum">
<field-validator type="regex">
<!-- 2.3.15前的版本使用expression参数 -->
<param name="regexExpression"><![CDATA[(\d{5})]]></param>
<message>必须是有效的yum(5位数字)!</message>
</field-validator>
</field>
</validators>
short-circuit=“true”
Struts2 Field校验框架message元素key的使用方式
Struts2 Field校验框架message元素key的使用方式
另一种方式:
Action中的validate()方法
struts2提供了一个Validateable接口,这个接口中只存在validate()方法。
validate()方法会在execute()方法执行之前执行,仅数据校验正确时,才执行execute方法。如果错误则将错误添加到fieldErrors域中,如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑需要不同的校验规则,这种情况下validate()会对所有处理逻辑使用相同的校验规则,为了实现不同的校验逻辑,需要通过validateX()方法,其中X表示处理逻辑的方法名。
public String add() throws Exception {
ds.add(dg);
close = true;
return SUCCESS;
}
public void validateAdd(){
int begin = dg.begin;
int end = dg.end;
if(begin != 0 && end != 0){
if(begin >= end){
this.addFieldError("errorDG", this.getText("dg.endMaxBegin"));
return;
}
if((end - begin + 1) < 10 || (end - begin + 1)>300){
this.addFieldError("errorDG", this.getText("dg.endOrBegin"));
return;
}
}
}