→Java関連
→JSF(JavaServer Faces)関連
→Webアプリ開発
関連Web †
Document †
Download †
入門・紹介系記事 †
- JBoss Seamの導入@InfoQ
- Seam Webアプリケーションの記述は、概念的に非常に単純である。次のコンポーネントをコーディングするだけでよい。:
- エンティティオブジェクトはデータモデルを表す。エンティティオブジェクトは、Java Persistence API(JPA、別名EJB3永続性)またはHibernate POJOでエンティティBeanになり得る。関係データベーステーブルに自動的にマッピングされる。
- JSF Webページはユーザーインターフェイスを表示する。ページはフォームを通じてユーザー入力をキャプチャし、結果データを表示する。フォームフィールドとデータ表示テーブルはエンティティBeanまたはエンティティBeanの集合体にマッピングされる。
- EJB3 セッションBeanまたはアノテーション付きSeam POJOはJSF WebページのUIイベントハンドラとして機能する。これらは、エンティティBeanでカプセル化されたユーザー入力を処理し、次のステップ(またはページ)での表示のためのデータオブジェクトを生成する。
- JBoss Seam - EJB3.0時代のフレームワークを使いこなす
- JBoss Seamは、Java EE 5アプリケーションにおいてEJB 3.0(Enterprise Java Beans 3.0)のコンポーネントモデルとJSF(JavaServer Faces)のコンポーネントモデルをシームレスに統合するためのWebアプリケーションフレームワークである。
- JBoss Eclipse IDEというプラグインが提供されている
- Managed BeanとしてEJBコンポーネントを扱える(Managed BeanはJSFの用語 SeamではEJBを直接操作できるのでManaged Beanは不要)
特徴 †
- 双方向のDI(バイジェクション)
- Expression Languageを使って式の値をインジェクトも可能
- コンポーネント間の参照はコンテキストを介して間接的に行われる
- @Inアノテーションでメソッド実行前にコンテキストからオブジェクトを取得
- @Outアノテーションでメソッド実行後にコンテキストにオブジェクトを設定
- アプリケーションの実行中に何度でも注入が行われる
- 参考:バイジェクションとコンテキスト
- 7つのスコープ(ここでいうスコープとは、コンテキストにセットした変数が生きている期間=範囲のこと)
- というか、文脈しだいでほぼスコープ=コンテキストと考えてもいい。
- 一種の名前空間みたいなものと思ってもよい
- Application アプリケーションの開始から終了まで
- Business Process ビジネス・プロセスの開始から終了まで
- Session セッションの開始から終了まで
- Conversation 対話の開始から終了まで
- 対話とは、@Beginをつけたメソッドから@Endをつけたメソッドまで
- 一つのPCで複数のWebブラウザを立ち上げた場合、ブラウザの状態を別々に管理できる
- Event リクエストの開始から終了まで
- Page ページの開始から終了まで
- Stateless 状態を管理しない
- フォームとEJBの結びつきはアノテーションで設定するスコープとNameで決まる模様。
- 1スコープ内にひとつの名前の変数しか持てない。
- ELで参照されたときに範囲の短いスコープから順に名前を検索していくようだ
JBoss Application Serverのzipファイルからのインストール手順 †
アンインストール †
- zipからインストールした場合は単に解凍したディレクトリをまるごと削除すればいい
Tips †
- Seamのホットデプロイ
- JBoss4では、warだとホットデプロイされる。earだとホットデプロイされない。
- JBoss5では、warもearもホットデプロイできるらしい。
- ページのテーマを切り替える
- components.xmlに以下のような記述をする
<component name="org.jboss.seam.theme.themeSelector">
<property name="availableThemes">
<value>default</value>
<value>printable</value>
<value>text-only</value>
</property>
<property name="cookieEnabled">true</property>
</component>
- 内臓コンポーネント themeSelectorの themeプロパティに希望するテーマをセットし、selectメソッドを呼ぶ
themeSelector.theme="default";
themeSelector.select();
- ドロップダウンによる選択の例
<h:selectOneMenu value="#{themeSelector.theme}">
<f:selectItems value="#{themeSelector.themes}"/>
</h:selectOneMenu><br/>
<h:commandButton action="#{themeSelector.select}" value="Select Theme"/>
- Beggining Seam Chap.8 p235あたりを参照
- JNDIネームの設定は WEB-INF/components.xml にある(必須ではない)
- components/component/property name="jndiPattern"
- Seam Interceptorの設定は ejb-jar.xml にある(必須ではない)
- ejb-jar/interceptors/interceptor/interceptor-class
- 各ページのURLの拡張子を.seamから.htmlに変えるには
- com.sun.facelets.compiler.TagLibraryConfig loadImplicit というエラーについて
- http://www.andromda.org/jira/browse/JSF-30
- One annoying thing about using Facelets with SEAM/EJB3/JBoss is that there are some strange 'ERROR' log messages that happen when the first page is hit. --They look something like this:
07:38:26,843 ERROR \[STDERR\] Nov 29, 2006 7:38:26 AM
com.sun.facelets.compiler.TagLibraryConfig loadImplicit
INFO: Added Library from: jar:file:/C:/java/jboss-4.0.5.GA-ejb3/server/default
/./tmp/deploy/tmp64384starter1.ear-contents/webapp-exp.war/WEB-INF/lib/jsf-
facelets.jar!/META-INF/jsf-ui.taglib.xml
- So, I've finally figured out what this means. Basically, the Facelets compiler is emitting the message to System.err, which JBoss's Log4J setup interprets as an error level log message. I think that's a reasonable assumption to make with Log4J.
- If java.util.logging were a pet dog I'd say: Bad logging! Bad! Nnno!
- The folks at Sun should know better than to write to System.err, especially if the message is not an error. Perhaps the JDK logging can be tweaked to make this work better, but still... highly annoying.
- Solution #1
- Ignore the messages. They are only errors because ConsoleHandler writes log messages to System.err (dodgy) and the JBoss logging framework interprets them as errors, redirecting the messages as ERROR level (understandable).
- Solution #2
- Use a different logging handler by using a different java.util.logging (a.k.a. JULI) configuration.
- Solution #3
- Experimental - Use a ContextListener to reconfigure JULI to send logging messages to Log4J.

