Wicketで始めるオブジェクト指向ウェブ開発

第2回 コンポーネントとモデル

この記事を読むのに必要な時間:およそ 4.5 分

時刻を表示する

では実際に,Labelを使って自動的に切り替わるメッセージを表示してみます。Labelに「そのときの時刻をとってくるモデル」を渡せば,Labelは毎回モデルから時刻を取り出して表示します。

リスト4 Labelに時刻を返すモデルを渡す例

add(new Label("message", new AbstractReadOnlyModel<String>() {
  public String getObject() { 
    return new SimpleDateFormat("HH時mm分ss秒").format(new Date()); 
  }
}));

AbstractReadOnlyModelが,⁠モデル」と呼んできたものです。Wicketのモデルとは,IModelインタフェースを実装したオブジェクトです。IModelから値を取り出すにはgetObject()メソッドを使用します。逆にIModelにデータを与えるには,setObject()メソッドを使用します。

AbstractReadOnlyModelは,モデルに値を与える必要がない場合に使用します。AbstractReadOnlyModelではsetObject()は使用できません。getObject()のみが有効になっており,このメソッドをオーバーライドすることで,データを提供する読み取り専用のモデルを実現します。

今回は,getObject()が呼び出されるたびに現在時刻を文字列として返すよう,getObject()メソッドを定義しました。

mvn jetty:runコマンドでアプリケーションを起動し,http://localhost:8080/wicket-sample/top にアクセスしてください。以前はメッセージが表示されていたところに,今度は現在時刻が表示されています。

図1 現在時刻を表示するページ

図1 現在時刻を表示するページ

ブラウザの再ロードボタンを押すと,押すたびに時刻が変わります。Labelがモデルから表示データを取得することで,表示が切り替わっているのです。Labelはデータ提供者となるモデルを内部に保持することで,自分で再ロードのたびに表示内容を切り替えるのです。

プッシュからプルへ

Wicketはオブジェクト指向のWebアプリケーション・フレームワークです。ページはオブジェクトの組み合わせによって作成します。そして,オブジェクトは自分自身のことを知っています。Labelは自分自身を表示すべきかどうかを自分で管理します。Labelの表示内容は外からセットされるのではありません。WicketはLabelに「自分自身を表示しろ」と指令するだけです。あとはLabelが自分でモデルからひっぱり出し,HTMLタグを変更します。

オブジェクトは能動的なのです。必要なことは自分で行おうとします。プログラマは,それらオブジェクトの動作をプログラムすることで,アプリケーションの動きを変えるのです。

オブジェクト自身に仕事をさせる

文字列の表示・非表示の切り替えを「手続きの流れ」としてプログラムを考えた場合,次のような流れになるでしょう。

  1. 全体を管理するプログラムが状態をチェックする
  2. 表示すべき状態でないならば,そのプログラムがLabelの表示・非表示フラグを切り替える

読者のみなさんも,⁠LabelにsetVisible()のようなメソッドがあって,プログラムからsetVisible(false)を呼び出すことでLabelの表示を切り替える」といった流れのほうがなじみがある,という方も多いでしょう。

一方Wicketでは,isVisible()メソッドが呼ばれたときにLabel自身がその時々の状況,自分の状態に応じてtrue/falseを返すべきだ,という考え方をします。表示・非表示はオブジェクトの属性なのだから,オブジェクト自身が判断して結果を返せばよい,と考えるわけです。

オブジェクトの外で判断してオブジェクトの状態をセットする(プッシュする)のではなく,オブジェクト自身に自分の状態を管理させて,必要であれば外部から「表示してもよいか」と情報をひっぱる(プルする)のです。情報をひっぱったときの状況に応じて,オブジェクト自身がtrueかfalseかを判断して返します。そのため,⁠表示すべきかどうか」という判断は,オブジェクトの外側ではなく,オブジェクトの中に書くことになります。isVisible()メソッドをオーバーライドして,そこに状況を判断するプログラムを書くのです。

プッシュ型からプル型への考え方の変更は,Wicketを使いこなす上で重要なポイントです。オブジェクト指向的なプログラムが作成できるかどうかは,⁠オブジェクト自身に自分の仕事をさせる」という手法でプログラムを書けるかどうかにかかっています。

入力をコントロールする

この回では,Wicketはコンポーネントとモデルというオブジェクトを組み合わせてページを作成することを紹介しました。たったひとつのコンポーネント「Label」を使っただけではありますが,オブジェクト自身が自分の動作を決定するようにプログラムを書いていく,という感じは伝わったかと思います。

途中でさりげなく,IModelインタフェースにはgetObject()だけではなく,setObject()というメソッドがあることに触れました。このメソッドが次回の主役です。コンポーネントに入力されたデータをデータ管理者たるモデルに渡す方法について,次回紹介します。そのために,簡単なtwitterクライアントを作成していきたいと思います。

著者プロフィール

矢野勉(やのつとむ)

フリーランスのプログラマ。Wicket-ja主催。

ウェブ・アプリケーションの開発を中心にさまざまな案件に関わってきました。現在はWicketによる開発を支援しています。

URLhttp://d.hatena.ne.jp/t_yano/

著書