「Wicket 日付の入力補助」で作ったアプリケーションに、入力検証を加える。
package com.snail;
import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.validator.AbstractValidator;
public class NGWordValidator extends AbstractValidator {
private static final long serialVersionUID = 7638140005191056302L;
private static String[] NG_WORDS = { "ウザイ", "キモイ", "死ね" };
private static String RESOURCE_KEY = "NGWordValidatior";
private static String NG_WORD_KEY = "ngWord";
@Override
protected void onValidate(IValidatable validatable) {
String str = validatable.getValue().toString();
for (String ngWord : NG_WORDS) {
if (str.matches(".*" + ngWord + ".*")) {
Map<String,String> valMap = new HashMap<String,String>();
valMap.put(NG_WORD_KEY,ngWord);
error(validatable, RESOURCE_KEY,valMap);
return;
}
}
}
}
protected void onValidate(IValidatable validatable) { String str = validatable.getValue().toString(); ... }で取り出せる。
HomePage.java(WebPageクラス) public HomePage(){ ... TextField txtDate = new TextField("date", mDate ,Date.class); ... }には、
(Validatorクラス) protected void onValidate(IValidatable validatable) { Date date = (Date)validatable.getValue(); ... }などとする。
error(IValidatable validatable, String resourcekey); error(IValidatable validatable, String resourcekey, Map vars);を呼び出す。
public class HomePage extends WebPage {
...
public HomePage(final PageParameters parameters) {
this(new DiaryVO());
}
public HomePage(final DiaryVO pDiary) {
this.diary = pDiary;
add(feedback);
add(form);
TextField txtSubject = new TextField("subject",
new PropertyModel(diary, DiaryVO.SUBJECT));
txtSubject.setRequired(true);
txtSubject.add(new NGWordValidator()); // <- ATTENTION PLEASE !
form.add(txtSubject);
...
}
}
TextField? に、Validator を add() するだけ
NGWordValidatior='${label}'は、NG Word( ${ngWord} )を含んでいます。通常これで問題なく動く。同じ Validator を使っていても、入力フィールド毎にエラーメッセージを変えたいときには、HTML構造のパス (<form wicket:id="f"><input type="text" wicket:id="subject"></input>) を指定する
f.subject.NGWordValidatior='${label}'は、NG Word( ${ngWord} )を含んでいます。
org.apache.wicket.markup.html.WebPage | +---com.foo.bar.CommonPage <-> CommonPage.properties (共通メッセージ) | +---com.foo.bar.LoginPage <-> LoginPage.properties +---com.foo.bar.MenuPage <-> MenuPage.properties +---com.foo.bar.PurchasePage <-> PurchasePage.properties +---com.foo.bar.ItemListPage <-> ItemListPage.properties +-...
package com.snail.wicket.exam;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
public class HaikuValidator extends AbstractFormValidator {
private static final long serialVersionUID = 8038973638322570164L;
private TextField inp1;
private TextField inp2;
private TextField inp3;
public HaikuValidator(TextField pInp1, TextField pInp2,
TextField pInp3) {
this.inp1 = pInp1;
this.inp2 = pInp2;
this.inp3 = pInp3;
}
@Override
public FormComponent[] getDependentFormComponents() {
return new FormComponent[] { inp1, inp2, inp3 };
}
@Override
public void validate(Form form) {
if (!((inp1.getValue().length() == 5)
&& (inp2.getValue().length() == 7)
&& (inp3.getValue().length() == 5))) {
error(inp1); // inp1のエラーと見なす
}
}
}
public class HaikuPage extends WebPage {
...
public HaikuPage () {
...
add(feedback);
add(form);
form.add( new HaikuValidator( top, middle, buttom );
...
}
}
form に、add() するf.inp1.HaikuValidator = 入力された句は、${input0} {input1} ${input2}です。 ${label0} は5文字、${label1} は7文字、{label2} は5文字にしてください。