モデル
モデルはコンポーネントとデータを関連付ける役割を担っています。たとえば Label は表示用の文字列を、TextField は入力された値がセットされる変数を、ListView はリスト対象の java.util.List をモデルを介して取得します。
モデルにはインターフェース IModel を頂点として様々なクラスが用意されており、用途に応じてそれらを使い分けることになります。コンポーネントにモデルを設定するには IModel を受け取るコンストラクタを使うか setModel() メソッドを使います。
(Label のコンストラクタでモデルを指定する)
new Label("hello", new Model("Hello, World));
クラス図
次の図はモデルに関するクラス図です。多くのインターフェース、クラスがありますが、通常は濃い色のクラスを使うことになるでしょう。以降で順に説明します。
NoImage...
Model
最も基本的なモデルクラスです。ラベルや簡単なフォーム入力で頻繁に使います。
(ページに Label を追加する)
add(new Label("hello", new Model("Hello, World")));
使うときはコンストラクタか setObject() でデータをセットします。public Model(Serializable object) public void setObject(Serializable object)上記のとおり Model に渡せるのは Serializable を実装するオブジェクトです。このオブジェクトはセッションに保存され、クラスタ環境ではレプリケーションの対象となります。
PropertyModel
オブジェクトのプロパティにアクセスするモデルクラスです。対象のオブジェクトとプロパティを指定する式をコンストラクタに渡して作成します。下記の Person クラスの name プロパティにアクセスする場合を考えてみます。
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
name プロパティを Label に関連付けるには下記のようにします。
Person person = new Person();
person.setName("akira");
add(new Label("nameLabel", new PropertyModel(person, "name")));
PropertyModel コンストラクタの第 2 引数がプロパティを指定する式でこの例のように単純なプロパティ名や . (ドット) を使った記法 (例 name.firstName) が使えます。{footnote:Wicket 1.1 では OGNL により解釈されるので OGNL 式が使えます。Wicket 1.2 からは独自の実装を使うようになりました。情報源: http://www.wicket-wiki.org.uk/wiki/index.php/Migra...CompoundPropertyModel
親子関係のコンポーネントでモデルを共有します。POJO をコンポーネントツリーにバインドすると考えるとわかりやすいと思います。 POJO の内容を複数のコンポーネントを用いて表示したり、フォーム入力を POJO で受ける場合に使います。たとえば下図の左のようなコンポーネントツリーがある場合を考えます。
NoImage...
右がフォームクラスのソースです。コンストラクタにて CompoundPropertyModel を使って Person クラスを関連付けています。 Person クラスは先ほどの PropertyModel と同じもので、name と age の二つのプロパティを持っています。
add(new TextField("name"));
add(new TextField("age"));
TextField にはモデルを渡していませんが、親コンポーネントのモデル CompoundPropertyModel をコンストラクタに渡した ID でルックアップすることでプロパティと関連付けられます。BoundCompoundPropertyModel
CompundPropertyModel では ID を使ってプロパティと関連付けられましたが、関連付けをもっと柔軟に行えるのが BoundCompoundPropertyModel です。bind() メソッドでコンポーネントとプロパティを関連付けます。下記例では id="name" の TextField をプロパティ firstName に関連付けています。
super("form");
BoundCompundPropertyModel model = new BoundCompoundPropertyModel(new Person());
setModel(model);
add(model.bind(new TextField("name"), "firstName"));
add(model.bind(new TextField("age"), "age"));
StringResourceModel
リソースバンドルから表示用の文字列を取得するモデルです。2 つのコンストラクタが用意されています。
StringResourceModel(String resourceKey, Component component, IModel model) StringResourceModel(String resourceKey, Component component, IModel model,Object[] parameters)第 1 引数で properties ファイルでのキーを指定します。第 2 引数は properties ファイルを検索するための基準となるコンポーネントです。第 3, 第 4 引数を使うと凝った表示ができますが、ここでは単純な例を見てみましょう。
MyPage クラスのラベルに properties ファイルから取得した文字列を指定してみます。
MyPage.java
add(new Label("nameLabel", new StringResourceModel("label.name", this, null)));
下記の内容で MyPage.properties を作成します。label.name=Nameこれで、Label の値に "Name" が使用されます。
LoadableDetachableModel
リクエストの処理開始時に任意の Object をセットし、終了時に null をセットするモデルです。そのため Object 自身はセッションに保存されません。主に DB などから再取得可能で大きなデータな扱うときに用います。
使うときは Object を取得するように load() メソッドを実装します。下記例では load() にて DB からすべてのメッセージを取得する LoadableDetachableModel を ListView (のサブクラス) に割り当てています。
public MessageListView(String id) {
super(id, new LoadableDetachableModel() {
protected Object load() {
return messageDao.findAllMessages();
}
});
}
最新コメント