回顾过往,让让我们一起考古Apache Commons Validator

回顾过往,让让我们一起考古Apache Commons Validator_第1张图片

一、概述

  在基于B/S架构实现的Web应用系统开发实现中,为了能够获得正确和有效的用户表单请求的参数值,在进行业务处理之前都需要对接收的表单数据进行检查和验证。有时编程花的时间最多的就是考虑各种异常情况带来的问题,反而正常的功能很快就可以开发完,参数非法校验是一个普通不能再普通的需求了,如果不对请求参数校验,假如参数随便传递,那可能会带来一系列问题。
  为了简化开发人员的服务器端程序验证的代码,实现和减少对通用验证逻辑的代码实现工作,在Commons组件集中还提供有一个Commons-Validator数据验证器组件,帮助开发人员实现通用验证逻辑的程序代码编程实现,避免重复地编程实现通用验证逻辑的程序代码——比如验证Email字符串、日期字符串等是否满足合法的格式要求。

  • org.apache.commons.validator
    • Validator 包提供基于 xml 文件的 JavaBean 验证
  • org.apache.commons.validator.routines
    • 包含独立的验证器
  • org.apache.commons.validator.util
    • 包含 Commons Validator 使用的实用程序类

二、validator 包

2.1 GenericValidator

  该类主要完成通用的数据验证逻辑——如数据是否为空、数据的长度是否满足要求、是否为某种类型的数据值、输入的数据值的范围等。而这些验证功能都是通过GenericValidator类中的各种静态成员方法实现的。在 GenericValidator 类中提供有如下的几个主要的成员方法:

