在基於B/S架構實現的Web應用系統開發實現中,爲了可以得到正確和有效的用戶表單請求的參數值,在進行業務處理以前都須要對接收的表單數據進行檢查和驗證。有時編程花的時間最多的就是考慮各類異常狀況帶來的問題,反而正常的功能很快就能夠開發完,參數非法校驗是一個普通不能再普通的需求了,若是不對請求參數校驗,假如參數隨便傳遞,那可能會帶來一系列問題。
爲了簡化開發人員的服務器端程序驗證的代碼,實現和減小對通用驗證邏輯的代碼實現工做,在Commons組件集中還提供有一個Commons-Validator數據驗證器組件,幫助開發人員實現通用驗證邏輯的程序代碼編程實現,避免重複地編程實現通用驗證邏輯的程序代碼——好比驗證Email字符串、日期字符串等是否知足合法的格式要求。java
該類主要完成通用的數據驗證邏輯——如數據是否爲空、數據的長度是否知足要求、是否爲某種類型的數據值、輸入的數據值的範圍等。而這些驗證功能都是經過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("dao@test.com"));
}
複製代碼
日曆驗證器apache
方法 | 說明 |
---|---|
CalendarValidator getInstance() |
獲取 CalendarValidator 類的對象實例 |
int compareDates(Calendar value, Calendar compare) |
比較兩個日曆的日、月和年。 相等返回 0、小於返回-一、大於返回 +1 |
int compareMonths(Calendar value, Calendar compare) |
比較兩個日曆的月份和年份。 相等返回 0、小於返回-一、大於返回 +1 |
int compareQuarters(Calendar value, Calendar compare) |
比較兩個日曆的季度和年份。 相等返回 0、小於返回-一、大於返回 +1 |
int compareWeeks(Calendar value, Calendar compare) |
比較兩個日曆的周和年。 相等返回 0、小於返回-一、大於返回 +1 |
int compareYears(Calendar value, Calendar compare) |
比較兩個日曆的年份。 相等返回 0、小於返回-一、大於返回 +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 |
int compareMonths(Date value,Date compare,TimeZone timeZone) |
比較兩個日期的月份和年份。 相等返回 0、小於返回-一、大於返回 +1 |
int compareQuarters(Date value,Date compare,TimeZone timeZone) |
比較兩個日期的季度和年份。 相等返回 0、小於返回-一、大於返回 +1 |
int compareWeeks(Date value,Date compare,TimeZone timeZone) |
比較兩個日期的周和年。 相等返回 0、小於返回-一、大於返回 +1 |
int compareYears(Date value,Date compare,TimeZone timeZone) |
比較兩個日期的年份。 相等返回 0、小於返回-一、大於返回 +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 類中提供有以下的幾個主要的成員方法:markdown
方法 | 說明 |
---|---|
EmailValidator getInstance() |
獲取EmailValidator 類的對象實例 |
boolean isValid(String email) |
驗證是不是有效的電子郵件地址 |
@Test
public void testEmailValidator() {
EmailValidator emailValidator = EmailValidator.getInstance();
System.out.println(emailValidator.isValid("duleilewuhen@sina.com"));
}
複製代碼
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"));
}
複製代碼
百分比驗證器dom
方法 | 說明 |
---|---|
PercentValidator getInstance() |
獲取 PercentValidator 類的對象實例 |
正則表達式驗證器url
方法 | 說明 |
---|---|
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 |
int compareMinutes(Calendar value, Calendar compare) |
將小時和分鐘進行兩次比較。 相等返回 0、小於返回-一、大於返回 +1 |
int compareSeconds(Calendar value, Calendar compare) |
比較兩個時間的小時、分鐘和秒。 相等返回 0、小於返回-一、大於返回 +1 |
int compareTime(Calendar value, Calendar compare) |
比較兩個日曆的小時、分鐘、秒和毫秒。 相等返回 0、小於返回-一、大於返回 +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<String, Object> copyMap(Map<String, Object> map) |
對一個特定的FashHashMap執行copy |