コンバータ
Wicket ではコンバータを使って HTML 上の表記やユーザの入力とモデル間の型変換を行うことができます。たとえば下図のように日付を TextField に 060103 (yymmdd) 形式で入力してもらってモデルの Date 型に反映したり Label コンポーネントではモデルの内容を 06/01/03 の形式で表示するといったことがコンバータを定義することで自動的に行われます。
コンバータはインタフェース IConverter を実装するクラスで、デフォルトで Converter というクラスが設定されています。このクラスはプリミティブ型とそのラッパクラス (java.lang.Integer など)、String と Date の変換を行います。その他のクラスは OGNL の OgnlOps.convertValue() を使って変換します。
カスタムコンバータを使用する
デフォルトのコンバータと違った変換を行いたい場合には
- デフォルトの wicket.util.convert.Converter をカスタマイズする
- IConverter を実装するクラスを作成する
- SimpleConverterAdapter を継承する
のいずれかを用います。また変換方法をアプリケーション全体に適用するのか特定のコンポーネントのみに適用するのかによって設定方法が異なります。
SipleConverterAdapter
文字列とそれ以外のクラスとのコンバータを簡単に作成するためのクラスです。次の 2 つのメソッドを実装するだけで簡単に作成できます。
public abstract String toString(Object value); public abstract Object toObject(String value);
アプリケーション全体の変換方法を変更する
アプリケーション内で用いられるすべての変換方法を設定するには、独自のコンバータを生成する IConverterFactory を返すように Application の getConverterFactory() を実装します。下のコード例では任意のオブジェクト (通常は String) から Date 型への変換を行う DateConverter クラスに yyyyMMddhhmmss 形式でパースするように設定し、さらにそれを Date 型への変換用として Converter に登録しています。
MyApplication.java
public IConverterFactory getConverterFactory() {
return new IConverterFactory() {
public IConverter newConverter(Locale locale) {
DateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");
Converter converter = new Converter(locale);
DateConverter dateConverter = new DateConverter();
dateConverter.setDateFormat(locale, df);
converter.set(Date.class, dateConverter);
return converter;
}
};
}
なお Converter にはコンストラクタか setLocale() にて Locale を必ず設定するようにしてください。そうでないと変換時に内部で SimpleDateFormat にて NullPointerException が発生してしまします。またこの例では wicket.util.convert.Converter をカスタマイズしましたが、大幅に動作を変更したい場合などは IConverter の実装クラスを自作してもかまいません。
特定のコンポーネントの変換方法を変更する
Label や TextField などが継承している wicket.Component の getConverter() をオーバライドすることで、コンポーネントごとのコンバータを指定することができます。下のコード例では日付を yy/MM/dd 形式の String に変換するコンバータ MyDateConverter を利用する Label をページ MyPage に登録しています。
MyDateConverter.java
public class MyDateConverter implements IConverter {
public Object convert(Object value, Class c) {
SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd");
return df.format(value);
}
}
MyPage.java
add(new Label("date", new Model(myModel.getDate())) {
public IConverter getConverter() {
return new MyDateConverter();
}
});
MyDateConverter は Date から String への変換だけしか考慮していないので非常にシンプルなつくりになっています。Date 型を表示するためならこれで十分ですので自作が容易ですが、汎用的なコンバータを作る場合は任意のオブジェクトから任意のオブジェクトへの変換を考慮しなければなりません。上の例で MyDateConverter を使うラベルがあちこちにある場合は Label を継承して getConverter() にて MyDateConverter を返すようにすると便利です。
クラス図
コンバータ関連クラスを抜粋してみました。重要なインタフェースとしては IConverterFactory, IConverter, ITypeConverter があります。IConverterFactory が IConverter を生成する役割、IConverter が変換を担当します。ITypeConverter は IConverter から利用されるもので特定の型への変換を担当します。たとえば DateConverter, StringConverter, FloatConverter はそれぞれ java.util.Date, java.lang.String, java.lang.Float への変換を担当します。StringConverter の場合はさらに NumberToStringConverter と DateToStringConverter を内部で利用しています。
NoImage...
情報源 http://www.wicket-wiki.org.uk/wiki/index.php/Using_custom_converters
最新コメント