Validation.FO, 简洁而不简单的验证框架。(来自41区)

下载地址

  1. 参考:https://github.com/41zone/validation/

  2. 下载DEMO:http://down.51cto.com/data/1028885

窥探用法

在使用其实你会发现,好像整个框架好像只有一个方法`IValidateService.validate(this,"group.xxx");`

优点

  1. 不与任何对象做绑定,最大限度解耦,并不像Struts那样与对象绑定

  2. 如果规则配置写的合理,甚至规则可以复用到多个对象

  3. 扩展验证器很简单

  4. 以Map存储验证结果,非常简单的导出JSON,只要你愿意

  5. 甚至在桌面程序中使用框架都是完美的

  6. 支持Spring

  7. 包含简单的Struts2标签

缺点

  1. 不支持国际化,未来版本支持

  2. 不适合与Bean的严格绑定

快速使用

ValidateSample.java

1public class ValidateSample { 2 /** 3 * 执行验证 4 */ 5 public void doValidate(){ 6 ... 7 } 8 /** 9 * 用户名,必须实现GETTER方法 10 */ 11 private String username; 12 public String getUsername() { 13 return username; 14 } 15 public void setUsername(String username) { 16 this.username = username; 17 } 18 public static void main(String[] args) { 19 new ValidateSample().doValidate(); 20 } 21}

doValidate方法的实现

1public void doValidate(){ 2 /* 3 * 实例化配置,默认配置在CLASSPATH下的validators.fo.xml以及rules.fo.xml两个文件中 4 */ 5 IValidateConfig config = new BasicValidateConfig(); 6 /* 7 * 实例化服务 8 */ 9 IValidateService service = new BasicValidateService(config); 10 /* 11 * 执行验证; 12 * 13 * 在执行验证之前需要在rules.fo.xml规则文件中配置好规则 14 * 15 * 需要传入两个参数, 16 * 第一个参数:需要被验证的对象,不可以为空 17 * 第二个参数:在验证规则中的 规则组代号 18 * 19 * 执行验证后返回验证结果集合,以Map形式返回 20 */ 21 Map<String,String> results = service.validate(this, "group.sample"); 22 /* 23 * 通过验证结果集是否为空来判断是否验证通过 24 */ 25 if(results.isEmpty()) { 26 System.out.println("验证通过!"); 27 } else { 28 System.err.println("验证不通过,有验证失败的项目!"); 29 /* 30 * 验证失败的字段存储在KEY中,而VALUE则是验证的失败的提示字符串 31 */ 32 Set<String> keys = results.keySet(); 33 Iterator<String> it = keys.iterator(); 34 while(it.hasNext()) { 35 String key = it.next(); 36 System.out.println(key+"(验证不通过)"); 37 System.out.println("原因:"+results.get(key)); 38 } 39 } 40}

运行结果

121:23:09,958 INFO BasicValidateConfig:44 - read validation main file , rules.fo.xml 2验证不通过,有验证失败的项目! 3username(验证不通过) 4原因:用户名必须要填写!

编写重点

  1. 读取配置,IValidateConfig config = new BasicValidateConfig();

  2. 实例化服务,IValidateService service = new BasicValidateService(config);

  3. 配置相关规则,编写rules.fo.xml文件

  4. 执行验证,service.validate(this,"group.sample");

配置文件

1<!--rules.fo.xml--> 2<?xml version="1.0" encoding="UTF-8"?> 3<fozone-validation> 4 <group name="group.sample"> 5 <field name="username"> 6 <rule name="required" message="用户名必须要填写!"/> 7 </field> 8 </group> 9</fozone-validation>

简单的例子:UserSample.java

