まずは、JBoss Seamについて簡単に説明しよう。JBoss Seamの詳細については、JBoss Seamリファレンスマニュアルなどを参考にしていただきたい。

JBoss Seamとは

JBoss Seamとは、JSFやEJB3.0などを統合するWebアプリケーションフレームワークである。また、ICEfacesやAjax4jsf(およびRichFaces)といったJSFベースのAjax対応のフレームワークとも連携可能である。

ICEfacesおよびJBoss Seamは、図1のように位置づけられる。

図1 ICEfacesとJBoss Seam

JBoss Seamには、多くの優れた特徴が存在する。ここではその一部しか紹介できないが、まず、JBoss Seamの中心的な概念となるSeamコンポーネントとSeamコンテキストについて説明する。そして、JSFとEJB3.0をどのように連携しているかについて説明する。

コンポーネントとコンテキスト

はじめに、SeamコンポーネントおよびSeamコンテキストについて、各々の概要を説明しよう。さらに、SeamコンポーネントとSeamコンテキストの関係について説明する。

Seamコンポーネント

JBoss Seamでは、JSFのコンポーネントとEJBという別々のコンポーネントを、Seamコンポーネントとして統一的に扱うことを可能としている。Seamコンポーネントは、POJO(Plain Old Java Objects)であり、基本的には(EJB3.0における)EJBである。コンポーネント名は@Nameアノテーションで指定可能であり、JSFページのEL(Expression Language)を用いて、(JSFのManaged Beanのように)コンポーネント名にてアクセス可能である。図 2に、Seamコンポーネントの概念図を示す(Seamインターセプタについては後述する)。

図2 Seamコンポーネントの概念図

Seamコンテキスト

Seamコンテキストとは、JBoss Seamに管理された「入れ物」である。コンテキストとしては、アプリケーションコンテキスト、セッションコンテキストなどが存在するが、JBoss Seamで最も特徴的なコンテキストが、対話(Conversation)コンテキストである。これは、ステートフルセッションBean、エンティティBeanが、デフォルトでバインドするコンテキストでもある(@Scopeアノテーションで、スコープをオーバーライド可能)。後述するアプリケーションの例では、「新規ユーザの登録」「既存ユーザの編集」など、一連の処理が対話に該当する。複数のリクエストに渡る長期対話の開始と終了は、@Beginアノテーション、@Endアノテーションなどで指定可能である

図3は、SeamコンポーネントとSeamコンテキストの関係、およびSeamコンポーネントの参照構造を表している。

図3 Seamコンテキスト上のSeamコンポーネント

Seamコンポーネントのインスタンスは、Seamコンテキストにバインドされ、コンテキスト上で管理される。JBoss Seamにおいては、コンポーネントが呼ばれるたびに、コンテキストからコンポーネントへインジェクト(@Inアノテーションで指定)、コンポーネントからコンテキストへアウトジェクト(@Outアノテーションで指定)が発生する。この双方向のメカニズムは、バイジェクション(Bijection)と呼ばれており、アプリケーション実行中に、動的にコンポーネントの参照構造を変更することを可能としている。

※ SpringやSeasarなどのDIコンテナにおいては、コンテナが初期化される場合にのみインジェクトが発生し、その後、コンポーネントの参照構造が変更されることはない。

JSFとEJB3.0の統合

それでは、JBoss Seamにおいて、JSFとEJB 3.0をどのように連携させ、(POJOの)Seamコンポーネントとして統一的に扱うことを可能にしているかについて説明しよう。JBoss Seamは、図4のようにSeamフェーズリスナによりJSFと連携し、SeamインターセプタによりEJB 3.0と連携して動作する。

図4 JSFとEJB3.0の統合

それぞれの連携について、以下に簡単に説明する。

JSFとの連携

JSFのイベントリスナとして、Seamフェーズリスナ(SeamPhaseListener)を用いている。Seamフェーズリスナは、JSFのライフサイクル中の特定のフェーズの前後で、対話(Conversation)の保存/リストアや、ページアクションの起動などの処理を実行する。

EJB3.0との連携

EJB3.0のインターセプト機能として、Seamインターセプタ(SeamInterceptor)を用いている(図2)。このインターセプタは、@Interceptorsアノテーションにて設定するか、ejb-jar.xmlファイルにて設定する。Seamインターセプタは、Seamコンポーネントが呼び出される前後で、インジェクト、アウトジェクトなどの処理を実行する。

このようにして、フェーズリスナによりJSFと連携し、インターセプタによりEJB3.0と連携することで、コンテキスト、およびコンテキスト上のコンポーネントの管理を実現している。また、POJOのままのコンポーネントにて、JSFとEJB3.0をシームレスに取り扱うことを可能にしている。