写真1●サンプル・アプリケーションのトップページ
写真1●サンプル・アプリケーションのトップページ
[画像のクリックで拡大表示]
図1●ページフロー
図1●ページフロー
[画像のクリックで拡大表示]
図2●ステートマシン図
図2●ステートマシン図
[画像のクリックで拡大表示]

 J2EE Web アプリケーションのデファクトフレームワークである Apache Struts の開発プロジェクトに,Shale Framework(以降,Shale) というサブプロジェクトが作成されているのをご存知だろうか。Shaleは次世代のStrutsとなるべくして提案されたWebアプリケーションフレームワークだ。今回は,このShaleを紹介する。

ShaleはStruts2.0として提案された次世代フレームワーク

 Shaleは当初 Struts2.0として Strutsの開発チームに提案された。しかしStruts1.X系からはあまりにも変化が激しくStrutsとは別のものとして開発することになったものだ。

 このShaleの中心人物は,Strutsの生みの親でありかつ JSF1.0/1.1 のスペックリードでもあるCraig McClanahan氏だ。ShaleはStruts1.Xで培った数々のノウハウやフィードバックをJSF(JavaServerFaces)(注1)を拡張することで反映している。StrutsとJSFの生みの親,Craig氏が新しく提供するShaleとはいったいどのようなものだろうか。

注1:Shaleは前述したように,JSFをベース・テクノロジとしている。JSFをあまりご存知ない方は,本連載の第11回「JSFでStrutsは不要になる?答えを握るStruts-Facesとは」をご覧いただきたい。

Shaleの概要と機能

 Shaleは,JSFを拡張することで以下のような機能を提供する

・View Controller    : ビュー管理
・Dialog Manager     : ページフロー管理
・Application Manager: アプリケーション管理
・Validation         : 入力検証
・Remoting           : AJAXサポート
・Spring Integration : Spring Frameworkとの統合
・Reusable Views     : 再利用可能なビュー管理
・Test Framework     : 単体テスト
 まだ開発途中ではあるが,AJAXやSpring Frameworkといった現在注目のテクノロジとの融合や,単体テストや入力検証といった一見地味だが重要な機能をFramework自身の機能として提供しようとしている。

 では,ShaleはJSFをどのように拡張し,どのような振る舞いをするのだろうか。Shaleに付属するサンプル・アプリケーションを例に,その仕組みを紹介しよう。

 Shaleを試すためには,まず入手する必要があるが,残念ながらShaleはまだ正式リリース版は配布されていない。しかし,ナイトリ・ビルドのディストリビューション・パッケージが入手可能だ。現在,以下の4種類が提供されている。

・Core Library..........Shaleのコア

・Clay Plug-In..........再利用可能なビュー部品

・Test Framework........Shaleアプリケーション用,Shale自身用のJUnitの基底クラス

・Use Case Sample App...サンプルアプリケーション集

 この中の「Use Case Sample App」にはwar形式のサンプル・アプリケーションが内包されている。このファイルをWebコンテナにデプロイすればすぐにShaleを試すことができる。

 まずは,ShaleがどのようにしてJSFの機能を拡張しているのか見てみよう。その答えはサンプルのWebデプロイメント・ディスクリプタ(web.xml)を参照すればすぐに分かる。このファイルにはサーブレット・フィルタ shale が定義されており,JSFのコントローラであるFacesServletよりも先にリクエストの処理を行うようになっている。このように,JSFへのリクエストを横取りし独自の機能をJSFアプリケーションに追加するようになっているのだ。


リスト1●web.xml抜粋

  <!-- Shale Application Controller Filter -->
  <filter>
    <filter-name>shale</filter-name>
    <filter-class>
      org.apache.shale.faces.ShaleApplicationFilter
    </filter-class>
  </filter>

  <!-- Shale Application Controller Filter Mapping -->
  <filter-mapping>
    <filter-name>shale</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 サンプルを起動すると,写真1のようなトップページが表示される。