対話の制御 †
- あるページに対話中でないときにアクセスしたらリダイレクトしたいときの設定
- 対話のリストは org.jboss.seam.core.ConversationList で取得可能。
- 個々の対話は org.jboss.seam.core.ConversationEntry オブジェクトで表現される
- (Beggining Seam p175付近)
アノテーション †
- @RequestParameter
- URLからパラメータを取得するときに使う。下方の「URLからGETパラメータを得るには 」を参照
- Stateful Session Beanには Removeメソッドが必要
- メソッド名がRemoveでないといけないというわけではない(もちろんそうしてもいいが)
- @Statefulをつけたクラスには@Removeアノテーションをつけたメソッドを最低一つ用意する
- そのBeanを廃棄しても良い状態になったら(Seamへの通知として)このメソッドを呼ぶ
- Seam側ではそれを目印としてBeanに割り当てた資源を回収する
- @Observer
- @Observer("hoge") とやったメソッドはSeam組み込みコンポーネントeventsから"hoge"イベントを通知することで実行される
- @DataModel, @DataModelSelection ("Beggining JBoss Seam" p149あたり)
- <h:dataTable>と一緒に使うことが多い
- java.util.Collections のListをdataTableと連動させるときに使う
- SeamはListを javax.faces.model.DataModelにコンバートする
- テーブル上で選択された行が @DataModelSelectionをつけた変数にバイジェクションされる
- @Role
- 一つのクラスを異なるスコープで使いたいときに使える
@Name("hoge")
@Entity
@Scope(SESSION)
@Role(name="hogeEvent", scope=EVENT)
public class Hoge{
...
}
- さらにもう一つ増やしたくなったら
@Name("hoge")
@Entity
@Scope(SESSION)
@Roles({
@Role(name="hogeEvent", scope=EVENT) //ここにカンマを入れてはいけない
@Role(name="hogePage", scope=PAGE)
})
public class Hoge{
...
}
認証の仕組み †
- NotLoggedInExceptionがとんだらどうするかの設定
RichFaces †
- RichFaces is an open source framework that adds Ajax capability into existing JSF applications without resorting to JavaScript.
EL(Expression Language) †
- Unified EL for JSP and JSF
- JSFのビューからの指定方法
- #{コンポーネント名.プロパティ名}
- #{コンポーネント名.メソッド名}
Seamタグ †
- <s:validateAll>
- 囲った部分のエレメントをすべてバリデートし、エラーがあれば<h:messages>に出力する
examples下にあるサンプルについて †
JBossの正常起動判定 †
URLからGETパラメータを得るには †
|