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编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...
随机推荐
- Arrays.asList()生成的List抛UnsupportedOperationException分析
一.背景:使用工具类 Arrays.asList()把数组转换成集合时,使用其修改集合相关的方 法,它的 add/remove/clear 方法会抛出 UnsupportedOperationExce ...
- 》》QQ-注册
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PMP杂谈--PMP中一些easy忽视的地方
识别干系人:这个过程是持续的,在整个项目的生命周期中都要持续识别干系人. 组织过程资产和事业环境因素:这两个东西在过程的输入中似乎常常看到,但有时候又看不到,不要纠结了 ,不要浪费脑细胞去背诵哪个有, ...
- Javascript 方法apply和call的差别
call与aplly都属于Function.prototype的一个方法.所以每一个function实例都有call.apply属性 同样点: call()方法和apply()方法的作用同样: 改变原 ...
- 【转载】Java 类加载与初始化
原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在J ...
- Java 常量池存放的是什么
public class Test{ Integer i1 = 127 ; // 常量池本来就有,直接饮用常量池. String s1 = new String("aaaa"); ...
- Xcode中StoryBoard Reference 新特性的使用
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- .net WCF简单实例
最近看到网上招聘有许多都需要WCF技术的人员,我之前一直没接触过这个东西,以后工作中难免会遇到,所谓笨鸟先飞,于是我就一探究竟,便有了这边文章.由于是初学WCF没有深入研究其原理,只是写了一个demo ...
- 《HelloGitHub》第 21 期
公告 元旦快乐! <HelloGitHub>第 21 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编 ...
- Hive实际应用小结
1.简介 Hive是数据仓库平台,构建在Hadoop之上用来处理结构化数据.Hive是一个SQL解析引擎,能够将SQL语句转化成MapReduce作业并在Hadoop上执行,从而使得查询和分析更加方便 ...