作为一个前端,懂一点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. python爬虫(六)_urllib2:handle处理器和自定义opener

    本文将介绍handler处理器和自定义opener,更多内容请参考:python学习指南 opener和handleer 我们之前一直使用的是urllib2.urlopen(url)这种形式来打开网页 ...

  2. Python爬虫(十四)_BeautifulSoup4 解析器

    CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据. lxml只会局部遍历,而B ...

  3. JavaScript实现八大内部排序算法

    注:基数排序中:r是关键字的基数,d是长度,n是关键字的个数 1.插入排序 基本思想:在序号i之前的元素(0到i-1)已经排好序,本趟需要找到i对应的元素x (此时即arr[i]) 的正确位置k,在寻 ...

  4. DocFX生成PDF文档

    使用DocFX生成PDF文档,将在线文档转换为PDF离线文档. 关于DocFX的简单介绍使用DocFX生成文档 使用docfx 命令 1.下载 https://github.com/dotnet/do ...

  5. F12调试模式下使用console自动提交

    F12调试模式下使用console自动提交(F12 的console->输入代码->按enter即可运行) 1.使用定时器setInterval进行自动提交 //方法中可使用jquery调 ...

  6. 使用javascript正则表达式实现遍历html字符串

    最近在尝试实现一个js模板引擎,其中涉及到使用js解析html字符串的功能.由于我实现的这个模板不止是要能替换参数输出html字符串,还要可以解析出每个dom元素的名称及参数啥的. 网上找到了一个叫做 ...

  7. 传统controller与controllerAs

    传统controller与controllerAs(前面为传统,后面为controllerAs,分割线分隔): 路由模块: .state('home.packing', { url: '/packin ...

  8. Maven版本号中隐藏的惊天大秘密

    一.背景 现在主流的Java系的互联网公司里,绝大多数公司都使用Maven作为依赖管理工具,一般我们对于依赖的版本号,常见两种类型:一种以“-RELEASE”结尾,另一种以“-SNAPSHOT”结尾. ...

  9. 数据库、ArcCatalog空间数据源正常访问,数据库设置没问题时,ArcEngine连接SDE时报"ORA-12560: TNS: 协议适配器错误"的解决办法;ArcEngine连接SDE总结

    碰到的问题描述: 通过C# 基于ArcEngine写SDE直连的时候测试项目连接属性设置为如下: tPropSet.SetProperty("User", "GISDAT ...

  10. 让你用sublime写出最完美的python代码--windows环境

    至少很长一段时间内,我个人用的一直是pycharm,也感觉挺好用的,也没啥大毛病 但是pycharm确实有点笨重,啥功能都有,但是有很多可能这辈子我也不会用到,并且pycharm打开的速度确实不敢恭维 ...