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

第5回 Twitterタイムラインで見るWicketのオブジェクト指向プログラミング(前編)

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

タイムラインの表示

モデルができてしまえば,タイムラインはListViewのpopulateItem()メソッドを実装することで簡単に作成できます。

サンプルコードでは,次のようにListItemに次々とコンポーネントを追加することで,1行分のコンポーネントを構築しています。

リスト4 Twitterタイムラインの構築

final Status status = item.getModelObject();
String userUrl = "http://twitter.com/" + status.getUser().getScreenName();
ExternalLink imageLink = new ExternalLink("imageLink", userUrl);
Image userImage = new Image("userImage", new WebResource() {
    @Override
    public IResourceStream getResourceStream() {
        return new UrlResourceStream(status.getUser().getProfileImageURL());
    }
});
imageLink.add(userImage);
item.add(imageLink);

ExternalLink screenNameLink = new ExternalLink("screenName", userUrl, status.getUser().getScreenName());
item.add(screenNameLink);
(以下省略)

見慣れないクラスはあるでしょうが,プログラム例「ListViewの使い方」で見たのと同じように,ListItemコンポーネントにLabelなどのコンポーネントを追加していっているだけなことがわかるでしょう。

ここではじめて出てきたコンポーネントが2つあります。1つはExternalLinkクラスで,その名の通りアプリケーション外部へのリンクを動的に生成するためのコンポーネントです。最も単純な使い方は,この例のように,第2引数としてリンク先URL文字列を渡すことです。第3引数はページ上に表示するリンク文字列です。

もう1つはImageコンポーネントです。画像を動的に生成して表示するコンポーネントです。HTMLの<img>タグに適用します。

Imageコンポーネントの第2引数は,WebResourceです。これは,Wicketがページ以外のリソースを扱うために扱うためのクラスです。

WebResourceとResourceStream

WebResourceは画像や文字列,ファイルといった情報を扱うためのクラスです。Wicketではそれらを「Resource」というクラスで扱います。WebResourceクラスは,Wicketが標準で提供している,Resourceの唯一のサブクラスです。

Resourceの一番大きな役割は,ResourceStreamを作り出すことです。ResourceStreamは,サーバ側にあるファイルなどのリソースとブラウザの間にある「データの流れ(ストリーム⁠⁠」を表してます。ブラウザはストリームを読み込むことで,サーバからリソースを取得するのです。

サンプルでは,WebResourceのgetResourceStream()メソッドをオーバーライドすることでResourceStreamを作り出しています。ResourceStreamにはFileResourceStream, ZipResourceStreamなど,標準で多くのクラスが提供されていますが※2⁠,ここでは特定URLからデータを取得してストリーム化するためのUrlResourceStreamを使用しています。

今回のサンプルにおけるImageコンポーネントの役割は、ユーザのアイコン画像を表示することです。画像URLはstatus.getUser().getProfileImageURL()で取り出すことができますので,このURLをUrlResourceStreamに渡すだけで,簡単にResourceStreamを生成できます。

Imageコンポーネントを<img>タグに適用すると,WebResourceへのURLを動的に生成し,<img>タグのsrc属性に挿入します。ブラウザはsrc属性を見てWicketにアクセスしてきますので,WicketはWebResourceからResourceStreamを作りだし,ブラウザにデータを返却するのです。

WebResourceを使えば、画像はもちろんのこと、ファイルやバイナリデータなど、多彩なデータをWicketで扱うことができます。ResourceStreamにも多彩なクラスが用意されており、クラスを差し替えるだけで多くのことを実現できます。Wicketは、ストリームもオブジェクトとして扱い、再利用可能としているのです※3⁠。

※2
すべての標準ResourceStreamを知るには,WicketのJavadocから「IResourceStream」インタフェースを参照してください。IResourceStreamインタフェースを実装するすべてのクラスが列挙されています。
※3
サンプルプログラムではWebResourceの使い方サンプルとして敢えてImageコンポーネントを使用していますが、実は、すでにURLがわかっている画像を表示するにはImageコンポーネントはパフォーマンス面でデメリットがあります。一番よい方法は、<img>タグのsrc属性に直接URL文字列を埋め込むことです。ブラウザのキャッシュも効くため、高速に画像が描画されます。その方法は次回以降に紹介します。

次回:リンク

ウェブページにおいて必ず使うものといえば、やはりリンクでしょう。リンクがなければウェブは成り立ちません。

WicketではリンクはLinkというコンポーネントによって扱うことができます。Linkコンポーネントを使うことで、ページ上のあらゆるタグをクリック可能にできます。

次回は、Linkコンポーネントを使って各行にリンクを生成します。

著者プロフィール

矢野勉(やのつとむ)

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

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

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

著書