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);
} }
java 数据格式验证类的更多相关文章
- Java 后台验证的工具类
Java 后台验证的工具类 public class ValidationUtil { //手机号 public static String mobile = "^( ...
- docker 部署vsftpd服务、验证及java ftp操作工具类
docker部署vsftpd服务 新建ftp文件存储目录/home/ftp cd /home mkdir ftp 创建一个组,用于存放ftp用户 groupadd ftpgroups 创建ftp用户, ...
- Java常用工具类题库
一. 填空题 在Java中每个Java基本类型在java.lang包中都在一个相应的包装类,把基本类型数据转换为对象,其中包装类Integer是___Number__的直接子类. 包装类Inte ...
- JAVA 方法或者类的注释快捷键
JAVA 方法或者类的注释快捷键 /*** 登录验证* @param 传入的* @return* @throws Exception*/这种注释效果 方法: 1.先敲“/”在敲两个**,然后回车 方法 ...
- 一个PHP常用表单验证类(基于正则)
一个基于正则表达式的PHP常用表单验证类,作者:欣然随风.这个表单判断类的功能有:验证是否为指定长度的字母/数字组合.验证是否为指定长度汉字.身 份证号码验证.是否是指定长度的数字.验证邮件地址.电话 ...
- Java 反射 Class类
Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- java 并发工具类CountDownLatch & CyclicBarrier
一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...
- 深入分析Java的String类的方法与特点
字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...
随机推荐
- 数据结构与算法(C/C++版)【树与二叉树】
第六章<树与二叉树> 树结构是一种非线性存储结构,存储的是具有"一对多"关系的数据元素的集合. 结点: A.B.C等,结点不仅包含数据元素,而且包含指向子树的分支.例如 ...
- poj 1035KINA Is Not Abbreviation
题目链接:http://poj.org/problem?id=4054 本题的题意是在下面那部分待检验的单词中找到与之相对应的正确的代词,包含几种情况,一是全部字母相同,二是有一个字母不相同,三是多一 ...
- html Embed用法 页面播放视频
一句话概括所有问题.查资料说在页面播放视频都是一些插件 刚发现一个Html自带的标签 很吊的样子 <div > <embed src="${compla ...
- js图片懒加载(滚动加载)是否生效
一.什么是懒加载? 对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载. 二.为什么使用懒加载? 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 理论性知识大家都有自 ...
- ps的快捷键
最近学习了一些ps切图,总结一些快捷键,以免自己忘记,总结的不好,也可能不全,忘大牛指点,试着坚持总结 1.工具箱 (多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取) 矩形.椭圆选框工具 ...
- Android Studio怎样选择查看指定进程的log?
今天说一个简单的东东,关于Android Studio在logcat中怎样查看指定进程的log. 关于过滤你自己所开发的应用的log.在这篇文章中:Android Studio怎样给log加入过滤项( ...
- Android-Dalvik指令集
转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/40821777 原文:http://pallergabor.uw.hu/and ...
- 产品研发管理(二):使用SubVersion进行代码管理
概述 这是产品研发管理系列文章的第二篇:使用SubVersion进行代码管理. 介绍如何使用SubVersion的资料已经许多,这里不准备介绍如何使用SubVersion. 这篇文章主要介绍如何进行代 ...
- 多域名环境,页面获取url的一种方案
因为系统是分布式部署的.而且有多个域名,所以常常涉及到获取url的问题. 这是系统框架层面须要提供的能力.否则每一个模块都须要自己去想办法获取ip,就会非常混乱.上线也easy发生bug 主要须要解决 ...
- 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...