ModelとPropertyModel

Modelとは

Wicketでは全てのコンポーネントはModelと紐付けることができる。WicketにおけるModelとはデータを入れたり出したりできる器のようなもの。要するに、画面とロジックでの値の受け渡しはModelを経由するということ。

簡単な例

SamplePage.java

SamplePage.html

実際の表示

初期表示
wicket_model_01-01.png

編集
wicket_model_01-02.png

送信後結果
wicket_model_01-03.png

入力値は、指定したIDに紐付くModelクラスに自動で設定される。またModelクラスにJava内で値を設定することで表示値を変えることもできる。

PropertyModel

基本的には上記のModelクラスで値のやり取りはできるが、入力箇所が多くなればなるほどこの方法だと面倒になる。

  • 入力項目全てについてModelを作成するのがめんどくさい
  • 入力項目をひとつのBeanにまとめてしまいたい
  • 複数のレコードを修正できる一覧表形式の修正画面を作りたい

上記のような場合は、PropertyModelを使うと楽になる。

簡単な例

クラスの変更点は以下。htmlは変更無し。

PropertyModel(Object, String)を使用すると、Object(今回は自分自身を指定)のうちStringに該当するフィールドを探し出し、そこに対してget/setを行ってくれるので、いちいちデータ保持用のModelを作成したり操作したりせずに済む。ちなみに、上記のようにgetter/setterメソッドが無くてもフィールドが存在すれば動いてくれるらしい…が、一応getter/setterメソッドは用意したほうがいいだろう。もちろん、フィールドを用意せずにダミーのgetter/setterを作り、そのメソッド名を指定することもできる。

一覧形式で、複数レコードの修正を行う画面の例

複数件のSampleEntityを画面に一覧表示し、画面でSampleEntityデータを修正できるという感じのサンプル。

クラスは以下。

HTMLは以下。

実際の表示

初期表示
wicket_model_02-01.png

編集
wicket_model_02-02.png

送信後結果
wicket_model_02-03.png

そう考えると、普通のModelクラスを使う機会はかなり少ないかもしれない。

CompoundPropertyModel

PropertyModelからさらに手抜きするためのクラスとして CompoundPropertyModel がある。

ModelやPropertyModelでは、コンポーネントをnewする度にモデルもnewしコンポーネントに追加していたが、CompoundPropertyModelを使用した場合コンポーネントにモデルを追加することすら省略できるようになる。

使い方は今までの2つとは若干異なっていて、「追加したいコンポーネントに」モデルを追加するという今までのやり方に対し、CompoundPropertyModelの場合は「追加される方のコンポーネントに」追加することになる。

具体的には、このようなクラスの中身を出力する処理をつくるとして

PropertyModelの場合はこのように書くところを

CompoundPropertyModelならこう書ける。

こうすると、Formに追加したCompoundPropertyModelのbeanから、Labelに設定したIDと同名のプロパティを表示するようになる。ただし、コンポーネントのIDとCompoundPropertyModelのbeanのプロパティを一致させなければならないという制約もある。つまり

このようにLabelのIDとbeanのプロパティ名を別にしたい場合はPropertyModelを使おう。