JBoss Seamのサンプルアプリを試す。その2

昨日に続きhttp://docs.jboss.com/seam/reference/en/html/tutorial.html#d0e493を見ていきます。

4. The web deployment description: web.xml


web.xml3.1. Integrating Seam with JSF and your servlet containerにもありますが、

    <!-- Seam -->

    <listener>
        <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
    </listener>

は、Seamアプリケーションには必須だそうです。


残りもSeamアプリケーションでは完全に同じだそうです。


5. The JSF configration: faces-config.xml


Seamアプリケーションはプレゼンテーション層にJSFを使うのでfaces-config.xmlも必須です。


サンプルアプリケーションのregistrationのjsf-config.xml(faces-config.xmlの間違いだと思う。)には一つだけのナビゲーションルールがあるだけです。ManagedBeanの宣言がないことに注目して下さい(Seamアプリケーションには必要ありません)。ManagedBeanはSeamコンポーネントです。Seamアプリケーションに於いてはjsf-config.xml(faces-config.xmlの間違いだと思う。)はJSFのoutcomeにあるアクションの実行結果と表示ページのマッピングによるページ遷移を指定するためだけに使われます。


事実、基本的な記述子をセットしてもSeamアプリケーションに新しい機能を追加してもXMLにページ遷移を書くだけです。SeamXMLに記述されたプロセスフローと設定データのみからビューを作成します。


6. The view: register.jsp and registered.jsp


SeamアプリケーションのビューページはJSFのサポートする技術を使って実装されています。ここでは開発者に最も馴染みのあるJSPを使っていますしここでは最低限必要とされるものです。(アドバイスとしてはFaceletを使った方が良い)。


JSPを見てもSeamアプリケーションだからと言って特別なタグを使っているわけでもないですね。


7. The EAR deployment descriptor: application.xml



最後に、SeamアプリケーションはEARとしてデプロイされます、デプロイメントディスクリプタも必要です。

 このデプロイメントディスクリプタエンタープライズアーカイブもモジュールとWebアプリケーションのContextRootを/seam-registrationへリンクします。

  以上でアプリケーションの全てのファイルを見終わりました。


How it works

    1. フォームが送信されたとき、JSFSeamへuserと言う名前解決を求めます。
    2. その名前に値が結びつけられていないときは、Seamはuserコンポーネントインスタンス化し、Seamのセッションコンテキストを保存した後にUser EntiryBeanのインスタンスJSFへ返します。
    3. JSFはUser EntityBeanのプロパティとフォームに入力された値を結び付けます
    4. 次にJSFSeamへregisterと言う名前解決を求めます。
    5. SeamはRegisterActionステートレスセッションビーンをステートレスコンテキスト内に見つけJSFへ返します。
    6. JSFはActionListenerメソッドのregister()を実行します。
    7. Seamはメソッドコールに割り込みHibernate ValidatorにSessionBeanのインスタンス(再帰的にUser EntityBeanも)を検査を依頼する前にセッションコンテキストと現在のFacesContextインスタンスからUser EntityBeanに注入にます。
    8. 状態(値)に問題がないなら,そのまま実行されregister()メソッドが呼ばれます。
    9. 問題があれば、Seamはnullをoutcomeに返し、JSFページを再表示します。
    10. JSFが次のJSPページを表示しSeamにuserと言う名前の解決を求めると、Seamセッションスコープから返るUser EntityBeanのプロパティの値を使います。



 普通のJSFアプリケーションであれば、ManagedBeanのアクションメソッドからJ2EEのSessionBeanへのDelegateを呼んで、Delegate内でSessionBeanのLocalインターフェイスを呼んで....ってしていたのを、JSFのManagedBeanのActionメソッドはSessionBeanが担当してプロパティはEntityBeanが担当しますってことなのでしょうか?


 次はもう少し複雑なホテル予約ーBookingを見てみます。