参考:https://github.com/41zone/validation/
下载DEMO:http://down.51cto.com/data/1028885
在使用其实你会发现,好像整个框架好像只有一个方法`IValidateService.validate(this,"group.xxx");`
不与任何对象做绑定,最大限度解耦,并不像Struts那样与对象绑定
如果规则配置写的合理,甚至规则可以复用到多个对象
扩展验证器很简单
以Map存储验证结果,非常简单的导出JSON,只要你愿意
甚至在桌面程序中使用框架都是完美的
支持Spring
包含简单的Struts2标签
不支持国际化,未来版本支持
不适合与Bean的严格绑定
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(); } }
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