SECTION 01 Validator 總覽
Validate 驗(yàn)證, 這件事情, 寫(xiě)程序是非常重要的, 要先判斷數(shù)據(jù)是否正確, 才讓動(dòng)作或事件繼續(xù)執(zhí)行下去, 那么, 每次都寫(xiě)相同的驗(yàn)證模式, 不如對(duì)于這個(gè) JavaBean 的數(shù)據(jù)驗(yàn)證透過(guò) XML 的設(shè)定, 如果正確則為驗(yàn)證成功, 發(fā)生錯(cuò)誤則為驗(yàn)證失敗. 對(duì)于完全沒(méi)有用過(guò) Bean Validation 的人來(lái)說(shuō), 聽(tīng)起來(lái), 可能有點(diǎn)吃力, 不過(guò)看過(guò)例子可能就了解了.
最新版本為 v1.0.2
binary 下載 source 下載這次請(qǐng)下載 source 因?yàn)橛性S多范例程序在其中.
SECTION 02 基本范例
大家可以查看 org.apache.commons.validator.example.* 的文件, 其實(shí)很簡(jiǎn)單, 只有 ValidateExample.java 及 ValidateBean.java 這兩個(gè)程序, 還有 validator-example.xml 來(lái)作為 Bean 的驗(yàn)證設(shè)定. 另外 applicationResources.properties 是設(shè)定多國(guó)語(yǔ)言 (i18n)
大家可以直接參閱 ValidateExample, 設(shè)定 Validator 的方法其實(shí)很簡(jiǎn)單
- 建立 ValidatorResource Instance , 并且取得驗(yàn)證的配置文件
ValidatorResources resources = new ValidatorResources();
in = ValidateExample.class.getResourceAsStream("validator-example.xml");
ValidatorResourcesInitializer.initialize(resources, in);
- 建立要被驗(yàn)證的 JavaBean
ValidateBean bean = new ValidateBean();
- 建立驗(yàn)證者, 并且告知是哪個(gè) JavaBean 需要驗(yàn)證
Validator validator = new Validator(resources, "ValidateBean");
validator.addResource(Validator.BEAN_KEY, bean);
- 建立驗(yàn)證結(jié)果儲(chǔ)存區(qū), 將驗(yàn)證結(jié)果放入
ValidatorResults results = null;
results = validator.validate();
ValidatorResults 是一個(gè) HashMap 儲(chǔ)存 ValidateResult, 他是依照 property 為 key,
ValidatorResult result = results.getValidatorResult(propertyName);
取出 ValidatorResult; 接著用 isValid() method 去判斷是否驗(yàn)證成功.
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 的地方是告知, 各種情況需要用到那一個(gè) Validator 來(lái)判斷, 并且設(shè)定錯(cuò)誤訊息, 將會(huì)參考 ApplicationResource.properties 的內(nèi)容來(lái)顯示, 而 form 的判斷模式, 可以放入顯示時(shí)候的名稱(chēng), "errors.required=The {0} field is required." 如果發(fā)生驗(yàn)證失敗, 將會(huì)把 nameForm.firstname.displayname ( 也就是寫(xiě)在 properties 中的 First Name ) 取代 {0} 的地方
SECTION 04 Validator 的寫(xiě)法
最重要的就是寫(xiě) 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) : 檢查是否為空值,及去掉空白后長(zhǎng)度是否大于零
- isByte(java.lang.String value) : 是否可以轉(zhuǎn)成 byte
- isCreditCard(java.lang.String value) : 是否為正確的信用卡號(hào)
- isDate(java.lang.String value, java.util.Locale locale) : 是否為有效的日期, 可依照區(qū)域別判斷
- isDate(java.lang.String value, java.lang.String datePattern, boolean strict) : 是否為有效的日期, 可輸入日期格式, 是否需要完全符合
- isDouble(java.lang.String value) : 是否可以轉(zhuǎn)成 double
- isEmail(java.lang.String value) : 是否為有效的 Email
- isFloat(java.lang.String value) : 是否可以轉(zhuǎn)成 float
- isInRange(double value, double min, double max) : 輸入數(shù)值是否在此區(qū)間 ( double )
- isInRange(float value, float min, float max) : 輸入數(shù)值是否在此區(qū)間 ( float )
- isInRange(int value, int min, int max) : 輸入數(shù)值是否在此區(qū)間 ( int )
- isInRange(short value, short min, short max) : 輸入數(shù)值是否在此區(qū)間 ( short )
- isInt(java.lang.String value) : 是否可以轉(zhuǎn)成 int
- isLong(java.lang.String value) : 是否可以轉(zhuǎn)成 long
- isShort(java.lang.String value) : 是否可以轉(zhuǎn)成 short
- matchRegexp(java.lang.String value, java.lang.String regexp) : 是否符合輸入的 Regular Expression
- maxLength(java.lang.String value, int max) : 長(zhǎng)度不得大于輸入值
- minLength(java.lang.String value, int min) : 長(zhǎng)度不得小于輸入值
我認(rèn)為最好用的就是 matchRegexp 可以設(shè)定成各式各樣的判斷.
SECTION 06 Struts Validator
原本最早 , Struts-validate 是由
http://home.earthlink.net/~dwinterfeldt/revision.html 這里開(kāi)始的, 2002 初開(kāi)始使用 commons-validator, 就轉(zhuǎn)移到 jakarta 繼續(xù)開(kāi)發(fā), 你會(huì)發(fā)現(xiàn) commons-validator 的開(kāi)發(fā)人員都是 struts 的開(kāi)發(fā)人員.
在 struts 可以透過(guò) plug-in 設(shè)定 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 , 是一個(gè)實(shí)現(xiàn) PlugIn ( "init()" & "destroy()" ) 的一個(gè) 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 的驗(yàn)證, 和 commons-validator 的驗(yàn)證.
最后的 /WEB-INF/validation.xml, 就是針對(duì) FormBean 來(lái)作驗(yàn)證, 當(dāng)然你可以自行用 commons-validator 對(duì)于 ValueObject 作驗(yàn)證.
SECTION 07 總結(jié)
如果不是要與 EIS ( DB layer ) 層級(jí)作處理的, 大家可以對(duì)于輸入的資料通過(guò) Validator 標(biāo)準(zhǔn)的模式, 撰寫(xiě)自己公司商業(yè)邏輯的 validator.