下载地址
窥探用法
在使用其实你会发现,好像整个框架好像只有一个方法`IValidateService.validate(this,"group.xxx");`
优点
不与任何对象做绑定,最大限度解耦,并不像Struts那样与对象绑定
如果规则配置写的合理,甚至规则可以复用到多个对象
扩展验证器很简单
以Map存储验证结果,非常简单的导出JSON,只要你愿意
甚至在桌面程序中使用框架都是完美的
支持Spring
包含简单的Struts2标签
缺点
不支持国际化,未来版本支持
不适合与Bean的严格绑定
快速使用
ValidateSample.java
public class ValidateSample {
/**
* 执行验证
*/
public void doValidate(){
...
}
/**
* 用户名,必须实现GETTER方法
*/
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public static void main(String[] args) {
new ValidateSample().doValidate();
}
}
doValidate方法的实现
public void doValidate(){
/*
* 实例化配置,默认配置在CLASSPATH下的validators.fo.xml以及rules.fo.xml两个文件中
*/
IValidateConfig config = new BasicValidateConfig();
/*
* 实例化服务
*/
IValidateService service = new BasicValidateService(config);
/*
* 执行验证;
*
* 在执行验证之前需要在rules.fo.xml规则文件中配置好规则
*
* 需要传入两个参数,
* 第一个参数:需要被验证的对象,不可以为空
* 第二个参数:在验证规则中的 规则组代号
*
* 执行验证后返回验证结果集合,以Map形式返回
*/
Map<String,String> results = service.validate(this, "group.sample");
/*
* 通过验证结果集是否为空来判断是否验证通过
*/
if(results.isEmpty()) {
System.out.println("验证通过!");
} else {
System.err.println("验证不通过,有验证失败的项目!");
/*
* 验证失败的字段存储在KEY中,而VALUE则是验证的失败的提示字符串
*/
Set<String> keys = results.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(key+"(验证不通过)");
System.out.println("原因:"+results.get(key));
}
}
}
运行结果
21:23:09,958 INFO BasicValidateConfig:44 - read validation main file , rules.fo.xml
验证不通过,有验证失败的项目!
username(验证不通过)
原因:用户名必须要填写!
编写重点
读取配置,
IValidateConfig config = new BasicValidateConfig();
实例化服务,
IValidateService service = new BasicValidateService(config);
配置相关规则,编写
rules.fo.xml
文件执行验证,
service.validate(this,"group.sample");
配置文件
<!--rules.fo.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<fozone-validation>
<group name="group.sample">
<field name="username">
<rule name="required" message="用户名必须要填写!"/>
</field>
</group>
</fozone-validation>
简单的例子:UserSample.java
public class UserSample {
public static void main(String[] args) {
new UserSample().doValidate();
}
private User user;
private String passwordAgain;
//初始化User
public UserSample() {
// TODO Auto-generated constructor stub
user = new User();
user.setUsername("Jimmy Song");
user.setPassword("123456");
this.setPasswordAgain("654321");
user.setEmail("jimmy.song#aliyun.com");
long timestamp = Calendar.getInstance().getTimeInMillis();
Timestamp starttime = new Timestamp(timestamp);
Timestamp endtime = new Timestamp(timestamp-1000);
user.setStarttime(starttime);
user.setEndtime(endtime);
}
//执行验证
public void doValidate(){
...
}
}
实现验证:doValidate
public void doValidate(){
IValidateConfig config = new BasicValidateConfig();
IValidateService service = new BasicValidateService(config);
Map<String,String> results = service.validate(this, "group.user");
if(results.isEmpty()) {
System.out.println("验证通过!");
} else {
System.err.println("验证不通过,有验证失败的项目!");
Set<String> keys = results.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(key+"(验证不通过)");
System.out.println("原因:"+results.get(key));
}
}
}
输出结果
22:54:08,603 INFO BasicValidateConfig:44 - read validation main file , rules.fo.xml
22:54:08,679 INFO BasicValidateConfig:77 - read include validation file , user.fo.xml
验证不通过,有验证失败的项目!
user.password(验证不通过)
原因:两次输入密码不一致
passwordAgain(验证不通过)
原因:两次输入密码不一致
user.email(验证不通过)
原因:邮件格式不正确
user.starttime(验证不通过)
原因:开始时间不能大于结束时间
user.endtime(验证不通过)
原因:结束时间不能小于开始时间
配置文件:rules.fo.xml
/user.fo.xml
rules.fo.xml
<?xml version="1.0" encoding="UTF-8"?>
<fozone-validation>
<group name="group.sample">
<field name="username">
<rule name="required" message="用户名必须要填写!"/>
</field>
</group>
<include file="user.fo.xml"/>
</fozone-validation>
user.fo.xml
<?xml version="1.0" encoding="UTF-8"?>
<fozone-validation>
<group name="group.user">
<field name="user.username">
<rule name="required" message="用户名必须填写"/>
<rule name="max" message="用户名最大20个字符">
<param name="value" value="20"/>
</rule>
</field>
<field name="user.password">
<rule name="required" message="密码必须填写"/>
<rule name="between" message="密码长度在6-20个字符之间">
<param name="min" value="6"/>
<param name="max" value="20"/>
</rule>
<rule name="equals" message="两次输入密码不一致">
<param name="target" value="passwordAgain"/>
</rule>
</field>
<field name="passwordAgain">
<rule name="required" message="密码必须填写"/>
<rule name="between" message="密码长度在6-20个字符之间">
<param name="min" value="6"/>
<param name="max" value="20"/>
</rule>
<rule name="equals" message="两次输入密码不一致">
<param name="target" value="user.password"/>
</rule>
</field>
<field name="user.email">
<rule name="required" message="邮件必须填写"/>
<rule name="between" message="邮件长度应该3-100之间">
<param name="min" value="3"/>
<param name="max" value="100"/>
</rule>
<rule name="match" message="邮件格式不正确">
<param name="regex" value="^[A-Za-z]+[\.\-_A-Za-z0-9]*@[A-Za-z]+[\.\-_A-Za-z0-9]*$"/>
</rule>
</field>
<field name="user.starttime">
<rule name="timestampLessEqual" message="开始时间不能大于结束时间">
<param name="target" value="user.endtime"/>
</rule>
</field>
<field name="user.endtime">
<rule name="timestampCreaterEqual" message="结束时间不能小于开始时间">
<param name="target" value="user.starttime"/>
</rule>
</field>
</group>
</fozone-validation>
本文出自 “博远至静” 博客,请务必保留此出处http://sunspot.blog.51cto.com/372554/1334281