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

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

转载于:https://my.oschina.net/41zone/blog/318369

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值