Wicket Examples - unicode converter編 -

「サンプルのソースを見る」の第3回、unicode converter編。このサンプルでは、

  • CompoundPropertyModelというModelの使い方
  • 自分でModelを実装する方法
  • フォームのドロップダウンリスト、テキストエリアの使い方

がなんとなくわかります(^_^;)。

アプリケーションクラス(UnicodeConverterApplication.java)

まずは、アプリケーションクラスです。こちらは、ホームページクラスを返しているだけなので、割愛します。

Pageクラス(UnicodeConverterApplication.java)

次に、Pageクラスです。Echoサンプルでは、フォームの外の要素とフォームの中の要素で同じModelを参照していたわけですが、同じフォーム内で同じModelを参照したい場合もあると思います。この場合に、PropertyModelを使うのもいいのですが、このサンプルではCompoundPropertyModelという別のModelを使用しています。

	public UnicodeConverter()
	{
		Form form = new Form("form", new CompoundPropertyModel(this));
		form.add(new TextArea("source"));
		form.add(new DropDownChoice("translationType", translationTypes));
		form.add(new TextArea("target", new ConverterModel()));
		add(form);
	}

PropertyModelとは違って、

となっています。こうすることで、Formコンポーネントの子コンポーネントは、コンストラクタでModelが指定されない場合は、Formコンポーネントのコンストラクタで指定されたCompoundPropertyModelを参照するようになるみたいです(最初のTextAreaコンポーネントとDropDownChoiceコンポーネント)。CompoundPropertyModelに設定されたBeanのどのプロパティを参照するのかは、どうやら、各コンポーネントのコンストラクタで指定されたidと同じプロパティを参照するようです。

2つめのTextAreaコンポーネントは、Modelを明示的に指定していますので、Formコンポーネントに指定したCompoundPropertyModelは使用されません。その代わりに、AbstractModelを継承する独自のModelクラス(内部クラス)を作成し、それを指定しています。

	private final class ConverterModel extends AbstractModel

コンポーネントは、指定されたModelを通じて値を設定したり取得したりするようです。そのメソッドがこれみたいです。

		public Object getObject(Component component)
		public void setObject(Component component, Object object)

このサンプルでは、1つめのTextArea(左側)に入力された内容を、ドロップダウンリストの内容にもとづいて変換し、2つめのTextArea(右側)に設定します。1つめのTextAreaに入力された内容は、CompoundPropertyModelが指定されていますので、ConverterModelクラスの外側のクラス(UnicodeConverter)のプロパティsourceに設定されます。
2つめのTextAreaコンポーネントレンダリングする際、ConverterModelクラスのgetObjectメソッドが呼ばれ、外側のクラスのプロパティsourceの値をtranslationTypeに応じて変換し、変換した値が返されます。この値が、2つめのTextAreaの値になります。
特に値を保持する必要がないので、setObjectメソッドは空実装になっているようです。
自分でModelを作ることで何がうれしいのか?ですが、動的に生成したり(このサンプルみたいに)、外(DBから、ファイルから)から値を取得したりすることできる、ということでしょうか。

さて、Modelの話はこんな感じで、次はコンポーネントです。ここでは、TextAreaコンポーネントと、DropDownChoiceコンポーネントが新た使用されています。TextAreaの方は、他のコンポーネントと同様にid(とModel)を指定してインスタンスを生成しています。DropDownChoiceコンポーネントの方は、idと、選択肢が入ったリストを指定してインスタンスを生成しています。
DropDownChoiceコンポーネントには、CompoundPropertyModelが指定されていますので、"translate"ボタンが押下されると、translationTypeプロパティに選択した値が設定され、この値にもとづいて左側のTextAreaの変換と、画面をレンダリングする際ドロップダウンリストの選択項目の指定がなされるようです。

HTMLテンプレートページ(UnicodeConverter.html)

最後に、HTMLテンプレートページです。TextArea、ドロップダウンリストとも、特に変わったところはなく、wicket:idを設定しています。

		    <textarea wicket:id="source" rows="10" cols="40">input</textarea>
		    <select wicket:id="translationType"></select>