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

Wesley13
• 阅读 667

下载地址

  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

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(验证不通过)
原因:用户名必须要填写!

编写重点

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

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

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

  4. 执行验证,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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
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
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
Python 环境搭建
pythonbug集目录\toc\00python模块下载地址pyhton模块下载地址(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.lfd.uci.edu%2F%7Egohlke%2Fpythonlibs%2F)01pythonpip
Stella981 Stella981
3年前
Golang注册Eureka的工具包goeureka发布
1.简介提供Go微服务客户端注册到Eureka中心。点击:github地址(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2FSimonWang00%2Fgoeureka),欢迎各位多多star!(已通过测试验证,用于正式生产部署)2.原理
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这