為何要驗證(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框架 閱讀(1605)
評論(3) 編輯 收藏