竹添 直樹(たけぞえ なおき)

 NTTデータ先端技術勤務。国産のオープンソースプロジェクトProject Amaterasのオーナーであり,SeasarプロジェクトやClick Frameworkでもコミッタを務めている。著書に「入門Wiki」「Eclipseプラグイン開発徹底攻略」(いずれも毎日コミュニケーションズ発行)などがある。


木村 真幸(きむら まさゆき)

 株式会社DTS ネットワーク事業本部 プロジェクトマネージャ。Javaを中心にフレームワーク開発や開発プロセス定義など幅広く活躍中。StrutsIDEコミッタ。著書「まるごとEclipse! Vol.1」(発行:インプレスコミュニケーションズ)。

そのフレームワーク,本当に必要ですか?

 JavaのWebアプリケーション・フレームワークのはしりといえば,なんといってもStrutsです。Strutsはデファクトスタンダードの地位を確立し,現在でも多くのユーザーに利用されています。しかし,Servlet APIに薄いラッパーを被せただけのシンプルなフレームワークであり,その後TapestryやJSF(JavaServer Faces)といったより高度に抽象化されたコンポーネント指向のフレームワークが登場したのは自然な流れといえます。

 コンポーネント指向のフレームワークでは,リクエストごとではなく,コンポーネントが発火するイベントに対するハンドラとして処理を記述します。これは既存のGUIアプリケーションと同様のモデルです。Servlet APIはコンポーネントによって隠ぺいされ,開発者はコンポーネントに対して値の取得や設定を行います。

 また,Tapestryは,ビューとしてプレーンなHTMLを用い,特殊な属性によってコンポーネントとの関連付けを行うことで既存のWebオーサリングツールで画面を作成することを可能にしています。JSFは,ビューにJSPを使用しているもののRADツールを強く意識した仕様であり,WYSIWYGで画面を作成することが可能な開発ツールが存在します。

 このようにコンポーネント指向のフレームワークは開発を容易にするために多くの工夫がされています。しかし,もともとステートレスなHTTPを媒体とするWebアプリケーションでこのような機能を実現するために,フレームワーク自体の実装はStrutsの時代と比べると非常に複雑なものになっています。開発者の利便性のしわ寄せをフレームワークが肩代わりしているわけです。フレームワークの存在意義を考えるとこれは正しいあり方だといえますが,本当にこのような複雑な実装が必要なのでしょうか? もっとシンプルに,同じだけの利便性を実現できないものなのでしょうか?

 その一つの答えがClick Framework(以下,Click)なのです。

Clickとは?

 Clickは,Malcolm Edger氏が中心となって開発されているJ2EE向けのWebアプリケーション・フレームワークです。筆者もコミッタとして参加しています。Clickには以下のような特徴があります。

  • フレームワーク自身が非常にシンプルにもかかわらずコンポーネント指向を実現している
  • 学習コストが低い
  • 動作が高速である(一説によるとTapestryの3倍,JSFの10倍と言われています)
  • 豊富なUIコンポーネントが用意されている
  • ドキュメントが非常に充実している

 オープンソースのフレームワークやライブラリを使用する場合,バグが存在した際の対応などは自己責任で行うことになるわけですが,Clickはフレームワーク自身がシンプルであるため,そのような場合の対応も比較的容易です。ドキュメントに関しては圧巻で,豊富なサンプルやJavadocを含め,開発するうえで必要なドキュメントはすべて揃っているといっても過言ではありません。残念ながらClickのドキュメントはすべて英語なのですが,筆者がClickの日本語情報を提供するWikiを運営していますのでぜひご覧ください。

 Clickの開発チームでは学習コストや性能を最重要視しており,これらを劣化させるような機能追加についてはたとえ便利な機能であっても非常に慎重です。いま一つ派手さには欠けますが,そのぶん手堅いフレームワークであるといえます。最新の技術をどんどん取り入れ,頻繁に仕様が変更されるフレームワークが多い中,性能面も含め業務でも安心して利用することができるフレームワークといえるでしょう。

Clickのアーキテクチャ

