为何要验证(Validate)
验证是系统中一个必不可少的部分,前端验证、后台验证中起来往往会发现,一个简单完整的CRUD应用中,用来处理与验证有关的代码或配置就占了几乎三分之一。Struts1.x时代的验证就不提了。不管是Struts2(webwork)的验证还是JSF里面提供的验证,都是采用按步就班的方式,一笔一划的写出来,仍然没有达到能使验证工作变得简单、灵活。
如何验证
EasyJWeb完善了验证系统,使验证变得更加容易,灵活控制。你可以使用非常简单的标签或配置就能使系统拥有服务器端及客户端验证的功能。
这里使用一个简单的示例来介绍。有一个Person模型,如下所示:
包含id、name、sex、borndate、height、mail、homepage等几个属性。
假如我们要让name、sex、heigth、borndate必填,并且borndate必须在1908到2008年之间, mail属性只接收正确的email信息,homepage必须接收url信息。则我们只需要在Domain对象(可以是Entity对象,也可以是传输Command对象)中加入下面的配置信息即可:
@FormPO(name="person",validators=...{@Validator(name="required",field="name,sex,heigth,borndate"),@Validator(name="range",field="borndate",value="min:1908-01-01;max:2008-01-01"),@Validator(name="email",field="mail"),@Validator(name="url",field="homepage")})
public class Person...{
private Long id;
private String name;
private String sex;
private String mail;
private Integer heigth;
private Date borndate;
public String homepage;
…//setter及getter方法
}
不需要进行复杂的配置,只需要使用符合人类语言习惯的简单标注,就能实现所需要的验证业务逻辑。
@Validator验证标签的使用非常灵活,你只要具有充分的想像力,就能描述出符合特定需要的验证逻辑。比如上面的例子中,我们规定name不允许为空,字符数最小不能少于5个,最大不能超过10个,在进行字符验证前需要清除掉前后的空格。则我们可以使用下面的验证标签:
@Validator(name=”string”,value=”blank;trim;required;min:5;max:10;minMsg:最少不能少于5个字符;maxMsg:最大不能超过10字符”)
private String name;
错误信息的显示
在表示层的页面模板中,我们可以使用下面的模板标签来显示验证错误信息,
$!errors-显示全部验证错误信息。
$!errors.name-显示name属性(字段)的错误信息。
如下面的的Form
<form name="person_new_form" id="person_new_form" method="post" action="/ejf/person/create">
请输入姓名:<input name="name" type="text" id="person_name" value="$!name" />$!errors.name
电子邮箱:<input name="mail" type="text" id="person_mail" value="$!mail" />$!errors.mail
…
3、统一的验证标签@Validator
public @interface Validator ...{
public String name();// 验证器的名称,如required,string,range等
public String value() default "";// 验证器的值,使用;号作为分隔符存放各个参数。如value="required;min:5;max:20"
public String msg() default "";// 默认错误提示信息,当验证无法通过时显示的提示信息
public String field() default "";// 字段名称,对于property及field类型的校验均可用,也是错误对象的主属性名称。可以用于多个字段,此时需要使用,隔开
public String displayName() default "";// 定义对象的显示名称,默认情况下为field的名称,可以通过@Field中的name属性定义。
public ValidateType type() default ValidateType.Property;// 校验类型,默认是对属性进行校验
public boolean required() default false;// 是否必填字段,每个验证器都可以通过设置属性required=true来指定该属性为必填项
public String key() default "";// 多国语言显示值的编码
}
4、EasyJWeb内置的Validator验证器
Validators.RequiredValidator-用来定义必填属性,预定义名称required。
Validators.StringValidator-字符串验证器,定义字符串的属性,预定义名称string。
Validators.URLValidator-URL字符串验证器,匹配一个合法的URL,预定义名称url。
Validators.RegexpValidator-正则表达式验证器,匹配指定条件的正则表达式,预定义名称regex。
Validators.EmailValidator-Email字符验证器,匹配正确的email字符串,预定义名称email。
Validators.RangeValidator-范围验证器,用来限制属性必须在指定的范围之内,预定义名称range。
验证器引擎的触发也是非常灵活的,如果是普通的CRUD应用或者是基于普通CRUD应用基础上扩展的应用,则在基本的添删改查中会自动调用验证逻辑。
如果是自定义的Action,可通过调用form.toPo等方法触法验证逻辑。如果是使用IDAO接口进行的调用,则在进行数据持久化之前会调用验证逻辑。
5、自定义验证器
除了几个内置的验证器以外,EasyJWeb支持用户自定义的验证器。用户自定义的的验证器只需要实现Validator接口,即可注册到系统中使用。Validator的内容如下:
public interface Validator ...{
/** *//**
* 执行具体的验证操作
*
* @param obj
* 验证目标对象
* @param value
* 验证值
* @param errors
* 验证异常信息封装
*/
void validate(TargetObject obj, Object value, Errors errors);
/** *//**
* 验证器默认错误信息
*
* @return 返回验证器默认的错误提示信息
*/
String getDefaultMessage();
}
在实际应用中,一般通过使用继承抽象类AbstractValidator来实现自定义的验证器。如下面是最简单验证器Required的实现:
public class RequiredValidator extends AbstractValidator ...{
public RequiredValidator() ...{
}
public void validate(TargetObject obj, Object value, Errors errors) ...{
if (value == null)
addError(obj, value, errors);
else if (value instanceof String) ...{
}
}
public String getDefaultMessage() ...{
return "{%0}不能为空!";
}
}
posted on 2007-08-23 09:48
简易java框架 阅读(1600)
评论(3) 编辑 收藏