作為一個前端,懂一點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); } }