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编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...
随机推荐
- Activit各个网关使用简单介绍
一.排他网关 Exclusive Gateway 排他网关又叫互斥网关,条件计算为true的顺序流会被选择继续流程,有且只有一条出口,如果出现多个条件为true,则会默认选择第一条true来执行,如果 ...
- python 3.6 urllib库实现天气爬取、邮件定时给妹子发送天气
#由于每天早上要和妹子说早安,于是做个定时任务,每天早上自动爬取天气,发送天气问好邮件##涉及模块:#(1)定时任务:windows的定时任务# 配置教程链接:http://b ...
- 黑马day16 jquery&属性过滤选择器
属性过滤选择器的过滤规则是通过元素的属性来获取对应的元素 .[attribute] 使用方法: $("div[id]") ; 返回值 集合元素 说明:匹配包括给定属性的元素.样 ...
- cocos2d-x 托付模式的巧妙运用——附源代码(一)
先来说一下托付模式是什么.以下的内容摘要自维基百科: 托付模式是软件设计模式中的一项基本技巧.在托付模式中,有两个对象參与处理同一个请求.接受请求的对象将请求托付给还有一个对象来处理.托付模式是一项基 ...
- HDU 1013.Digital Roots【模拟或数论】【8月16】
Digital Roots Problem Description The digital root of a positive integer is found by summing the dig ...
- html5 canvas 画板
<!doctype html> <head> <meta http-equiv="Content-Type" content="text/h ...
- 浏览器正确理解和使用GBK及UTF-8(UTF-8 + BOM)网页编码
网页编码英文译为web page encoding.是在网页中指定其特定的字符编码格式的库. GBK是国家标准GB2312基础上扩容后兼容GB2312的标准. GBK的文字编码是用双字节来表示的.即不 ...
- Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit
Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit,没有Windows x86-64bit的 详细请见例如以下的certificat ...
- flask框架-decorator装饰器
调用包: from functools import wraps 装饰器其实就是一个函数:参数是一个函数,返回值是一个函数 1.装饰器使用是通过@符号,在函数的上面 2.装饰器中定义的函数,要使用*a ...
- Lvs+keepAlived实现负载均衡高可用集群(DR实现)
第1章 LVS 简介 1.1 LVS介绍 LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能. ...