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);
    } 
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM