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

第8回 組み込みAjax機能で動的に変化するページを実現する

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

最新状態にあわせてラベル表示を切り替える

今回新しいラベルクラスを定義したのは,ページの部分更新を行う場合には,ページ全体が一斉に更新される場合とは異なる配慮が必要だからです。

ページ全体が更新される場合は,各行のstatusオブジェクトの状態を見れば,その行がお気に入り登録済みか否かを簡単に確認できました。ラベルとリンクは常に同じタイミングで更新されたからです。

部分更新ではすこし状況が異なります。ユーザがクリックすると,まずAjaxLink内でTwitterにリクエストが投げられ,ステータスがお気に入りに登録もしくは解除されます。これはTwitterサイト側で行われます。そして次に,ラベルだけが更新対象に加えられます。ラベルは再描画指令に答えるべく,自身の状態を確認します。ここでstatusオブジェクトの状態を確認することに意味はありません。先程リンクをクリックしたことで,Twitter側ではステータスの状態が変化しているのです。もはやstatusは古い情報を持っているにすぎません。ラベルが正しく表示されるには,ステータスの今の状態を再取得するしかありません※2⁠。

かといって,表示のたびに1つ1つのラベルが最新状態を再取得する必要があるわけでもありません。ラベルを表示する度にTwitterにアクセスするようプログラムしてしまうと,ページ表示時にListViewの行数分のアクセスが発生してしまいます。再取得が必要なラベルは,お気に入りリンクがクリックされたステータス上にあるラベルのみです。

「ステータスの再取得が必要かどうか」を判断するための基準として,ローカルクラスFavoriteLabelはneedRefreshフィールドを持っています。FavoriteLabelはneedRefreshフィールドがtrueのときだけ,Twitterから該当ステータスを再取得します。trueにならない限りは,保持しているステータス情報をもとに表示を行うのみです。

改めてお気に入りリンク部分のプログラムを見直してみると,ラベルにステータス再取得を促している行があることに気がつくでしょう。

リスト7 FavoriteLabelのneedRefreshフラグをtrueにする

favName.setNeedRefresh(true);

お気に入りリンクは,クリックタイミングでFavoriteLabelオブジェクトの状態を変化させ,その後に部分更新を促しているのです。更新要求を受けたFavoriteLabelは,自分の状態をもとに新しい表示文字列を確定します。リンクとラベルが連携しつつも,行っていることは「ステータスの再取得が必要」というフラグを立てているだけです。お気に入りリンクがラベルに新しいステータスを「プッシュ」するのではなく,⁠情報の更新が必要ですよ」と伝えているだけです。あとはFavoriteLabelが自主的に情報を取得して描画を行います。

※2
お気に入り登録状態を反転(登録なら解除,解除なら登録へ)すれば良いと考えるかもしれませんが,状況はもう少し複雑です。Twitterへのお気に入り登録処理は,何らかの理由で失敗している可能性もあります。

部分更新とオブジェクト指向

ページの部分更新を採用すると,いままでは「ページ」という大きな単位で考えればよかったものが,もう少し狭い「コンポーネント」の単位で考える必要が出てきます。ページはもはや,ページ全体として一括更新されるものではなく,部分部分で別々に更新されるものとなりました。

ページ一括更新の世界では,すべての状態をページに集中して,ページ全体の更新タイミングで状態を確認するだけで問題ありませんでした。部分更新を採用すると,コンポーネントの単位で状態を持つべきケースが出てきます。FavoriteLabelがその例です。コンポーネント単体で更新される場面が出てきます。そのコンポーネントがどう表示されるべきかは,コンポーネントが単独で判断しなければならないのです。

部分更新の世界では,ページは全体で1つではなく,オブジェクトの塊となります。それぞれが個別に状態をもち,個別に描画できるコンポーネント同士が,互いに状態を変化させることでページが構成される世界です。

サーブレットでのプログラミングでは想像のできなかった,オブジェクト指向プログラミングの世界です。Wicketでは,Webアプリケーションを「処理の振り分け」ではなく,⁠それぞれが独自の機能をもったオブジェクトの組み合わせ」として作ることができるのです。部分更新機能では,その特徴がよりはっきりと現れます。

Javaのすべての機能をつかってプログラミングする

コンポーネントとモデル,ビヘイビアといったWicketの機能により,アプリケーション機能はさまざまな単位のオブジェクトに分割できます。この連載では,Wicketが備えるオブジェクト指向開発をサポートする機能を,おおまかではありますが紹介してきました。

それに加え,Wicketでは匿名サブクラスやローカルクラスなど,Javaに本来備わっていつつもあまり使われない機能をも有効に使える場面が多くあります。Javaらしいオブジェクト指向の世界を作り上げているため,Javaのオブジェクト指向言語としての機能をフルに発揮できるのです。いままでWebアプリケーションではあまり使われなかったオブジェクト生成手法も,Wicketでは便利に使えます。

もちろん制限はゼロではありませんが,サーブレットに比べると遥かにJavaらしいオブジェクト指向をベースにプログラムを作ることができるのが,Wicketでプログラミングする魅力です。

次回:OAuth対応

次回は本連載の最後として,いままでに作成してきたアプリケーションのログイン部分を,OAuthを利用したものに変更します。OAuthを使った認証を行うためにはWicketアプリケーション外部との情報のやりとりも必要となります。いままではほぼすべて,アプリケーション内部での情報のやりとりでした。外部サイトとのやりとりを行うためには,オブジェクトによるやりとりではなく,URLによるやりとりが必要になります。OAuth化を行うことで,Wicketでの外部サイトとの連携方法を見ていきたいと思います。

著者プロフィール

矢野勉(やのつとむ)

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

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

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

著書