ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

Shale



ちょっと間が空いてしまいましたが、JavaOneTokyoでの
気になったセッションを個別に書いていきたいと思います。
今回はStrutsの後継とされる「Shale」です。
後継とは言っても、実際にはJSFをベースに機能を追加した
全く新しいフレームワークといった方が適切でしょう。
速報でもお伝えした通り、Shaleを使いこなすためにはJSF
の知識が必要になってきます。


まず基本的な構成ですが、ShaleJSFの土台の上にフィルタと
リスナーの集合体として実装されています。基本となるのは
org.apache.shale.faces.ShaleApplicationFilterです。
ですので、最も基本的な構成ではweb.xmlJSFのFacesServlet
とShaleApplicationFilterの定義が記述される形になります。
それに加えて、各機能毎にフィルタと設定ファイルが用意されて
います。例えば、階層化されたUIの部品化を実現する「Clay」
という仕組みがあるのですが、これはclay-config.xmlファイル
とorg.apache.shale.clay.config.ClayConfigureListenerと
いうフィルタを追加することで利用可能になります。このように
必要な機能を取捨選択できるのもShaleの優れた点の一つですね。


後は気になった点を順に見ていきたいと思います。


[Springとの統合]
通常のBacking Beanの呼び出し記述と全く同じ形でSpring側で
定義されたBeanを参照できます。しかも、通常のBacking Bean
と同様に#{...}で参照した際にBeanがまだ生成されていなければ
SpringのBean Factoryを呼び出してくれます。これはSpring側
のorg.springframework.web.context.ContextLoaderListener
を利用しているみたいです。当然ながら、参照先のBeanに対して
DIの機能を活用できますので、Backing Beanに対してSpringの
機能を活用できるというのは大きなメリットだと思います。


[ビューコントローラー]
コントローラーという名称からすると、複数のビュー間の遷移を
処理するようなイメージがありますが、実際には一つ一つのJSF
ページと密接に結びついた特殊なBacking Beanを提供するもの
です。Backing BeanにはJSFページ内に表示するデータを保持
するという役割と各種のイベントハンドラの実装場所という2つ
の役割があるかと思います。ですが、いずれの役割に関しても
一つのBacking Beanを幾つのJSFページと結びつけるのか?
というのはとても悩ましい問題でした。その辺りを最初に整理
しておかないと、個々のJSFページとBacking Beanとの関連が
ごちゃごちゃになってしまいます。今回のビューコントローラ
はこれを解消してくれる一つの道ではないかと期待しています。
個々のJSFページに表示するデータ保持はビューコントローラ
に集約し、複数ページにまたがる処理やデータの授受はBacking
Beanに記述するといった感じです。イベントハンドラも同様に
ページ内で完結するものはビューコントローラに実装し、複数
ページで共有されるものなどはBacking Beanであったり、別
クラスで定義するなりというようにすれば、以前よりは整理が
つきやすくなるかと思います。
また、ビューコントローラではinit()/preprocess()/prerender()
/destroy()といったJSFのライフサイクルに応じたコールバックの
メソッドを容易に実装できますので、FacesListenerを使わなくても
JSFライフサイクルの各場面で個別のJSFページの状態を操作できます。
これも裏方的な機能ではありますが、実際のアプリケーション開発の
場面では重宝しそうです。


[ダイアログ]
これも名称からはイメージしづらいですが、「Spring Web Flow」の
ような高度な画面遷移を記述できる機能です。詳細な情報はまだあまり
出されていないようですが、dialog-config.xmlというファイルにXML
で記述されたロジカルな画面遷移を定義する形になるようです。IDE
対応すれば、単純な画面遷移だけでなくロジックも含めた複雑なフロー
をビジュアルに作成できるようになるのではないかと期待しています。


[Tilesとの連携強化]
JSFをTilesと組み合わせて利用することは以前から可能でしたが、
ナビゲーションの遷移先であるにTilesの定義名を
直接指定することができるようになりました。


[Clay]
階層化されたUI部品を再利用可能な形で提供することを目的とした
機能です。web.xmlの中にタグとタグなどを
使ってビュー定義を記述します。個々のUI部品はタグ
を使い、識別子としてjsfidという属性を付けます。他のUI部品を
ネストしたい場合にはタグを子タグとして記述し、jsfid
でネストしたいUI部品を指し示します。UI部品の再利用という意味で
とても有効なのですが、特筆すべきなのはこのjsfidを使った参照の
仕組みを使ってTapestryで実現しているような画面モックアップ
作成が可能になることです。Clayでは定義されたビューのレイアウト
を指定する方法として
1. Clayで提供されているコンポーネントを使ってXMLで定義する
2. HTMLで定義する
3. shapeValidatorを使って動的に生成する
といった3つの方法が用意されています。この中の2番目がTapestry
と同じようなレイアウト作成を実現できます。レイアウトを記述した
HTML内にjsfid属性を付加しておけば、jsfid属性値を使って実際の
UI部品との結び付けが行なわれます。これによって画面モックアップ
から実際の開発までの流れがとてもスムースになります。実際の開発
では是非とも使ってみたい機能です。


[Remoting]
Ajaxのための非同期通信を提供する機能のようです。これも詳細は
あまり出されていないようですが、サーバーに対する非同期通信の
一連の処理を定義できる仕組みが提供されるようです。


ということで、Shaleについて気になる点をピックアップしてみました。
機能をフル活用した時にはそれなりに複数箇所のXMLファイルをいろいろ
設定しないといけないようなので、Shaleに対応したIDEの登場に期待
したいと思います。