JBoss Seam ~Java EEは統合フレームワークへ~
seam-genを使ってアプリケーションのひな型を作成する
本記事の読者の中には、Ruby on RailsというRuby言語で開発されたWeb開発フレームワークのことをご存じの方も多いかと思います。Ruby on Railsがscaffoldという機能を使ってアプリケーションのひな型をコーディングレスに作成できるように、Seamでもseam-genを使ってアプリケーションのひな型をコーディングレスに作成できます。
まず、解凍されたSeamのディレクトリ直下に、seamあるいは、seam.batというコマンドが用意されていますので、コマンド・プロンプトから、
--------------------------------------------------------------------------------
$ ./seam setup
--------------------------------------------------------------------------------
を実行すると、対話形式で環境セットアップを行うことができます。プロジェクトのホーム・ディレクトリ(以降、「${PROJECT_HOME}」)とJBossのホーム・ディレクトリ(「以降、${JBOSS_HOME}」)を適切に指定し、デプロイ形式はEJBを使用するので「ear」を選択し、それ以外はデフォルトのままで構いません。
セットアップが完了した後、
--------------------------------------------------------------------------------
$ ./seam create-project
--------------------------------------------------------------------------------
を実行すると、ひな型アプリケーションの含まれたプロジェクト・ディレクトリが「${PROJECT_HOME}/myproject」に作成されます。
--------------------------------------------------------------------------------
$ ./seam deploy
--------------------------------------------------------------------------------
を実行すると、プロジェクトのビルド、およびアプリケーション・サーバーへのデプロイが実行されますので、アプリケーション・サーバーを起動し「http://localhost:8080/myproject/」にアクセスしてみてください。「Welcome to Seam!」という画面が表示されれば成功です。
これだけでは味気ないので、フォーム・アプリケーションのひな型も作成してみましょう。アプリケーション・サーバーを停止して、先ほどと同じプロンプトから、
--------------------------------------------------------------------------------
$ ./seam new-form
--------------------------------------------------------------------------------
を実行します。Seamコンポーネント(次項で説明します)の名前を聞いてくるので、ここでは「hello」としましょう。あとはデフォルトのままで構いません。コマンドが完了すると、先ほどのプロジェクト・ディレクトリに、リソースが追加されます。
先ほどと同じ手順で、ビルド、デプロイを行い、アプリケーション・サーバーを起動して「http://localhost:8080/myproject/hello.seam」にアクセスしてみてください。表示された画面のフォームに文字列を入力し、「hello」ボタンをクリック、入力した文字列が上部のステータス・メッセージに表示されれば成功です(図2-1)。
ここでは割愛しますが、scaffoldと同様に、CRUD(Create, Read, Update, Delete)アプリケーションのひな型をseam-genを使って作成することもできます。このようにして作成されたアプリケーションのひな型は、これらを基にして開発を始めることで、開発効率を上げることができるとともに、Seamの機能を把握するためにも大いに役に立つことと思います。
次項からは、seam-genによって作成されたアプリケーションのひな型を参考にして、Seam本体の機能について紹介します。
JSFとEJBをシームレスにつなぐ
Seamの名の通り、JSFとEJBをシームレスにつなぐことができるということが、Seamの大きな特徴であると言えます。この点について、Seamが果たす役割について説明する前に、まずはSeamを用いない場合の開発について整理してみます。
JSFでは、Managed Beanと呼ばれるJava Beansを媒介にして、ビジネス層へのデータの受け渡しを行います。もちろん、Managed Bean自体がビジネス・ロジックを持っても構わないのですが、ここで注意しなければならないのは、Managed Beanとして登録できるのは、あくまでJava Beansであり、EJBではないということです。ビジネス・ロジックをEJBとして実装する場合には、やはり、パラメータの受け渡しのみを目的としたManaged Beanを作成せざるを得ないということになります。また、Managed Beanの作成には、faces-config.xmlの記述という煩わしい作業がつきまといます。
Seamを使用した場合、これらの作業はどう変わってくるのでしょうか。先ほど作成したフォーム・アプリケーションのひな型を見てみましょう。
まず、「${PROJECT_HOME}/myproject/resources/WEB-INF/faces-config.xml」のどこを見ても、Managed Beanに関する記述は見当たりません。次に、「${PROJECT_HOME}/myproject/src/hot/com/mydomain/myproject/action/HelloBean.java」を開くと、ソースの13行目に「@Name("hello")」というアノテーションが付加されているのが分かります。
結論から言いますと、Seamを使用した場合、Managed Beanを登録するためのfaces-config.xmlの編集作業は必要ありません。@Nameアノテーションが付加されたクラスは、Seamコンポーネントと呼ばれ、Managed Beanの役割を果たすようになります。要するに、@Nameアノテーションは
また、このソースでは省略されていますが、「@Scope(SESSION)」というようなアノテーションを付加することによって、若干意味合いは異なりますが(次項で説明します)、
もう1つ、このソースで注目すべき個所は、12行目の@Statefulアノテーションです。そう、このクラスはEJBなのです。Seamでは、EJBもJava Beansと同様にSeamコンポーネントとして登録することができ、JSFからのパラメータを直接受け取ることができるのです(図2-2、2-3)。
このように、Seamはアノテーションを活用することによって、faces-config.xmlを記述する手間を減らし、さらにはEJB呼び出しを隠ぺいし、Managed BeanとEJBの役割をSeamコンポーネントとして統合することで、冗長なManaged Beanを作成する手間を省いてくれるのです。これが、JSFとEJBをシームレスにつなぐSeamの果たす大きな役割です。
次ページでは、ステートフルなWebアプリケーション開発を効率化するSeam独自のコンポーネント・モデルについて解説します。