最近做小项目的时候,由于页面上有许多list,提交上来后,要将list中所有对象都保存至数据库。如果list中对象主键有重复的话,那么主键冲突就保存不了,因此对这种情况应该进行验证。
struts2的验证框架可谓是非常优雅,但无奈默认提供的validators中没有满足这种需求的validator,因此需要进行扩展。
对于扩展struts2 validator框架的介绍有很多,例如:
http://developer.51cto.com/art/201103/251944.htm
在此就不重复介绍了
首先是我们自定义的validator
package com.zyl.eduInfoStat.validator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
import com.zyl.eduInfoStat.model.help.ListValidateAble;
public class ListRepeatValidator extends FieldValidatorSupport {
@SuppressWarnings("unchecked")
@Override
public void validate(Object o) throws ValidationException {
// TODO Auto-generated method stub
String listName = getFieldName();
List<ListValidateAble> list = (List<ListValidateAble>) this
.getFieldValue(listName, o);
Set<String> set = new HashSet<String>();
for (ListValidateAble lva : list) {
if (set.contains(lva.getStrForValidate())) {
addFieldError(listName, o);
return;
}
set.add(lva.getStrForValidate());
}
}
}
这段代码就是验证list内容重不重复的主要逻辑,非常简便,其中ListValidateAble是一个接口,所有需要这个验证器验证的对象都需要implements这个接口。这个接口定义非常简单:
package com.zyl.eduInfoStat.model.help;
public interface ListValidateAble {
public String getStrForValidate();
}
之所以定义这个接口,是为了将自定义的ListRepeatValidator具有普适性.只要list中的对象是扩展了这个接口的,都可以用ListRepeatValidator验证。
如:
package com.zyl.eduInfoStat.model;
import java.io.Serializable;
import com.zyl.eduInfoStat.model.help.ListValidateAble;
public class EquipInfo_trainRoom implements Serializable ,ListValidateAble{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 在表中的序号,用于保持显示顺序
*/
private int i;
private String schoolName;
private String roomName;
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
public String getRoomName() {
return roomName;
}
public void setRoomName(String roomName) {
this.roomName = roomName;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public String getStrForValidate() {
// TODO Auto-generated method stub
return schoolName;
}
}
接下来是validators.xml,我们需要将这个文件放到classpath的根目录下。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<!-- START SNIPPET: validators-default -->
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
<!-- 自定义的验证器 -->
<validator name="listRepeat" class="com.zyl.eduInfoStat.validator.ListRepeatValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->
我们自定义的ListRepeatValidator在最下方,上方是系统默认提供的验证器。
最后是action的配置,如EquipInfoSubmitAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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="equipInfo_trainRoom_list">
<field-validator type ="listRepeat" >
<message>值不能重复!</message>
</field-validator >
</field>
</validators>
如此便大功告成了!
PS.
写代码一有问题,便是上网搜,解决了无数的问题。想着咱也必须贡献一点力啊~
分享到:
相关推荐
struts中自定义validator验证 <br>很多时候需要验证“密码”与“重复密码”是否一致,如果放在服务器端验证就浪费资源了。 如何在客户端进行验证呢?JS可以实现,但是struts的validator框架是否能实现呢?-见...
该demo是struts验证器validator使用,以及struts基本配置,自定义创建struts的验证器,使用maven创建管理工程,使用eclipse编译器
struts中使用validator框架由简单到复杂的三个实例,附加说明。
整合了struts2 jquery的formValidator表单验证的页面代码, 包含验证用户是否存在,提交表单等
03_张孝祥09年Struts视频_validator单元3.rar
Struts1的validator验证框架
struts 的validator框架验证,入门好例!!!!
struts2 plus是方便了struts2 validator的应用。
Struts的Validator-rules详解
struts 2.0自定义验证器
validator框架验证入门例子 struts1.x validator框架验证入门例子
通过用户登录的例子,用Struts2的validator做后台的校验
Struts Validator 开发指南
struts validator验证框架项目,都是很常用的验证,比如用户名满足6位以上,密码与确认密码必须相同,日期格式必须为yyyy-MM-dd等等
在struts1.x版本中使用validator验证框架实例。
呵呵很简单,但是和struts1.2比较起来还是有点不同!
Struts Validator验证框架详细讲解.txt
(2):对密码校验的规则是用户不能为空,且只能是数字,长度为8到20之间。 (3):年龄的校验规则是必须是整数,且在1到120之间。 (4):生日的校验规则是必须在1950-1-1到1990-1-1之间。 (5):所有提示信息均要...
Struts2中提供了数据校验验证数据例如验证邮件、数字等,本篇文章介绍了Struts2之Validator的详细介绍,有兴趣的可以了解一下。
Struts Hibernate Spring 集成开发宝典 validator 有研究或探讨或开源的请加群:37424970 或联系本人MSN或邮箱:zhuseahui@yahoo.com.cn