処理フローの全体像

 まずはClickの処理フローについて軽く触れておきましょう。Clickは,ClickServletという単一のサーブレットでリクエストを受け付けます。ClickServletは,リクエストされたパス(例えばindex.htm)に対応するページクラス(例えばIndexPageクラス)のインスタンスを生成し,処理を委譲します。

図1●Clickの処理フロー
図1●Clickの処理フロー

 ページクラスでは,ビューで使用するコンポーネントの設定やボタンなどがクリックされた場合の処理などを行います(ボタンにはクリックされたときに呼び出されるリスナーとして任意のメソッドを登録しておくことができます)。最後にClickServletは,リクエストされたパスに対応するページ・テンプレート(通常はVelocityで記述しますが,JSPも利用可能です)をクライアントへのレスポンスとしてレンダリングします。

 Clickのページクラスは,リクエストごとにインスタンスが生成されます。そのためスレッドを意識する必要はなく,安全なプログラミングが可能です。確かにリクエストごとに毎回ページクラスを生成するオーバーヘッドは発生しますが,それを差し引いても充分にClickは高速なのです。

ページの処理シーケンス

 ページクラスについてもう少し詳しく見ていきましょう。ページクラスは,処理シーケンスに応じて呼び出されるいくつかのメソッドが用意されています。それぞれのメソッドが呼び出されるタイミングと順序は図2のようになっています(このシーケンス図は説明をわかりやすくするために簡略化して記述しています)。

図2●ページの処理シーケンス
図2●ページの処理シーケンス
[画像のクリックで拡大表示]

 この図はGETメソッドの場合ですが,POSTメソッドの場合もonGet()メソッドの呼び出しがonPost()になるだけで流れは同じです。処理シーケンスはそれなりに複雑なのですが,通常ページクラスでオーバーライドする必要があるのは以下のメソッドです。

(1)コンストラクタでモデルやコントロールを初期化する

 コントロールやモデルのインスタンスを生成します。この段階ではまだContextオブジェクトがセットされていませんので,リクエスト・パラメータなどの取得を行うことはできません。

(2)onInit()メソッドで初期化処理を行う

 ここではすでにContextオブジェクトがセットされています。リクエストやセッション・パラメータが必要な初期化処理を行う場合は,このメソッドに実装します。また,ページクラス内でデータベースに接続する場合など,このメソッド内で接続し,onDestroy()メソッドで切断するというような実装にするとよいでしょう。

(3)onDestoroy()メソッドで終了処理を行う

 このメソッドは,処理中に例外が発生した場合や途中で処理が中断された場合でも必ず呼び出されます。リソースの解放など,ページで必ず行わなければならない終了処理がある場合はここに実装します。

 また,上記に加え,必要に応じてボタンやリンクがクリックされた際に呼び出されるリスナー・メソッドを実装することになります。

ClickIDE

 Clickプロジェクトでは,フレームワーク本体に加えて「ClickIDE」というEclipseプラグインを提供しています。前述の通り,Clickは非常にシンプルで学習コストも低いためClick単体でも容易に開発を行うことは可能ですが,ClickIDEを導入することでより簡単に開発を行うことができます。ClickIDEは以下のような機能を提供しています。

  • WTP(Eclipse Web Tools Project)の動的WebプロジェクトにClickのライブラリや設定ファイルのひな型を追加可能
  • Clickの設定ファイルをビジュアルに編集するためのエディタ
  • 強調表示と入力補完機能を備えたVelocityテンプレート・エディタ
  • ページクラスとページ・テンプレートを生成するためのウィザード
  • Clickの設定ファイルおよびVelocityテンプレートのバリデーション機能

 ClickIDEは,こちらからダウンロードできます。

 ダウンロードしたアーカイブを解凍すると,features,pluginsという二つのフォルダが現れます。これをEclipseのインストール・フォルダ配下の同名のフォルダに上書きします。なお,ClickIDEの動作には,Eclipse 3.2およびWTP 1.5が必要です。

 本稿では,Windows XP環境のEclipse 3.2+WTP 1.5に,ランゲージ・パックを導入して日本語化した環境を前提に解説を行います。また,動作確認用のアプリケーション・サーバー(Apache Tomcat 5.5など)をインストールしておいてください。以下,本稿執筆時点の最新版であるClick 1.1,ClickIDE 1.5.1の環境を前提に解説を行います。