Wicket で、独自バリデータ作成は、単純に言えば、
AbstractValidator を継承して、onValidate メソッドをオーバライドして
その中で、検証される値を受け取りNGなら AbstractValidator の error メソッドを
実行することである。
フォーム入力項目相互のチェック、重複入力のチェックは
独自バリデータが必要であろう。
// 重複チェックに使うMap はPageクラス内で宣言、生成する
Map<String,Object> validatorCheckMap = new HashMap<String,Object>();
// 重複チェック バリデータ
class DuplicateValidator extends AbstractValidator<String>{
private Map<String,Object> checkMap;
public DuplicateValidator(Map<String,Object> validatorCheckMap){
this.checkMap = validatorCheckMap;
}
@Override
protected void onValidate(IValidatable<String> validatable){
String s = validatable.getValue();
if (this.checkMap.containsKey(s)){
Map<String,Object> vmap = new HashMap<String,Object>();
vmap.put("DupliValue",s);
error(validatable,"DuplicateInput",vmap);
}else{
this.checkMap.put(s,s);
}
}
}
// バリデータadd する時に、バリデータのコンストラクタ
// に渡すマップは、これを使って渡す。
// フィードバックが表示された後、次回検証でクリアする必要が
// あるので、フィードバック のonAfterRenderをオーバーライドした中で
// 呼べるようにする。
protected Map<String,Object> getValidatorCheckMap(){
return this.validatorCheckMap;
}
---------- バリデーターの使用 ---------------
// フィードバック
final FeedbackPanel feedback = new FeedbackPanel("feedback"){
@Override
protected void onAfterRender(){
super.onAfterRender();
getValidatorCheckMap().clear();
}};
feedback.setOutputMarkupId(true);
add(feedback);
Form<Void> form = new Form<Void>("myform");
final TextField<String> data1 = new TextField<String>("data1",new Model<String>(""));
data1.add(new DuplicateValidator(getValidatorCheckMap()));
form.add(data1);
final TextField<String> data2 = new TextField<String>("data2",new Model<String>(""));
data2.add(new DuplicateValidator(getValidatorCheckMap()));
form.add(data2);
final TextField<String> data3 = new TextField<String>("data3",new Model<String>(""));
data3.add(new DuplicateValidator(getValidatorCheckMap()));
form.add(data3);
----------- プロパティファイルの中 -------------------
myform.data1 = テキスト1
myform.data1.DuplicateInput = ${label}の値 ${DupliValue} は、他の入力と重複してます!
myform.data2 = テキスト2
myform.data2.DuplicateInput = ${label}の値 ${DupliValue} は、他の入力と重複してます!
myform.data3 = テキスト3
myform.data3.DuplicateInput = ${label}の値 ${DupliValue} は、他の入力と重複してます!