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.