在基于B/S架构实现的Web应用系统开发实现中,为了能够获得正确和有效的用户表单请求的参数值,在进行业务处理之前都需要对接收的表单数据进行检查和验证。有时编程花的时间最多的就是考虑各种异常情况带来的问题,反而正常的功能很快就可以开发完,参数非法校验是一个普通不能再普通的需求了,如果不对请求参数校验,假如参数随便传递,那可能会带来一系列问题。
为了简化开发人员的服务器端程序验证的代码,实现和减少对通用验证逻辑的代码实现工作,在Commons组件集中还提供有一个Commons-Validator数据验证器组件,帮助开发人员实现通用验证逻辑的程序代码编程实现,避免重复地编程实现通用验证逻辑的程序代码——比如验证Email字符串、日期字符串等是否满足合法的格式要求。
该类主要完成通用的数据验证逻辑——如数据是否为空、数据的长度是否满足要求、是否为某种类型的数据值、输入的数据值的范围等。而这些验证功能都是通过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]"));
}
日历验证器
方法 | 说明 |
---|---|
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()));
}
信用卡校验
方法 | 说明 |
---|---|
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"));
}
这个类主要是用来检查日期类型的输入数据是否合法,日期的类型要通过参数传递给这个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));
}
域名验证器
方法 | 说明 |
---|---|
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/"));
}
这个类用来检查Email类型的输入数据是否合法。在 EmailValidator 类中提供有如下的几个主要的成员方法:
方法 | 说明 |
---|---|
EmailValidator getInstance() |
获取EmailValidator 类的对象实例 |
boolean isValid(String email) |
验证是否是有效的电子邮件地址 |
@Test
public void testEmailValidator() {
EmailValidator emailValidator = EmailValidator.getInstance();
System.out.println(emailValidator.isValid("[email protected]"));
}
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"));
}
百分比验证器
方法 | 说明 |
---|---|
PercentValidator getInstance() |
获取 PercentValidator 类的对象实例 |
正则表达式验证器
方法 | 说明 |
---|---|
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")));
}
时间验证器
方法 | 说明 |
---|---|
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()));
}
对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"));
}
方法 | 说明 |
---|---|
String replace(String value, String key, String replaceValue) |
将字符串中某个特性的字符串替换为另一个字符串 |
String getValueAsString(Object bean, String property) |
获取某个Bean中的一个特定的属性,然后把属性值转换为字符串返回。 |
Map |
对一个特定的FashHashMap执行copy |