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通过类加载器和字节码校验器来防止未授权的类加载和代码执行。 5. 高性能 尽管Java最初因为其解释执行方式而受到性能方面的质疑,但随着JIT(Just-In-Time)编译器技术的发展,Java的执行效率得到了大幅...
- **发展**: 1994年以来,Java语言逐渐向网络应用方向发展,其类库不断丰富,性能持续提升,应用领域不断扩展。 - **应用**: Java适用于开发各类应用,尤其在网络应用、嵌入式系统等领域表现突出。 #### 二、Java...
Java的面向对象特性使其非常适合构建大型复杂系统,通过类、对象和接口来组织代码,确保代码的模块化和可扩展性。 2. **MVC设计模式** 为了实现良好的代码结构和职责分离,Java医院管理系统通常采用Model-View-...
安全性:Java有严格的代码安全性检查机制,包括类装载器和字节码校验器,确保代码在执行时不会对系统造成恶意破坏,如非法的文件访问。 内存管理:Java自动进行垃圾回收,程序员无需手动释放内存,这避免了内存泄漏...
4. 稳定性和安全性:Java语言的内存管理机制(如自动垃圾回收)和安全模型(例如类加载器和字节码校验器)可以降低许多常见的编程错误和安全漏洞。 5. 强大的社区和生态系统:Java有着庞大的开发者社区,以及广泛...
4. **字节码校验器**:字节码校验器是JVM的一部分,用于在类装载时检查字节码是否符合Java语言规范,防止恶意代码执行。 5. **解释器**:解释器将字节码转换成机器可以理解的指令,逐条执行。在现代JVM中,如...
在Java编程环境中,这种设计模式常用于构建可扩展、易于维护的Web应用程序。下面我们将详细探讨MVC模式、Java开发以及资源管理的相关知识点。 1. **模型-视图-控制器(MVC)模式**: MVC模式是一种软件设计模式,...
此外,Java还提供了类加载器、安全管理器、字节码校验器等机制,确保了程序运行的安全性。 Java在企业应用中广泛使用,尤其在服务器端的Web应用、大数据处理以及企业级应用中,Java凭借其成熟的生态系统和丰富的第...
- **代码验证**:Java虚拟机中的字节码校验器确保了代码的完整性和安全性,防止伪造的指针、访问权限违规等问题。 - **内存管理**:Java自动管理内存,避免了常见的内存泄漏问题。 - **权限限制**:Java提供了丰富的...
Java的安全模型包括字节码校验器、类加载器以及安全管理器等,可以防止恶意代码的运行。通过这些机制,Java为开发安全的应用程序提供了坚实的基础。 4. 自动垃圾回收:Java拥有自动的垃圾回收机制,这意味着程序员...
4. **安全性**:Java有强大的安全机制,包括编译器检查、字节码校验和类加载器,确保程序安全运行。 5. **健壮性**:Java的自动内存管理(垃圾收集)和异常处理机制有助于构建稳定的应用。 6. **体系结构中立和可...
9. **持续集成**:将接口测试集成到持续集成/持续部署(CI/CD)流程中,每次代码提交后自动运行测试,及时发现并修复问题。 在进行Java接口测试时,可以使用各种工具和库,如Apache HttpClient、OkHttp、Feign等...
此外,还可以利用Java的过滤器(Filter)进行请求校验和恶意代码防护。 5. 数据库管理:Java与各种数据库系统兼容良好,如Oracle、MySQL、PostgreSQL等。使用JPA(Java Persistence API)或Hibernate ORM工具,可以...
Struts2的拦截器机制使得我们可以方便地添加自定义的行为,如权限验证、数据校验等。 Hibernate作为持久化框架,简化了数据库操作。它提供了一种对象-关系映射(ORM)机制,将Java对象与数据库表进行对应,使得...
《Java开发手册(泰山版)》是Java编程领域的一部权威指南,由阿里巴巴集团精心编纂,旨在提高Java开发人员的编码质量和效率。该手册的灵魂13问,深入探讨了在实际开发过程中可能会遇到的关键问题及其解决方案。以下...
Java的JDBC(Java Database Connectivity)API使得与各种数据库系统交互变得简单。 3. **消息传输**:实时消息传递是通过客户端和服务器之间的持续连接完成的。Java的Socket类和ServerSocket类是实现这一功能的基础...
《深入剖析Java网上商城源码》 在信息技术日新月异的今天,电子商务已经成为商业活动的重要组成部分,而作为支撑其背后的强大技术之一,Java语言在构建网上商城系统方面发挥着至关重要的作用。本文将深入探讨基于...
Java Comm API 提供了与硬件串口进行交互的能力,包括打开、关闭串口,设置波特率、数据位、停止位和校验位等。这个API主要包含两个核心类:`CommPortIdentifier`用于识别可用的串口,以及`SerialPort`类,提供了...