これまで書いたサンプルの中にも出てきている TextField。
今回はこれにクローズアップ。
ということでまずは TextField はどんな用途に使うか。
というのは言うまでもなく、HTML の <input type="text" ... > に対応しています。
そしてコンストラクタ。
TextField クラスには 4 種類のコンストラクタがあります。
1 つめ。Wicket の id だけを引数とするもの。
2 つめ。id と Class を引数とするもの。
3 つめ。id と IModel を引数とするもの。
4 つめ。id と IModel そして Class を引数とするもの。
以上の 4 つ。
引数の id と IModel は Wicket の id とモデルの指定なので良しとして、Class です。
この Class には TextField の入力型チェックの指定ができます。
例えば、ここに Integer.class を指定するとその TextField に数値以外を入力すると入力エラーになります。
入力型チェックの機能を使うときには、コンストラクタでの指定に加えてプロパティファイルでエラーメッセージの定義をする必要があります。
form.text2.TypeValidator='${input}' is not an integer
ページに追加した TextField までの id の階層を . で区切って最後に TypeValidator としたプロパティ名でエラーメッセージを定義します。
${input} は TextField に入力された値と置き換わります。
入力チェック周りの全般的なところは今回省略。いずれ。
というわけで TextField に関しては大体こんなところです。
TextField だけだとちょっと寂しい気もしたので TextField のサブクラス RequiredTextField についてもちょっと書きます。
ずばり、必須入力チェックがある TextField。
これだけです。
基本的なところは TextField となんら変わりなく。
違いは必須入力チェックエラー時のメッセージをプロパティファイルに定義する必要があることくらい。
プロパティファイルにメッセージを定義する時のプロパティ名は TextField までの id の階層を . で区切って最後に RequiredValidator です。
form.text3.RequiredValidator=Text3 is required.
今回作ったサンプルコードは全部でこれだけ。
ということでまずは SampleApp.java。
package javademo.wicket;
import wicket.protocol.http.WebApplication;
public class SampleApp extends WebApplication {
    public SampleApp(){
        getPages().setHomePage(TextFieldSample.class);
    }
}
次が今回のメインどころ TextFieldSample.java。
画面の作りは、テキストフィールドを3つにボタンを持ったフォームとメッセージ表示のための領域があるだけのシンプルなものです。
package javademo.wicket;
import wicket.markup.html.WebPage;
import wicket.markup.html.form.Form;
import wicket.markup.html.form.RequiredTextField;
import wicket.markup.html.form.TextField;
import wicket.markup.html.panel.FeedbackPanel;
import wicket.model.CompoundPropertyModel;
public class TextFieldSample extends WebPage{
    public TextFieldSample(){
        final Input input = new Input();
        setModel(new CompoundPropertyModel(input));
        
        FeedbackPanel feedback = new FeedbackPanel("feedback");
        add(feedback);
        
        Form form = new Form("form", feedback){
            public void onSubmit(){
                info(input.toString());
            }
        };
        add(form);
        
        TextField text1 = new TextField("text1");
        text1.setConvertEmptyInputStringToNull(false);
        form.add(text1);
        
        TextField text2 = new TextField("text2", Integer.class);
        form.add(text2);
        
        form.add(new RequiredTextField("text3"));
    }
    
    public class Input{
        public String text1;
        public String text2;
        public String text3;
        
        public String toString(){
            return "text1=" + text1 + ",text2=" + text2 + ",text3=" + text3; 
        }
    }
}
ちょっと変わったとこといえば text1 で setConvertEmptyInputString(false) しているところでしょうか。
このメソッドで false をセットしておくと入力がなかったときの TextField の値が空文字列になります。
対して true をセットしておいた場合、入力がないときの TextField の値は null になります。
ちょっと試してみたかったので入れてみました。
画面レイアウトを記述した TextFieldSample.html。
特に変わったところはないです。
<?xml version="1.0" encoding="Shift_JIS"?> <html> <body> <form wicket:id="form"> text1:<input wicket:id="text1" type="text"><br> text2:<input wicket:id="text2" type="text"><br> text3:<input wicket:id="text3" type="text"><br> <input type="submit"> </form> <span wicket:id="feedback">feedbackmessages will be put here</span> </body> </html>
エラーメッセージを定義したプロパティファイル。
TextFieldSample.properties。
ファイル名は WebPage クラス名 + .properties のルールで付けます。
こうしておくといい感じに自動でファイルの読み込みが行われます。
form.text3.RequiredValidator=Text3 is required.
form.text2.TypeValidator='${input}' is not an integer
最後は web.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>Wicket Examples</display-name>
    <servlet>
        <servlet-name>SampleApp</servlet-name>
        <servlet-class>wicket.protocol.http.WicketServlet</servlet-class>
        <init-param>
          <param-name>applicationClassName</param-name>
          <param-value>javademo.wicket.SampleApp</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SampleApp</servlet-name>
        <url-pattern>/sample</url-pattern>
    </servlet-mapping>
</web-app>
TextField のポイント。