方法 说明
boolean isBlankOrNull(String value) 验证是否为空或者null 对象
boolean isCreditCard(String value) 信用卡验证
boolean isDate(String value, Locale locale) 验证是否为符合日期格式的输入
boolean isDouble(String value) 是否可以转成 double
boolean isEmail(String value) 验证是否为合法的Email
boolean isFloat(String value) 是否可以转成 float
boolean isInRange(int value, int min, int max) 验证输入的数据值是否在某个特定的范围之内
boolean isInt(String value) 是否可以转成 int
boolean isLong(String value) 是否可以转成 long
boolean isShort(String value) 是否可以转成 short
boolean isUrl(String value) 是否URL格式
boolean matchRegexp(String value, String regexp 是否对应正则匹配的规则
boolean maxLength(String value, int max) 是否为最大长度
boolean maxValue(int value, int max) 是否为最大值
boolean minLength(String value, int min) 是否为最小长度
boolean minValue(int value, int min) 是否为最小值
@Test
public void CommonsValidatorTest() {
   // null 或 空
   System.out.println(GenericValidator.isBlankOrNull(""));
   System.out.println(GenericValidator.isBlankOrNull(null));

   // int,其他类型一样:byte,short,float,double,long
   System.out.println(GenericValidator.isInt("1"));

   // 日期
   System.out.println(GenericValidator.isDate("20200829", "yyyyMMdd", true));

   // int 在指定范围内,其他类型一样:byte,short,float,double,long
   System.out.println(GenericValidator.isInRange(1, 0, 2));

   // int 最大最小,其他类型一样:float,double,long
   System.out.println(GenericValidator.minValue(1, 1));
   System.out.println(GenericValidator.maxValue(1, 1));

   // 字符串 最大最小长度
   System.out.println(GenericValidator.maxLength("daodaotest", 10));
   System.out.println(GenericValidator.minLength("daodaotest", 10));

   // 正则表达式
   System.out.println(GenericValidator.matchRegexp("daodaotest", "^d.*t$"));

   // 信用卡验证
   System.out.println(GenericValidator.isCreditCard("6227612145830440"));

   // url
   System.out.println(GenericValidator.isUrl("http://www.baidu.com"));

   // email
   System.out.println(GenericValidator.isEmail("[email protected]"));
}

三、validator.routines 包

3.1 CalendarValidator

日历验证器

方法 说明
CalendarValidator getInstance() 获取 CalendarValidator 类的对象实例
int compareDates(Calendar value, Calendar compare) 比较两个日历的日、月和年。
 相等返回 0、小于返回-1、大于返回 +1
int compareMonths(Calendar value, Calendar compare) 比较两个日历的月份和年份。
 相等返回 0、小于返回-1、大于返回 +1
int compareQuarters(Calendar value, Calendar compare) 比较两个日历的季度和年份。
 相等返回 0、小于返回-1、大于返回 +1
int compareWeeks(Calendar value, Calendar compare) 比较两个日历的周和年。
 相等返回 0、小于返回-1、大于返回 +1
int compareYears(Calendar value, Calendar compare) 比较两个日历的年份。
 相等返回 0、小于返回-1、大于返回 +1
@Test
public void testCalendarValidator() {
	CalendarValidator calendarValidator = CalendarValidator.getInstance();
	Calendar calendar=Calendar.getInstance();
	calendar.add(Calendar.YEAR,1);
	System.out.println(calendarValidator.compareDates(calendar, Calendar.getInstance()));
	System.out.println(calendarValidator.compareMonths(calendar, Calendar.getInstance()));
	System.out.println(calendarValidator.compareQuarters(calendar, Calendar.getInstance()));
	System.out.println(calendarValidator.compareWeeks(calendar, Calendar.getInstance()));
	System.out.println(calendarValidator.compareYears(calendar, Calendar.getInstance()));
}

3.2 CreditCardValidator

信用卡校验

方法 说明
CreditCardValidator() 获取 CreditCardValidator 类的对象实例
boolean isValid(String card) 判断该字段是否是有效的信用卡号
Object validate(String card) 判断该字段是否是有效的信用卡号
@Test
public void testCreditCardValidator() {
	CreditCardValidator creditCardValidator = new CreditCardValidator();
	System.out.println(creditCardValidator.isValid("6227612145830440"));
	System.out.println(creditCardValidator.validate("6227612"));
}

3.3 DateValidator

  这个类主要是用来检查日期类型的输入数据是否合法,日期的类型要通过参数传递给这个Validator。实际上,这个日期检查就是通过formatter.parse(value)方法检查时候有异常抛出。在 DateValidator 类中提供有如下的几个主要的成员方法:

方法 说明
DateValidator getInstance() 获取 DateValidator 类的对象实例
int compareDates(Date value,Date compare,TimeZone timeZone) 比较两个日期的日、月和年。
 相等返回 0、小于返回-1、大于返回 +1
int compareMonths(Date value,Date compare,TimeZone timeZone) 比较两个日期的月份和年份。
 相等返回 0、小于返回-1、大于返回 +1
int compareQuarters(Date value,Date compare,TimeZone timeZone) 比较两个日期的季度和年份。
 相等返回 0、小于返回-1、大于返回 +1
int compareWeeks(Date value,Date compare,TimeZone timeZone) 比较两个日期的周和年。
 相等返回 0、小于返回-1、大于返回 +1
int compareYears(Date value,Date compare,TimeZone timeZone) 比较两个日期的年份。
 相等返回 0、小于返回-1、大于返回 +1
boolean isValid(String value,Locale locale) 按照Locale参数验证输入的日期数据是否合法
boolean isValid(String value, String pattern) 按照pattern验证输入的日期是否合法
boolean isValid(String value, String pattern, Locale locale)
@Test
public void testDateValidator() {
	DateValidator dateValidator = DateValidator.getInstance();
	String pattern = "yyyy-MM-dd";
     // 验证
	System.out.println(dateValidator.isValid("2021-07-22", pattern));
    // 验证/转换日期,不符合格式则返回空
	System.out.println(dateValidator.validate("2021-07-22", pattern));

	Date date = Date.from(LocalDate.now().plusMonths(1).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
	System.out.println(dateValidator.compareDates(new Date(), date,null));
	System.out.println(dateValidator.compareMonths(new Date(), date,null));
	System.out.println(dateValidator.compareQuarters(new Date(), date,null));
	System.out.println(dateValidator.compareWeeks(new Date(), date,null));
	System.out.println(dateValidator.compareYears(new Date(), date,null));
}

3.4 DomainValidator

域名验证器

方法 说明
DomainValidator getInstance() 获取 DomainValidator 类的对象实例
DomainValidator getInstance(boolean allowLocal) 获取 DomainValidator 类的对象实例,并根据需要进行本地验证
boolean isValid(String domain) 判断是否是有效域名
@Test
public void testDomainValidator() {
	DomainValidator domainValidator = DomainValidator.getInstance();
	System.out.println(domainValidator.isValid("commons.apache.org"));
	System.out.println(domainValidator.isValid("https://commons.apache.org"));
	System.out.println(domainValidator.isValid("commons.apache.org/"));
}

3.4 EmailValidator

这个类用来检查Email类型的输入数据是否合法。在 EmailValidator 类中提供有如下的几个主要的成员方法:

方法 说明
EmailValidator getInstance() 获取EmailValidator 类的对象实例
boolean isValid(String email) 验证是否是有效的电子邮件地址
@Test
public void testEmailValidator() {
	EmailValidator emailValidator = EmailValidator.getInstance();
	System.out.println(emailValidator.isValid("[email protected]"));
}

3.6 InetAddressValidator

Inet地址验证器

方法 说明
InetAddressValidator getInstance() 获取 InetAddressValidatorr 类的对象实例
boolean isValid(String inetAddress) 判断指定的字符串是否是有效的 IP 地址
boolean isValidInet4Address(String inet4Address) 验证 IPv4 地址
boolean isValidInet6Address(String inet6Address) 验证 IPv6 地址
@Test
public void testInetAddressValidator() {
	InetAddressValidator inetAddressValidator = InetAddressValidator.getInstance();
	System.out.println(inetAddressValidator.isValid("192.168.1.1"));
	System.out.println(inetAddressValidator.isValid("CDCD:910A:2222:5498:8475:1111:3900:2020"));
	System.out.println(inetAddressValidator.isValidInet4Address("192.168.1.1"));
	System.out.println(inetAddressValidator.isValidInet6Address("fe80::ecea:feaf:cc50:7439%13"));
}

3.7 PercentValidator

百分比验证器

方法 说明
PercentValidator getInstance() 获取 PercentValidator 类的对象实例

3.8 RegexValidator

正则表达式验证器

方法 说明
RegexValidator(String regex,boolean caseSensitive) 获取 RegexValidator 类的对象实例
RegexValidator(String[] regex,boolean caseSensitive) 获取 RegexValidator 类的对象实例
@Test
public void testRegexValidator() {
	// 设置参数
	String regex1 = "^([A-Z]*)(?:\\-)([A-Z]*)*$";
	String regex2 = "^([A-Z]*)$";
	// 创建验证
	RegexValidator validator02 = new RegexValidator(new String[]{regex1, regex2}, false);
	// 验证返回boolean
	System.out.println("valid: " + validator02.isValid("abc-def"));
	// 验证返回字符串
	System.out.println("result: " + validator02.validate("abc-def"));
	// 验证返回数组
	System.out.println(String.join("**", validator02.match("abc-def")));
}

3.9 TimeValidator

时间验证器

方法 说明
TimeValidator getInstance() 获取 TimeValidator 类的对象实例
int compareHours(Calendar value, Calendar compare) 比较两次的小时数。
 相等返回 0、小于返回-1、大于返回 +1
int compareMinutes(Calendar value, Calendar compare) 将小时和分钟进行两次比较。
 相等返回 0、小于返回-1、大于返回 +1
int compareSeconds(Calendar value, Calendar compare) 比较两个时间的小时、分钟和秒。
 相等返回 0、小于返回-1、大于返回 +1
int compareTime(Calendar value, Calendar compare) 比较两个日历的小时、分钟、秒和毫秒。
 相等返回 0、小于返回-1、大于返回 +1
@Test
public void testTimeValidator() {
   TimeValidator timeValidator = TimeValidator.getInstance();
   LocalDateTime localDateTime = LocalDateTime.now().minusHours(12);
   Calendar localDateTimeCalendar = GregorianCalendar.from(ZonedDateTime.of(localDateTime, ZoneId.systemDefault()));
   System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
   
   System.out.println(timeValidator.compareHours(localDateTimeCalendar, Calendar.getInstance()));
   System.out.println(timeValidator.compareMinutes(localDateTimeCalendar, Calendar.getInstance()));
   System.out.println(timeValidator.compareSeconds(localDateTimeCalendar, Calendar.getInstance()));
   System.out.println(timeValidator.compareTime(localDateTimeCalendar, Calendar.getInstance()));
}

3.10 UrlValidator

对URL地址进行有效验证。在 UrlValidator 类中提供有如下的几个主要的成员方法:

方法 说明
UrlValidator getInstance() 获取 UrlValidator 类的对象实例
boolean isValid(String value) 判断是否具有有效的 url 地址
@Test
public void testUrlValidator() {
   UrlValidator urlValidator = UrlValidator.getInstance();
   System.out.println(urlValidator.isValid("https://commons.apache.org/"));
   System.out.println(urlValidator.isValid("https://commons.apache.org"));
   System.out.println(urlValidator.isValid("commons.apache.org/"));
   System.out.println(urlValidator.isValid("commons.apache.org"));
}

四、validator.util

4.1 ValidatorUtils

方法 说明
String replace(String value, String key, String replaceValue) 将字符串中某个特性的字符串替换为另一个字符串
String getValueAsString(Object bean, String property) 获取某个Bean中的一个特定的属性,然后把属性值转换为字符串返回。
Map copyMap(Map map) 对一个特定的FashHashMap执行copy

你可能感兴趣的:(Java,技术栈)