周末感冒了重感冒都要吐血了,猫在家里面养病的时候顺手翻了一下前阵子看到的两个东西:Commons-Validator,EC,花了半天时间翻过了CV的文档,模仿他的例子做了个登陆的验证,做完后感言万分.
我还是第一次写那么麻烦的配置文件:
xml 代码
- <validator name="emailValidator"
- classname="net.pingsoft.atomic.SimpleValidateFormEmailWrapper"
- method="doEmailValidate" msg="{0}项不是一个正确的Email地址"
- methodParams="java.lang.Object,org.apache.commons.validator.Field" />
开始觉得SS1时文档里的语录:"严重BScv的配置文件只顾XML解析器方便不顾程序员方便的写法"严重同意!CV的结构就是这个配置文件的展示,层次结构比较郁闷,如上面配置一个validator就杀去那么多行~幸好有现成的可以用不然第一次写的人肯定要吐血死去.下面是在荒郊野岭中使用纯servlet和jodd这个小东西做的控制器:
java 代码
- Customer customer = new Customer();
- // 使用Jodd BeanUtil装载页面bean
- BeanUtil.load(customer, request);
- ValidatorResources resources = new ValidatorResources(getClass().getClassLoader().getResourceAsStream(
- "VCustomer.xml"));
- Validator validator = new Validator(resources, "simpleValidateForm");
- validator.setParameter(Validator.BEAN_PARAM, customer);
- // 进行Validate
- ValidatorResults results = validator.validate();
- List errors = new ArrayList();
- for (Object property : results.getPropertyNames()) {
- // 利用这个名字取出各项被v后的结果r,这个r包含了每个验证器对这项的验证结果,如果是有两个校验器叠加到这项上,那么如果第一个
- // 校验器失败了,那么后面的就不会执行了,返回null而不是false
- ValidatorResult r = results.getValidatorResult(property.toString());
- // 将Field中的key取出来
- Arg[] args = r.getField().getArgs("");
- Object[] errorArg = new Object[args.length];
- for (int i = 0; i < args.length; i++) {
- errorArg[i] = args[i].getKey();
- }
- for (Object o : r.getField().getDependencyList()) {
- if (!r.isValid((String) o)) {
- ValidatorAction action = resources.getValidatorAction((String) o);
- String errorMsg = action.getMsg();
- // 通过MessageFormat把错误信息和错误参数列和在一起
- String error = MessageFormat.format(errorMsg, errorArg);
- errors.add(error);
- }
- }
- }
MessageFormat用起来真是麻烦,不过貌似比较强大,ResourceBundle挺无聊的说...
今天忽然就想写些东西不过想了半天不知道写到那里,忽然想起javaeye哈