「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 ); ... } }
f.inp1.HaikuValidator = 入力された句は、${input0} {input1} ${input2}です。 ${label0} は5文字、${label1} は7文字、{label2} は5文字にしてください。