java 数据格式验证类-阿里云开发者社区

开发者社区> 淡色的云> 正文

java 数据格式验证类

简介: 作为一个前端,懂一点java,php之类的,甚好。 我所在的项目前端采用的就是java的spring mvc框架,所以我们也写java,掐指一算,也快一年了。 前端而言,验证是一个坎,绕不过去的,前面的页面得验证,提交到java这边也是需要验证的,接口那边也会进行验证,三层验证,按需来分配。
+关注继续查看

作为一个前端,懂一点java,php之类的,甚好。

我所在的项目前端采用的就是java的spring mvc框架,所以我们也写java,掐指一算,也快一年了。

前端而言,验证是一个坎,绕不过去的,前面的页面得验证,提交到java这边也是需要验证的,接口那边也会进行验证,三层验证,按需来分配。

最常见的验证的一种就是数据格式的验证,比如为空,手机号,邮箱,中文等等。

前端的验证好办,引入jquery.validator,额外的配置一下,就ok了。

当然jquery正逐渐的离我们远去,新兴的vue,react,angular都有自己的验证类或者包。

项目刚开始是从php改版过来的,虽说不了解php,但不得不说,php的全局方法异常强大。验证这块采取了基于laravel自带的,相对比较方便。

java这边自己搜索了,没有搜索到比较好而精简的验证辅助类,参考Laravel思想,自己写一个相对比较简单的验证类吧。

 

思想:

1. 把前台传输的数据,变为JSONObject,这种简单的键值对。

2. 配置验证,如下面的格式,

key是需要验证的键,

value是要进行的验证

{
     'bankId':'required',
     'cardNumber':'required|is_bank_card',
     'provinceValue':'required',
     'cityValue':'required',        
'description': 'required|max:250' }

3. 配置消息提示

           {
            'bankId.required':'开户行是必填项',
            'cardNumber.required':'银行卡号是必填项',
            'cardNumber.is_bank_card':'请输入正确的银行卡号',
            'provinceValue.required':'请选择开户省',
            'cityValue.required':'请选择开户市',
            'branchOffice.required':'支行名称是必填项',    
       'description.max':'做多输入250个字符'
}

4. 进行验证,最简单的键值遍历,引用反射执行验证方法

直接上代码了,约160行

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import net.sf.json.JSONObject;

public class Validators {    
    /**
     * 数据格式
     * 
     * {
     *         bankId:4545454,
     *         cardNumber : 454545
     *         provinceValue:哈哈
     * }
     * 
     * 
     * 需要匹配的配置
     * {
     *      'bankId':'required',
            'cardNumber':'required|is_bank_card',
            'provinceValue':'required',
            'cityValue':'required',      
            'description': 'required|max:250'
            
         }   
           匹配失败的信息格式
           {
               'bankId.required':'开户行是必填项',
            'cardNumber.required':'银行卡号是必填项',
            'cardNumber.is_bank_card':'请输入正确的银行卡号',
            'provinceValue.required':'请选择开户省',
            'cityValue.required':'请选择开户市',   
            'description.max':'做多输入250个字符' 
           }    
     * @return
     */
    
    public static JSONObject make(JSONObject data,JSONObject rules , JSONObject messages){    
        JSONObject retObj = new JSONObject();
        String retMessages  = "";
        //如果为空直接返回
        if(data == null || rules == null ||messages == null){
            retObj.put("passes", false);
            return retObj;
        }
        
        Iterator it = data.keys();
        String key, value,message,methodNames,realMethodName;
        Method method;        
        String[] methods;
        boolean success = false;
        Validators vu = new Validators();
        while(it.hasNext()){
            try{            
                //当前的key
                key = (String)it.next();            
                //当前的值
                value = data.getString(key);            
                //当前key对应的检验方法,
                if(rules.has(key)){
                    methodNames = rules.getString(key);                
                    methods = methodNames.split("\\|");
                    for(String methodName:methods ){
                        realMethodName = methodName;
                        if(methodName.split(":").length >=2){
                            //处理函数名称 min:6, maxLength:250
                            //真正的名字应该是:前面部分,后面部分属于参数
                            realMethodName =  methodName.split(":")[0];
                            method = vu.getClass().getMethod(realMethodName, String.class,String.class);    
                            //第一个参数是值,第二个参数是对比参考的参数
                            success =(Boolean) method.invoke(vu, value,methodName.split(":")[1]);
                        }else{
                            //处理只有一个参数的验证
                            method = vu.getClass().getMethod(realMethodName, String.class);            
                            success =(Boolean) method.invoke(vu, value);
                        }
                        if(!success){
                            //获得当前key对应验证失败对应的消息,如果未配置错误信息,不添加错误信息
                            if(messages.has(key + "." + realMethodName)){
                                message =messages.getString(key + "." + realMethodName );    
                                retMessages += StringUtils.isBlank(retMessages)? message:";#" + message;
                            }
                        }
                    }
                }else{//如果未定义规则,继续
                    continue;
                }            
            }catch(Exception ex){
                String em = ex.getMessage();
                ex.printStackTrace();        
                //retObj.put("passes", false);
                //return retObj;
            }            
        }
        
        //TODO::不能依据retMessages来识别
        retObj.put("messages", retMessages);
        retObj.put("passes", StringUtils.isBlank(retMessages)?true:false);
        return retObj;
    }    
    
        
    /**
     * 必须填写
     * @param value
     * @return
     */
    public static boolean required (String value){
        if(value == null || "".equals(value.trim())){
            return false;
        }
        return true;
    }
    
    /**
     * 手机号码
     * @param value
     * @return
     */
    public static boolean mobile_phone(String value){
        return match("^1(3\\d|4(7)|5(0|1|2|3|5|6|7|8|9)|7(0|3|6|7|8)|8\\d)\\d{8}$" ,value);
    }    
    
    /**
    * @param regex 正则表达式字符串
    * @param str 要匹配的字符串
    * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
    */
    public static boolean match(String regex, String str) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }
    
    
    public static void main(String[] args){
        JSONObject data = new JSONObject();
        data.put("name", "dsds");
        
        JSONObject rules = new JSONObject();
        rules.put("name", "required|mobile_phone");
        
        JSONObject messages = new JSONObject();
        messages.put("name.required", "必须有值");
        messages.put("name.mobile_phone", "非法手机号码");
        
        JSONObject result  = make(data,rules,messages);
    } 
    
}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9494 0
Java高级之数据格式化
Labmda表达式: Runnable runnable =new Runnable(){     public void run(){         //123         } } 变: Runnable runnable =()->{         //123     } “123”为多句代码,可以写上括号,如果仅一句,可以不写。
1076 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11208 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13177 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11507 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6891 0
+关注
淡色的云
不争不弃,喜欢淡色的云。
55
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载