JBoss Seam ~Java EEは統合フレームワークへ~

2010年1月15日(金)
佐野 大輔

JBoss Seamのコンポーネントモデル

Seamはコンテキスト依存(contextual)コンポーネント・モデルという独自のコンポーネント・モデルを持っています。このコンポーネント・モデルは、従来のJava EE上でステートフルなWebアプリケーションを開発するうえでの問題を解決し、さらに対話(conversation)という新たな概念によって、ステートフルなWebアプリケーション開発を飛躍的に効率化させるために導入されました。以下では、このSeam特有のコンポーネント・モデルについて紹介します。

まず、前述の「@Scope(SESSION)」というアノテーションは、一体「何の」スコープを指し示しているのでしょうか。その答えがコンテキストです。

SeamはApplication、Session、Conversationなど(最初の2つはServlet APIでなじみ深いものだと思います)のさまざまなスコープを持ったコンテキストを持っており、すべてのSeamコンポーネントのインスタンスは、いずれかのコンテキスト上で管理されています。Seamコンポーネントは、それぞれのタイミングでインスタンス化(初回の呼び出し時に作成、明示的に作成)およびコンテキスト上で管理され、コンテキストのスコープが終了(セッションの終了、リクエストの終了)するとともに破棄されます。

Seamコンポーネントは、コンテキスト上で、コンテキスト変数と呼ばれる名前つき変数(@Nameアノテーションで指定した名前)の中に格納され、EL式(Expression Language)の中から変数名で参照することができます。

また、インジェクション用のアノテーション(@In)を使用することによって、指定したプロパティへコンテキスト変数から値を差し込むことができ、逆にアウトジェクション用のアノテーション(@Out)を使用することによって、指定したプロパティからコンテキスト変数へ値を差し込むこともできます。このような機能をバイジェクションと呼んでいます。

インジェクションはコンポーネント・ツリーを構築するための重要な機能ですが、インジェクションで重要なことは、そのプロパティを持つコンポーネントがインスタンス化された時に行われるのではなく、そのインスタンスが呼び出される際に毎度行われるということです(ちなみにアウトジェクションはインスタンスの呼び出しが終了した際に行われます)。この仕組みによって、スコープの異なるコンポーネントがインジェクトされる場合でも、整合性を損なうことなくコンポーネントを構築でき、faces-config.xmlにおいて長さの異なるスコープのManaged Beanをに設定した場合のような問題が起こらないようにしています。

Seamのコンテキストのなかでも、特に特徴的な概念が、Conversation(対話)です。

Conversation(対話)は、Seamのコンポーネント・モデルの中核をなす概念であり、今までのJava EE開発にはなかった新たな概念です。対話コンテキストのスコープは複数のリクエストにまたがりますが、Sessionスコープよりは短く、ユーザーが1つのウィンドウの中で行う、不可分な作業単位を表します。

例えば、ユーザー登録機能が複数ページに亘って行われるようなアプリケーションにおいて、最初の画面のサブミットから、最後の画面のサブミットまでは、対話であると考えることができます。こう書くと今までSessionスコープで管理していたほとんどのものは、対話スコープで管理すべきなのではないかと思われるのではないでしょうか。

アプリケーションのひな型を使って、具体的なイメージをつかんでみましょう。
--------------------------------------------------------------------------------
$ ./seam new-conversation
--------------------------------------------------------------------------------
を実行します。フォーム・アプリケーションの場合と同じように、Seamコンポーネントの名前を聞いてきますので、「counter」と入力しましょう。あとはデフォルトで構いません。

先ほどと同じ要領で、ビルド、デプロイを実行した後、「http://localhost:8080/myproject/counter.seam」にアクセスすると、数値「0」が表示されたパネルと、「Begin」ボタンがページに表示されます。「Begin」ボタンをクリックすると、「Increment」ボタンと「End」ボタンが表示されます。「Increment」ボタンをクリックする度に、パネルに表示された数値は増加していき、「End」ボタンをクリックするとトップのページに遷移します。上部の「counter」リンクを選択し、再び先ほどの画面に戻ると、画面は初期状態に戻っています(図3-1)。

この単純なアプリケーションにおいて、「Begin」ボタンをクリックしてから「End」ボタンをクリックするまでの間、パネルに表示される数値は、対話コンテキストで管理されています。

「${PROJECT_HOME}/myproject/src/hot/com/mydomain/myproject/action/CounterBean.java」を見てみましょう。begin()、increment()、end()と、各ボタンに対応するアクション・メソッドが並んでいますが、begin()メソッドの上には@Beginアノテーションが、end()メソッドの上には@Endアノテーションが付加されているのが分かります。対話コンテキストは、このようにアノテーションによって開始と終了を宣言することにより管理します。HTTP Sessionを自前で管理しなくても、アノテーションを付加するだけで、このようなアプリケーションが作れるのです(図3-2、3-3)。

とはいえ、この程度であれば、HTTP Sessionで管理しても大した手間ではないのではないかと思われる方もいらっしゃるかもしれません。そのような方は、アプリケーションを複数のタブで開いて動作させてみてください。それぞれのタブで開かれたカウンターが互いに独立して数を増やしていくのが確認できると思います。Seamでは、同一セッション上で並行して進行するような対話にも簡単に対応できるのです。

Weld、そしてJBoss Seam 3へ

ここまで、Seamの持つ3つの特徴を中心に説明してきましたが、特に後半の2つ、

  • JSFとEJBをシームレスにつなぐ機能を持つ。
  • 独自のコンポーネント・モデルによって、ステートフルなWebアプリケーション開発を容易にする。

は、2009年12月にリリースされたJava EE 6に採用されている仕様、CDIの中でも中核をなす重要な機能になります。アノテーションやAPIについては仕様の策定にあたって調整が行われたため、Seamの機能がそのままJava EE 6として採用されているわけではありませんが、概念や機能の大枠はSeamのそれと大差はありません。

また、現在Seamコミュニティでは、次期バージョンであるSeam 3.0に向けて開発が行われている最中ですが、CDIのリファレンス実装(参照実装)であるWeldがそのままSeam 3.0のコアとして採用され、JavaEE 6準拠のWeb開発フレームワークとなる予定です。

Seamは、CDIの部分以外にも、Seam-genをはじめとするツール、ユーティリティ群を豊富に備えており、Java EE準拠のWeb開発フレームワークとして、最も実用に耐えうる、現実的なものであるといえます。

本記事では、Seamの概要をご紹介しましたが、もっと詳しい内容や技術を確認されたい方は、野村総合研究所(NRI)の開発エキスパート達が執筆した「JBoss Seam」の入門書がありますので、ぜひご一読ください。実用的なサンプルアプリケーションの作成方法を交えながら、Java EE 6時代の中核となる標準技術を解説しています。

オープンソース徹底活用 JBoss Seamによる Webアプリケーション開発

次回は、NRIがSeamを使ってSI(システム・インテグレーション)での開発向けに提供しているWeb開発フレームワークについて紹介します。

野村総合研究所(NRI)
基盤ソリューション事業本部 副主任システムコンサルタント。前職での大企業向けWeb型グループウエアの開発経験を経て、2008年8月より現職。NRIのSIフレームワーク「ObjectWorks+」関連製品の導入コンサルティングを行っている。ObjectWorks+ :http://works.nri.co.jp/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています