`
eyeruby
  • 浏览: 2303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java简单校验器,持续扩展

阅读更多
package demo.validate;

import java.util.ArrayList;
import java.util.List;

public class Validation {

	public static void main(String[] args) {
		String msg = null;
		// validate one text
		msg = Validation.newInstance().addText("123456").addRule(
				RuleType.NOT_EMPTY).addRule(RuleType.LENGTH, 3).addRule(
				RuleType.NUMBER, 0, 123458).addRule(RuleType.NUMERIC_STRING,
				"123450", "123490").addRule(new Rule() {

			@Override
			public String validate(String text) {
				// validate if the number is odd
				if (Integer.parseInt(text) % 2 == 0) {
					return String.format("%s is not an odd number", text);
				}
				return null;
			}
		}).validate();
		System.out.println(msg);

		// validate batch text by same rule
		Validation instance = Validation.newInstance().addRule(
				RuleType.NOT_EMPTY).addRule(RuleType.LENGTH, 3).addRule(
				RuleType.NUMBER, 0, 123458);
		String[] batch = new String[10];
		for (int i = 0; i < batch.length; i++) {
			batch[i] = "12345" + i;
		}
		for (int i = 0; i < batch.length; i++) {
			String result = instance.addText(batch[i]).validate();
			System.out.println(String.format("text:%s,validate result:%s",
					batch[i], result));
		}
	}

	private static final String NUMBER_REGEX = "([1-9]\\d*)|(0)";
	private static final String NUMERIC_STRING_REGEX = "\\d+";

	public enum RuleType {
		NOT_EMPTY, LENGTH, NUMERIC_STRING, NUMBER, REGEX
	}

	public interface Rule {
		String validate(String text);
	}

	private String text;
	private List<Rule> items = new ArrayList<Rule>();

	private Validation() {

	}

	public static Validation newInstance() {
		return new Validation();
	}

	public Validation addText(String text) {
		return addText(text, true);
	}

	public Validation addText(String text, boolean trim) {
		this.text = text;
		if (trim) {
			if (this.text != null) {
				this.text.trim();
			}
		}
		return this;
	}

	public Validation addRule(Rule rule) {
		items.add(rule);
		return this;
	}

	public Validation addRule(RuleType rule) {
		items.add(new CommonRule(rule));
		return this;
	}

	public Validation addRule(RuleType rule, Object... params) {
		items.add(new CommonRule(rule, params));
		return this;
	}

	public String validate() {
		return Validation.validate(this.text, this.items);
	}

	private class CommonRule implements Rule {
		private RuleType rule;
		private Object[] params = null;

		private CommonRule() {

		}

		private CommonRule(RuleType rule) {
			this.rule = rule;
		}

		private CommonRule(RuleType rule, Object... params) {
			this.rule = rule;
			this.params = params;
		}

		public RuleType getRule() {
			return rule;
		}

		public Object[] getParams() {
			return params;
		}

		@Override
		public String validate(String text) {
			return Validation.validate(text, this);
		}
	}

	public static String validate(String text, List<Rule> rules) {
		Rule[] items = null;
		if (rules != null && !rules.isEmpty()) {
			items = rules.toArray(new Rule[rules.size()]);
		}
		return validate(text, items);
	}

	public static String validate(String text, Rule[] rules) {
		if (rules == null) {
			return null;
		}
		String res = null;
		for (int i = 0; i < rules.length; i++) {
			Rule validator = rules[i];
			if (validator == null) {
				continue;
			}
			res = validator.validate(text);
			if (res != null) {
				break;
			}
		}
		return res;
	}

	private static String validate(String text, CommonRule rule) {
		String res = null;
		RuleType ruleType = rule.getRule();
		Object[] params = rule.getParams();
		if (ruleType == RuleType.NOT_EMPTY) {
			if ((res = validateEmpty(text)) != null) {
				return res;
			}
		}
		if (ruleType == RuleType.LENGTH) {
			int min = 0;
			int max = 0;
			if (params != null) {
				if (params.length > 0) {
					min = (Integer) params[0];
					if (params.length > 1) {
						max = (Integer) params[1];
					}
				}
			}
			if ((res = validateLength(text, min, max)) != null) {
				return res;
			}
		}
		if (ruleType == RuleType.NUMERIC_STRING) {
			String min = null;
			String max = null;
			if (params != null) {
				if (params.length > 0) {
					min = (String) params[0];
					if (params.length > 1) {
						max = (String) params[1];
					}
				}
			}
			if ((res = validateNumericString(text, min, max)) != null) {
				return res;
			}
		}
		if (ruleType == RuleType.NUMBER) {
			int min = 0;
			int max = 0;
			if (params != null) {
				if (params.length > 0) {
					min = (Integer) params[0];
					if (params.length > 1) {
						max = (Integer) params[1];
					}
				}
			}
			if ((res = validateNumber(text, min, max)) != null) {
				return res;
			}
		}
		if (ruleType == RuleType.REGEX) {
			if ((res = validateRegex(text, (String) params[0])) != null) {
				return res;
			}
		}
		return null;
	}

	public static String validateEmpty(String text) {
		if (text == null || text.isEmpty()) {
			return text + " is empty";
		}
		return null;
	}

	public static String validateNumericString(String text, String min,
			String max) {
		if (!text.matches(NUMERIC_STRING_REGEX)) {
			return text + " is not a numeric string";
		}
		String msg = "";
		if (min != null) {
			msg = " more than " + min;
		}
		if (max != null) {
			msg += (msg.length() == 0 ? "" : " and ") + " less than " + max;
		}
		msg = text + " is invalid, should be" + msg;
		if (min != null && text.compareTo(min) < 0) {
			return msg;
		}
		if (max != null && text.compareTo(max) > 0) {
			return msg;
		}
		return null;
	}

	public static String validateNumber(String text, int min, int max) {
		if (!text.matches(NUMBER_REGEX)) {
			return text + " is not a number";
		}
		int number = Integer.parseInt(text);
		String msg = "";
		if (min > 0) {
			msg = " more than " + min;
		}
		if (max > 0) {
			msg += (msg.length() == 0 ? "" : " and ") + " less than " + max;
		}
		if (msg.length() == 0) {
			return null;
		}
		msg = text + " is invalid, should be" + msg;
		if (min > 0 && number < min) {
			return msg;
		}
		if (max > 0 && number > max) {
			return msg;
		}
		return null;
	}

	public static String validateLength(String text, int minLength,
			int maxLength) {
		int length = text.length();
		String msg = "";
		if (minLength > 0) {
			msg = " more than " + minLength;
		}
		if (maxLength > 0) {
			msg += (msg.length() == 0 ? "" : " and ") + " less than "
					+ maxLength;
		}
		if (msg.length() == 0) {
			return null;
		}
		msg = text + " is invalid, the length should be" + msg;
		if (minLength > 0 && length < minLength) {
			return msg;
		}
		if (maxLength > 0 && length > maxLength) {
			return msg;
		}
		return null;
	}

	public static String validateRegex(String text, String regex) {
		if (text.matches(regex)) {
			return null;
		}
		return text + " is invalid";
	}

	public static String validate(String text, Rule validator) {
		if (validator == null) {
			return null;
		}
		return validator.validate(text);
	}

}

123456 is not an odd number
text:123450,validate result:null
text:123451,validate result:null
text:123452,validate result:null
text:123453,validate result:null
text:123454,validate result:null
text:123455,validate result:null
text:123456,validate result:null
text:123457,validate result:null
text:123458,validate result:null
text:123459,validate result:123459 is invalid, should be less than 123458
分享到:
评论

相关推荐

    计算机软件Java编程特点分析.pdf

    此外,Java通过类加载器和字节码校验器来防止未授权的类加载和代码执行。 5. 高性能 尽管Java最初因为其解释执行方式而受到性能方面的质疑,但随着JIT(Just-In-Time)编译器技术的发展,Java的执行效率得到了大幅...

    java讲义(入门基础)

    - **发展**: 1994年以来,Java语言逐渐向网络应用方向发展,其类库不断丰富,性能持续提升,应用领域不断扩展。 - **应用**: Java适用于开发各类应用,尤其在网络应用、嵌入式系统等领域表现突出。 #### 二、Java...

    java 医院管理系统

    Java的面向对象特性使其非常适合构建大型复杂系统,通过类、对象和接口来组织代码,确保代码的模块化和可扩展性。 2. **MVC设计模式** 为了实现良好的代码结构和职责分离,Java医院管理系统通常采用Model-View-...

    课程代码:JAVA-PL)JAVA程序设计课程讲义-打印版本(不含图形)

    安全性:Java有严格的代码安全性检查机制,包括类装载器和字节码校验器,确保代码在执行时不会对系统造成恶意破坏,如非法的文件访问。 内存管理:Java自动进行垃圾回收,程序员无需手动释放内存,这避免了内存泄漏...

    探析JAVA编程语言在计算机软件开发中的应用.pdf

    4. 稳定性和安全性:Java语言的内存管理机制(如自动垃圾回收)和安全模型(例如类加载器和字节码校验器)可以降低许多常见的编程错误和安全漏洞。 5. 强大的社区和生态系统:Java有着庞大的开发者社区,以及广泛...

    JAVA 语言的特点.docx

    4. **字节码校验器**:字节码校验器是JVM的一部分,用于在类装载时检查字节码是否符合Java语言规范,防止恶意代码执行。 5. **解释器**:解释器将字节码转换成机器可以理解的指令,逐条执行。在现代JVM中,如...

    基于MVC的Java资源管理器 v2.0

    在Java编程环境中,这种设计模式常用于构建可扩展、易于维护的Web应用程序。下面我们将详细探讨MVC模式、Java开发以及资源管理的相关知识点。 1. **模型-视图-控制器(MVC)模式**: MVC模式是一种软件设计模式,...

    基于计算机软件开发的Java编程语言分析.pdf

    此外,Java还提供了类加载器、安全管理器、字节码校验器等机制,确保了程序运行的安全性。 Java在企业应用中广泛使用,尤其在服务器端的Web应用、大数据处理以及企业级应用中,Java凭借其成熟的生态系统和丰富的第...

    武汉大学Java培训讲义

    - **代码验证**:Java虚拟机中的字节码校验器确保了代码的完整性和安全性,防止伪造的指针、访问权限违规等问题。 - **内存管理**:Java自动管理内存,避免了常见的内存泄漏问题。 - **权限限制**:Java提供了丰富的...

    计算机软件JAVA编程特点及其技术分析 (2).pdf

    Java的安全模型包括字节码校验器、类加载器以及安全管理器等,可以防止恶意代码的运行。通过这些机制,Java为开发安全的应用程序提供了坚实的基础。 4. 自动垃圾回收:Java拥有自动的垃圾回收机制,这意味着程序员...

    JAVA介绍

    4. **安全性**:Java有强大的安全机制,包括编译器检查、字节码校验和类加载器,确保程序安全运行。 5. **健壮性**:Java的自动内存管理(垃圾收集)和异常处理机制有助于构建稳定的应用。 6. **体系结构中立和可...

    java接口测试

    9. **持续集成**:将接口测试集成到持续集成/持续部署(CI/CD)流程中,每次代码提交后自动运行测试,及时发现并修复问题。 在进行Java接口测试时,可以使用各种工具和库,如Apache HttpClient、OkHttp、Feign等...

    345_Java电子政务系统_网站调查_便民信息服务系统.rar

    此外,还可以利用Java的过滤器(Filter)进行请求校验和恶意代码防护。 5. 数据库管理:Java与各种数据库系统兼容良好,如Oracle、MySQL、PostgreSQL等。使用JPA(Java Persistence API)或Hibernate ORM工具,可以...

    CRM客户信息系统(Java+SSH三大框架)

    Struts2的拦截器机制使得我们可以方便地添加自定义的行为,如权限验证、数据校验等。 Hibernate作为持久化框架,简化了数据库操作。它提供了一种对象-关系映射(ORM)机制,将Java对象与数据库表进行对应,使得...

    《〈Java开发手册(泰山版)〉灵魂13问》

    《Java开发手册(泰山版)》是Java编程领域的一部权威指南,由阿里巴巴集团精心编纂,旨在提高Java开发人员的编码质量和效率。该手册的灵魂13问,深入探讨了在实际开发过程中可能会遇到的关键问题及其解决方案。以下...

    即时通信系统(Java实现)

    Java的JDBC(Java Database Connectivity)API使得与各种数据库系统交互变得简单。 3. **消息传输**:实时消息传递是通过客户端和服务器之间的持续连接完成的。Java的Socket类和ServerSocket类是实现这一功能的基础...

    java开发的网上商城源码

    《深入剖析Java网上商城源码》 在信息技术日新月异的今天,电子商务已经成为商业活动的重要组成部分,而作为支撑其背后的强大技术之一,Java语言在构建网上商城系统方面发挥着至关重要的作用。本文将深入探讨基于...

    Java实现串口通信.pdf

    Java Comm API 提供了与硬件串口进行交互的能力,包括打开、关闭串口,设置波特率、数据位、停止位和校验位等。这个API主要包含两个核心类:`CommPortIdentifier`用于识别可用的串口,以及`SerialPort`类,提供了...

Global site tag (gtag.js) - Google Analytics