フォームからの入力値の検証
前回、ListViewや、PageableListView を使うために ToDo 一覧っぽいものを出力するようにしたのですが、行き詰まってしまったので、値を入力して次のページでその値を表示する処理に巻き戻すことにします。
とりあえず、入力値の検証を何も行っていなかったため、検証を加えてみます。
HelloWorld.java
package helloworld;
import wicket.markup.html.WebPage;
import wicket.markup.html.form.Form;
import wicket.markup.html.form.RequiredTextField;
import wicket.markup.html.form.validation.StringValidator;
import wicket.markup.html.panel.FeedbackPanel;
import wicket.model.PropertyModel;
import wicket.util.value.ValueMap;
public class HelloWorld extends WebPage {
public HelloWorld() {
add(new FeedbackPanel("feedback"));
add(new HelloForm("form"));
}
public final class HelloForm extends Form {
ValueMap properties = new ValueMap();
public HelloForm(final String id) {
super(id);
RequiredTextField lastnameTextField = new RequiredTextField ("lastname", new PropertyModel(properties, "lastname"));
lastnameTextField.add(StringValidator.lengthBetween(1,4));
add(lastnameTextField);
RequiredTextField firstnameTextField = new RequiredTextField("firstname", new PropertyModel(properties, "firstname"));
firstnameTextField.add(StringValidator.lengthBetween(1,4));
add(firstnameTextField);
}
public final void onSubmit() {
setResponsePage(new NextPage(properties));
}
}
}
RequiredTextField は、「必須入力」を表します。TextField に setRequired(true) したものと同等になるそうです。
lastnameTextField.add(StringValidator.lengthBetween(1,4));
は、TextField に、1文字以上4文字以下の制限を加える物です。
必須チェックをかけた上に1文字以上のチェックを加えるのは意味がないような気もしますが・・・
StringValidator には他に、 maximumLength、minimumLength などがあります。
さらに、エラーメッセージを表示するために、
add(new FeedbackPanel("feedback"));
として、FeedbackPanel を追加しています。
HelloWorld.html
FeedbackPanel が出力する場所として、
<span wicket:id="feedback"/>
を適当なところに挿入してやります。
これで実行すると、
'長い長い長い文字列' は 1 文字から 4 文字までにしてください.
と表示されるので、lengthBetweek() の検証が効いていることがわかります。
ですが、未入力チェックの方のメッセージが文字化けしてしまいます。
というよりも、そもそも、このメッセージ文字列はどこからやってきたのでしょうか?
wicket の jar ファイルを見てみると、どうやら wicket/Application_ja.properties から来ているようです。
中身をのぞいてみると、native2ascii による変換結果で入っています。
native2ascii -reverse してみると、必須入力チェック時には、
RequiredValidator='${label}' 欄 は必須です。
というメッセージが出そうです。
が、出てくれません。
う~ん。何故化けるのでしょうか・・・。
今回はここで挫折。