作为一个前端,懂一点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 数据格式验证类的更多相关文章

  1. Java 后台验证的工具类

    Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^( ...

  2. docker 部署vsftpd服务、验证及java ftp操作工具类

    docker部署vsftpd服务 新建ftp文件存储目录/home/ftp cd /home mkdir ftp 创建一个组,用于存放ftp用户 groupadd ftpgroups 创建ftp用户, ...

  3. Java常用工具类题库

    一.    填空题 在Java中每个Java基本类型在java.lang包中都在一个相应的包装类,把基本类型数据转换为对象,其中包装类Integer是___Number__的直接子类. 包装类Inte ...

  4. JAVA 方法或者类的注释快捷键

    JAVA 方法或者类的注释快捷键 /*** 登录验证* @param 传入的* @return* @throws Exception*/这种注释效果 方法: 1.先敲“/”在敲两个**,然后回车 方法 ...

  5. 一个PHP常用表单验证类(基于正则)

    一个基于正则表达式的PHP常用表单验证类,作者:欣然随风.这个表单判断类的功能有:验证是否为指定长度的字母/数字组合.验证是否为指定长度汉字.身 份证号码验证.是否是指定长度的数字.验证邮件地址.电话 ...

  6. Java 反射 Class类

    Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...

  7. JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类

    字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...

  8. java 并发工具类CountDownLatch & CyclicBarrier

    一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...

  9. 深入分析Java的String类的方法与特点

    字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...

随机推荐

  1. Sql Server 新的日期类型

    新的日期类型:是出现在2008中的在2005中没有的日期类型. 1,Date 数据类型  2,time 数据类型  3, datetime2 数据类型  4, datetimeoffset 数据类型 ...

  2. spring boot系列03--spring security (基于数据库)登录和权限控制(上)

    这篇打算写一下登陆权限验证相关 说起来也都是泪,之前涉及权限的比较少所以这次准备起来就比较困难. 踩了好几个大坑,还好最终都一一消化掉(这是废话你没解决你写个什么劲

  3. 修改 docker image 安装目录 (解决加载大image时报错:"no space left on device")

    修改 docker image 安装目录 (解决加载大image时报错:"no space left on device" ) 基于Ubuntu16.04 docker版本: 17 ...

  4. 使用asyncsocket群聊

    #import "ViewController.h" #import "AsyncSocket.h" @interface ViewController ()& ...

  5. android UI布局

    一.设置反复背景 在drawable目录下建一个mybackground.xml文件 在文件里写入: <?xml version="1.0" encoding="u ...

  6. 我理解的malloc()和free()。

    关于malloc和free这两个函数,malloc的使用方法演示样例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一 ...

  7. 九度OJ 1205 N阶楼梯上楼问题 (DP)

    题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2817 解决:1073 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶.问有多少种上楼方式. (要 ...

  8. Springboot的默认定时任务——Scheduled注解

    本博客参考博文地址. 1.pom依赖: 引入springboot starter包即可 <dependencies> <dependency> <groupId>o ...

  9. sql对每一条记录都给他一个随机的数。

    update [WonyenMall].[dbo].[T_Real_Commodity] set increment=FLOOR(RAND(ABS(CHECKSUM(NEWID()))) * 100) ...

  10. 《调试九法——软硬件错误的排查之道》【PDF】下载

    <调试九法--软硬件错误的排查之道>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196352 内容简介 <调试九法:软硬件错 ...