SECTION 01 Validator 總覽
Validate 驗證, 這件事情, 寫程序是非常重要的, 要先判斷數據是否正確, 才讓動作或事件繼續執行下去, 那么, 每次都寫相同的驗證模式, 不如對于這個 JavaBean 的數據驗證透過 XML 的設定, 如果正確則為驗證成功, 發生錯誤則為驗證失敗. 對于完全沒有用過 Bean Validation 的人來說, 聽起來, 可能有點吃力, 不過看過例子可能就了解了.
最新版本為 v1.0.2
binary 下載 source 下載這次請下載 source 因為有許多范例程序在其中.
SECTION 02 基本范例
大家可以查看 org.apache.commons.validator.example.* 的文件, 其實很簡單, 只有 ValidateExample.java 及 ValidateBean.java 這兩個程序, 還有 validator-example.xml 來作為 Bean 的驗證設定. 另外 applicationResources.properties 是設定多國語言 (i18n)
大家可以直接參閱 ValidateExample, 設定 Validator 的方法其實很簡單
- 建立 ValidatorResource Instance , 并且取得驗證的配置文件
ValidatorResources resources = new ValidatorResources();
in = ValidateExample.class.getResourceAsStream("validator-example.xml");
ValidatorResourcesInitializer.initialize(resources, in);
- 建立要被驗證的 JavaBean
ValidateBean bean = new ValidateBean();
- 建立驗證者, 并且告知是哪個 JavaBean 需要驗證
Validator validator = new Validator(resources, "ValidateBean");
validator.addResource(Validator.BEAN_KEY, bean);
- 建立驗證結果儲存區, 將驗證結果放入
ValidatorResults results = null;
results = validator.validate();
ValidatorResults 是一個 HashMap 儲存 ValidateResult, 他是依照 property 為 key,
ValidatorResult result = results.getValidatorResult(propertyName);
取出 ValidatorResult; 接著用 isValid() method 去判斷是否驗證成功.
SECTION 03 validator-example.xml
<global>
<validator name="int"
classname="org.apache.commons.validator.TestTypeValidator"
method="validateInt"
methodParams="java.lang.Object,org.apache.commons.validator.Field"
msg="errors.int"/>
<validator name="required"
classname="org.apache.commons.validator.TestValidator"
method="validateRequired"
methodParams="java.lang.Object,org.apache.commons.validator.Field"
msg="errors.required"/>
</global>
<formset>
<form name="ValidateBean">
<field property="firstName" depends="required">
<arg0 key="nameForm.firstname.displayname"/>
</field>
</form>
</formset>
</form-validation>
在 global 的地方是告知, 各種情況需要用到那一個 Validator 來判斷, 并且設定錯誤訊息, 將會參考 ApplicationResource.properties 的內容來顯示, 而 form 的判斷模式, 可以放入顯示時候的名稱, "errors.required=The {0} field is required." 如果發生驗證失敗, 將會把 nameForm.firstname.displayname ( 也就是寫在 properties 中的 First Name ) 取代 {0} 的地方
SECTION 04 Validator 的寫法
最重要的就是寫 public static boolean validateXxxxx( Object bean, Field field ) 這樣的 method
public class TestValidator {
/**
* Checks if the field is required.
*
* @param value The value validation is being performed on.
* @return boolean If the field isn't null
and
* has a length greater than zero,
* true
is returned.
* Otherwise false
.
*/
public static boolean validateRequired(Object bean, Field field) {
String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
return !GenericValidator.isBlankOrNull(value);
}
}
SECTION 05 GenericValidator
目前 GenericValidator 提供了
- isBlankOrNull(java.lang.String value) : 檢查是否為空值,及去掉空白后長度是否大于零
- isByte(java.lang.String value) : 是否可以轉成 byte
- isCreditCard(java.lang.String value) : 是否為正確的信用卡號
- isDate(java.lang.String value, java.util.Locale locale) : 是否為有效的日期, 可依照區域別判斷
- isDate(java.lang.String value, java.lang.String datePattern, boolean strict) : 是否為有效的日期, 可輸入日期格式, 是否需要完全符合
- isDouble(java.lang.String value) : 是否可以轉成 double
- isEmail(java.lang.String value) : 是否為有效的 Email
- isFloat(java.lang.String value) : 是否可以轉成 float
- isInRange(double value, double min, double max) : 輸入數值是否在此區間 ( double )
- isInRange(float value, float min, float max) : 輸入數值是否在此區間 ( float )
- isInRange(int value, int min, int max) : 輸入數值是否在此區間 ( int )
- isInRange(short value, short min, short max) : 輸入數值是否在此區間 ( short )
- isInt(java.lang.String value) : 是否可以轉成 int
- isLong(java.lang.String value) : 是否可以轉成 long
- isShort(java.lang.String value) : 是否可以轉成 short
- matchRegexp(java.lang.String value, java.lang.String regexp) : 是否符合輸入的 Regular Expression
- maxLength(java.lang.String value, int max) : 長度不得大于輸入值
- minLength(java.lang.String value, int min) : 長度不得小于輸入值
我認為最好用的就是 matchRegexp 可以設定成各式各樣的判斷.
SECTION 06 Struts Validator
原本最早 , Struts-validate 是由
http://home.earthlink.net/~dwinterfeldt/revision.html 這里開始的, 2002 初開始使用 commons-validator, 就轉移到 jakarta 繼續開發, 你會發現 commons-validator 的開發人員都是 struts 的開發人員.
在 struts 可以透過 plug-in 設定 struts-config.xml
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
ValidatorPlugIn.java , 是一個實現 PlugIn ( "init()" & "destroy()" ) 的一個 Servlet
public class ValidatorPlugIn implements PlugIn {
public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
......
initResources();
......
}
protected void initResources() throws IOException, ServletException {
......
ValidatorResourcesInitializer.initialize(resources, bis, false);
......
}
public void destroy() {
.....
}
}
而 ValidatorResourcesInitializer 就是屬于 commons-validator 的組件,
另外的 /WEB-INF/validator-rules.xml, 包含了 client 端 javascirpt 的驗證, 和 commons-validator 的驗證.
最后的 /WEB-INF/validation.xml, 就是針對 FormBean 來作驗證, 當然你可以自行用 commons-validator 對于 ValueObject 作驗證.
SECTION 07 總結
如果不是要與 EIS ( DB layer ) 層級作處理的, 大家可以對于輸入的資料通過 Validator 標準的模式, 撰寫自己公司商業邏輯的 validator.