Seam3によるWebプログラミング
Seam3によって変わるJava EEプログラミング
従来のJava EEプログラミングが難しかった理由の一つは、Java EEを構成する各仕様のプログラミング・モデルが統一されておらず、それらのギャップを開発者が埋める必要があったからです。CDIのプログラミング・モデルによって、Java EE全体が、同じモデルのもと統一した操作で扱えるようになります。
- インジェクションによるJavaEEのオブジェクトの取得
- EJB、データソース、UserTransaction(CDI)
- HTTP リクエスト、HTTPセッション(Seam Servlet)
- JSFメッセージ(Seam Faces)
- ロケール、タイムゾーン(Seam International)
- JPA永続コンテキスト(Seam Persistence)
- アノテーションによる宣言的なプログラミング
- 宣言的トランザクション(Seam Persistence)
- 宣言的セキュリティ(Seam Security)
- 宣言的状態管理(CDI)
- リモートからのBeanのアクセス
- Javaスクリプトベース(Seam Remoting)
- BeanをRESTで公開(Seam REST)
- 統一されたフレームワーク設定ファイルの記法(Seam Configurations)
- CDIイベントによるJava EEの状態変化の通知
- Servletライフサイクル(Seam Servlet)
- JSFリクエストライフサイクル(Seam Faces)
- Java例外をイベントとしてキャッチ(Seam Catch)
- ロギングなどの共通ユーティリティの提供(Seam Solder)
Seam3モジュールを使ったインジェクションの例
まず最初に、Java EEのオブジェクトをインジェクションで取得する例を、いくつか紹介します。以下は、Seam Servletモジュールを使って、Servlet内においてHTTPリクエストとHTTPレスポンス、HTTPセッションを変数に設定しています。
以下は、Seam Internationalモジュールを使って、ロケール情報とタイムゾーンを変数に設定しています。
Seam Solderモジュールは、Seam3モジュールを開発する上で有益なユーティリティを提供します。以下は、Logのカテゴリの限定子を指定してloggerを取得しています。
これらの例から分かることは、アプリケーションが必要とするJava EEのオブジェクトが@Injectによって本当に簡単に手に入れられるということです。
Seam3モジュールを使ったイベントの例
次は、CDIのイベントの例です。JSF(JavaServer Faces)の仕様では、リクエストはJSFのライフサイクルによってフェーズごとに処理されます。この各フェーズの前後で何らかの処理をさせたい場合は、javax.faces.event.PhaseListenerを使ってリスナーを登録します。
Seam Facesモジュールを使うと、JSFライフサイクル・イベントをCDIイベントとしてキャッチできます。このため、従来のリスナーの処理を、もっと手軽に実現できます。
この例では、Render Responseフェーズのイベントをキャッチしています。@ObservesはCDIで定義されたイベントをキャッチするためのアノテーションで、メソッド引数にこれを付加すると、JSFのイベントがCDIのイベントとして引数で渡されます。@RenderResponseは、イベントの種別を指定するための限定子になります。
Java EEの仕様では、Servlet仕様のServletListenerやJMS(Java Messaging Service)仕様のMessageListenerなど、このようなリスナー定義を行う個所が多々ありますが、これらのリスナーのAPIは仕様ごとにバラバラです。Seam3モジュールは、これらのリスナー処理をCDIイベント化することによって統一化します。
Seam3 Bookingサンプル
もう少しまとまった大きさのSeam3のサンプル・プログラムとしては、Seam Bookingがあります。これは、ホテルの予約アプリケーションであり、ログイン、ホテル検索、予約登録が可能です。Seam Bookingは、Seamの初期のバージョンから提供されている代表的なサンプルです。
Seam3版のSeam Bookingは、Seam3のディストリビューションのexamples/seam-bookingに含まれます。これをビルドすると、ほぼSeam2のbookingと同様な画面が表示されます(図1、図2)。完成したSeamアプリケーションがどのようにSeam3のモジュールを使っているのかは、このサンプルを参考にしてください。
図1: Seam Bookingログイン画面(クリックで拡大) |
図2: Seam Booking検索画面(クリックで拡大) |
まとめ
Seam3正式リリースの直前というタイミングで、Seam3について4回の連載で説明してきました。Seam3を使ったWebアプリケーション開発のイメージが掴めたでしょうか。
筆者は、Seam3の登場によって、Java EEを使ったWebプログラミングが、従来の煩雑なAPIベースの開発から疎結合連携可能なBeanの集合体の開発へと質的に変化していくことを期待しています。Seam3のプログラミングは、従来のJava EEプログラミングよりもダイナミックでアジャイルです。Seam3のリリースを機に、Seamを使ったJava EEアプリケーション開発について評価・検討を開始していただけたら幸いです。
- 編集部注: 本文中、Seam2の登場時期を1996年としていましたが、2006年の誤りです。お詫びして訂正いたします。本文は修正済みです。(2011/04/05)