JBoss Seamを利用したプロジェクトの作成
JBoss Seamのセットアップはかなり煩雑です。
JSFとEJB3を統合する、というSeamのコンセプトからして、本格的なEARプロジェクトを作成する必要がある上、Seam独自の設定をいくつも施してあげなくてはなりません。
JSFとEJB3を統合する、というSeamのコンセプトからして、本格的なEARプロジェクトを作成する必要がある上、Seam独自の設定をいくつも施してあげなくてはなりません。
ただ、Seamの内部動作を推し量るためにはこれらの設定ファイルがどういう意味を持つのか知る必要があります。まずは頑張って一つ一つセットアップしていきましょう。
勉強会用Eclipseセットアップ
勉強会ではWTPプラグイン入りのEclipseを使用して、サンプルアプリケーションを作成しましょう。
ターゲットランタイムの設定
「ウィンドウ→設定→サーバー→インストール済みランタイム→追加」で、JBoss v4.0を指定してJBossインストールディレクトリを指定します。
MyNumberGuessEARプロジェクトの作成
- 新規プロジェクト→J2EE→エンタープライズ・アプリケーション・プロジェクト
- ターゲット・ランタイムにJBoss v4.0を指定する
MyNumberGuessEJBプロジェクト
新規プロジェクト→EJB→EJBプロジェクト
- ターゲット・ランタイムにJBoss v4.0を指定する
- 「EARにプロジェクトを追加」チェックボックスにチェックを入れ、「MyNumberGuessEAR」を指定する
MyNumberGuessWebプロジェクト(新規プロジェクト→Web→動的Webプロジェクト)
- ターゲット・ランタイムにJBoss v4.0を指定する
- 「EARにプロジェクトを追加」チェックボックスにチェックを入れ、「MyNumberGuessEAR」を指定する
web.xmlの設定
Seamを利用したWebアプリケーションが起動する際、Seamは様々な処理を行うため、リスナ(SeamListener)の登録が必要です。
<listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener>
また、以下のフィルタ(SeamRedirectFilter)を追加しておき、JSFのサーブレットが持つURLパターンと一致させておきます。
<filter> <filter-name>Seam Redirect Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamRedirectFilter</filter-class> </filter> <filter-mapping> <filter-name>Seam Redirect Filter</filter-name> <url-pattern>*.seam</url-pattern> </filter-mapping>
JSF用の設定もいくつか必要なので、それらを全て追加したweb.xmlは以下のようになります(bookingサンプルから引用)。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- Seam --> <listener> <listener-class> org.jboss.seam.servlet.SeamListener </listener-class> </listener> <!-- Propagate conversations across redirects --> <filter> <filter-name>Seam Redirect Filter</filter-name> <filter-class> org.jboss.seam.servlet.SeamRedirectFilter </filter-class> </filter> <filter-mapping> <filter-name>Seam Redirect Filter</filter-name> <url-pattern>*.seam</url-pattern> </filter-mapping> <!-- JSF --> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.seam</url-pattern> </servlet-mapping> <!-- MyFaces --> <listener> <listener-class> org.apache.myfaces.webapp.StartupServletContextListener </listener-class> </listener> <!-- JSF RI --> <!-- <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener> --> </web-app>
WEB-INF/components.xmlの設定(jndiPattern)
WEB-INF/faces-config.xmlの設定(org.jboss.seam.jsf.SeamPhaseListener)
ejb-jar.xmlの設定(全てのセッションBeanにSeamInterceptorを付加)
<?xml version="1.0"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" metadata-complete="true" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">