1public class UserSample { 2 public static void main(String[] args) { 3 new UserSample().doValidate(); 4 } 5 private User user; 6 private String passwordAgain; 7 //初始化User 8 public UserSample() { 9 // TODO Auto-generated constructor stub 10 user = new User(); 11 user.setUsername("Jimmy Song"); 12 user.setPassword("123456"); 13 this.setPasswordAgain("654321"); 14 user.setEmail("jimmy.song#aliyun.com"); 15 long timestamp = Calendar.getInstance().getTimeInMillis(); 16 Timestamp starttime = new Timestamp(timestamp); 17 Timestamp endtime = new Timestamp(timestamp-1000); 18 user.setStarttime(starttime); 19 user.setEndtime(endtime); 20 } 21 //执行验证 22 public void doValidate(){ 23 ... 24 } 25}

实现验证:doValidate

1public void doValidate(){ 2 IValidateConfig config = new BasicValidateConfig(); 3 IValidateService service = new BasicValidateService(config); 4 Map<String,String> results = service.validate(this, "group.user"); 5 if(results.isEmpty()) { 6 System.out.println("验证通过!"); 7 } else { 8 System.err.println("验证不通过,有验证失败的项目!"); 9 Set<String> keys = results.keySet(); 10 Iterator<String> it = keys.iterator(); 11 while(it.hasNext()) { 12 String key = it.next(); 13 System.out.println(key+"(验证不通过)"); 14 System.out.println("原因:"+results.get(key)); 15 } 16 } 17}

输出结果

122:54:08,603 INFO BasicValidateConfig:44 - read validation main file , rules.fo.xml 222:54:08,679 INFO BasicValidateConfig:77 - read include validation file , user.fo.xml 3验证不通过,有验证失败的项目! 4user.password(验证不通过) 5原因:两次输入密码不一致 6passwordAgain(验证不通过) 7原因:两次输入密码不一致 8user.email(验证不通过) 9原因:邮件格式不正确 10user.starttime(验证不通过) 11原因:开始时间不能大于结束时间 12user.endtime(验证不通过) 13原因:结束时间不能小于开始时间

配置文件:rules.fo.xml/user.fo.xml

rules.fo.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<fozone-validation> 3 <group name="group.sample"> 4 <field name="username"> 5 <rule name="required" message="用户名必须要填写!"/> 6 </field> 7 </group> 8 <include file="user.fo.xml"/> 9</fozone-validation>

user.fo.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<fozone-validation> 3 <group name="group.user"> 4 5 <field name="user.username"> 6 <rule name="required" message="用户名必须填写"/> 7 <rule name="max" message="用户名最大20个字符"> 8 <param name="value" value="20"/> 9 </rule> 10 </field> 11 12 <field name="user.password"> 13 <rule name="required" message="密码必须填写"/> 14 <rule name="between" message="密码长度在6-20个字符之间"> 15 <param name="min" value="6"/> 16 <param name="max" value="20"/> 17 </rule> 18 <rule name="equals" message="两次输入密码不一致"> 19 <param name="target" value="passwordAgain"/> 20 </rule> 21 </field> 22 23 <field name="passwordAgain"> 24 <rule name="required" message="密码必须填写"/> 25 <rule name="between" message="密码长度在6-20个字符之间"> 26 <param name="min" value="6"/> 27 <param name="max" value="20"/> 28 </rule> 29 <rule name="equals" message="两次输入密码不一致"> 30 <param name="target" value="user.password"/> 31 </rule> 32 </field> 33 34 <field name="user.email"> 35 <rule name="required" message="邮件必须填写"/> 36 <rule name="between" message="邮件长度应该3-100之间"> 37 <param name="min" value="3"/> 38 <param name="max" value="100"/> 39 </rule> 40 <rule name="match" message="邮件格式不正确"> 41 <param name="regex" value="^[A-Za-z]+[\.\-_A-Za-z0-9]*@[A-Za-z]+[\.\-_A-Za-z0-9]*$"/> 42 </rule> 43 </field> 44 45 <field name="user.starttime"> 46 <rule name="timestampLessEqual" message="开始时间不能大于结束时间"> 47 <param name="target" value="user.endtime"/> 48 </rule> 49 </field> 50 51 <field name="user.endtime"> 52 <rule name="timestampCreaterEqual" message="结束时间不能小于开始时间"> 53 <param name="target" value="user.starttime"/> 54 </rule> 55 </field> 56 </group> 57</fozone-validation>

本文出自 “博远至静” 博客,请务必保留此出处http://sunspot.blog.51cto.com/372554/1334281

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593