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を展開
  • 環境変数JAVA_HOMEにJavaのルートをセット
     例)C:\Program Files\Java\jdk1.5.0_16
  • %JAVA_HOME%\jre\bin にパスを切る
  • サーバの起動
    • <zipを展開したディレクトリ>\bin\run.batを実行する
    • 注意:このときポート 8080を使うアプリ(例えばPOPFileとか)を起動していたら終了させておくこと
  • 起動したら以下の場所をWebブラウザでアクセスしてみる
    	http://localhost:8080/
  • "JBoss Online Resouces" というページが表示されたら成功
  • 失敗したら <zipを展開したディレクトリ>\server\default\log にあるserver.logを見てみるべし。例外が出てるところに原因が出ている
  • 起動したサーバを終了させるときはコンソールからCtrl+Cを押すと良い模様(もっと正規の方法があるのかも?)

アンインストール

  • zipからインストールした場合は単に解凍したディレクトリをまるごと削除すればいい

Tips

  • Seam Remoting解説
    • Seam Remotingってのはクライアント側のJavaScriptからサーバ側Seamコンポーネントのメソッドを非同期に呼び出す技術
  • 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あたりを参照
  • Dropdownを動的に用意する
    <h:selectOneMenu value="#{hoge}">
       <f:selectItems value="#{hogeItems}" />
    </h:selectOneMenu>
  • JNDIネームの設定は WEB-INF/components.xml にある(必須ではない)
    • components/component/property name="jndiPattern"
  • Seam Interceptorの設定は ejb-jar.xml にある(必須ではない)
    • ejb-jar/interceptors/interceptor/interceptor-class
  • 各ページのURLの拡張子を.seamから.htmlに変えるには
    • web.xmlのservlet-mappingの下のurl-patternタグで設定する
      <url-mapping>*.seam</url-mapping>
                 ↓
      <url-mapping>*.html</url-mapping>
      これはseamの仕様というよりJavaEEの仕様
  • jboss-seam.jarがデプロイされない
    • JBossToolsで作ったearをデプロイしたら、earプロジェクトのjboss-seam.jarがデプロイされないよ!
    • 色々調べたら、以下の記述を消せばいいみたいだよ。
      application.xmlの
      
      <module>
      	<ejb>jboss-seam.jar</ejb>
      </module>
  • 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. :)

対話の制御

  • あるページに対話中でないときにアクセスしたらリダイレクトしたいときの設定
    • pages.xmlに以下のように設定
      <pages>
        <page view-id="hoge_url" no-conversation-view-id="/index.html" />
      </pages>
  • 対話のリストは org.jboss.seam.core.ConversationList で取得可能。
    • 個々の対話は org.jboss.seam.core.ConversationEntry オブジェクトで表現される
    • (Beggining Seam p175付近)
  • 対話をスタートするタグ
    <h:commandLink action="hoge" value="start conv">
      <s:conversationPropagation type="begin">
    </h:commandLink>
    • typeには begin, end, join, nested, none がある
  • 対話のタイムアウトの設定
    • WEB-INF内components.xml
      <core:manager conversation-timeout="120000" />
    • components.xmlはMETA-INFにもあるようだが、どういう使い分けになっているのだろう?

アノテーション

  • @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{
        ...
      }

認証の仕組み

  • Seamの認証機構
    • ELにidentity.loginなどの内臓クラスのメソッドが指定されているのに、別のクラスで自分で作ったまったく別名のメソッド、例えばAuthenticator.authenticate()などで対応されるという不思議な動きをする。
    • 自分で作った認証メソッドとidentity.loginの対応付けはcomponents.xml内で指定されている。
      <security:identity authenticate-method="#{authenticator.authenticate}"/>
  • ページのアクセス制限
    • ページ単位のアクセスの設定は pages.xml で行う
      <page view-id="/hoge/*">
          <restrict>#{identity.loggedIn}</restrict>
      </page>
    • ELの評価がtrueならページが表示される(はず。未確認)
    • falseなら NotLoggedInExceptionがとぶ
  • ログインの他にロールも必要ならこういう感じになる
    <page view-id="/hoge/*">
        <restrict>#{identity.loggedIn and s:hasRole('ADMIN')}</restrict>
    </page>
  • login-required属性という手もある
    <page view-id="/hoge/*" login-required="true" />
  • NotLoggedInExceptionがとんだらどうするかの設定
    • pages.xmlのexceptionタグで定義する
      <exception class="org.jboss.seam.security.NotLoggedInException">
         <redirect view-id="/login.xhtml">
            <message>ログインしていないと閲覧できません</message>
         </redirect>
      </exception>
    • 上記ではloginのページにリダイレクトしてメッセージを出している

RichFaces

  • RichFaces is an open source framework that adds Ajax capability into existing JSF applications without resorting to JavaScript.

EL(Expression Language)

  • JSFのビューからの指定方法
    • #{コンポーネント名.プロパティ名}
    • #{コンポーネント名.メソッド名}

Seamタグ

  • <s:validateAll>
    • 囲った部分のエレメントをすべてバリデートし、エラーがあれば<h:messages>に出力する

examples下にあるサンプルについて

  • Seamのディレクトリにあるbuild.propertiesに jboss.homeの行を追加するときに、ディレクトリの区切りの円マークは二重にする必要があるようだ。readme.txtにはこのことが書いてないので注意(これってJavaの人には常識なの?)
    正しい記述例
    jboss.home = D:\\MyData\\java\\jboss-AS4.2.3.GA
    
    これではダメです
    jboss.home = D:\MyData\java\jboss-AS4.2.3.GA
  • JBoss Seamのbookingというサンプルをant(ビルド→deploy)してみたらエラー(下記)が発生した
    2008-09-15 01:10:39,901 ERROR [org.apache.catalina.core.ContainerBase.
    [jboss.web].[localhost].[/seam-booking]] クラス 
    org.apache.myfaces.webapp.StartupServletContextListener の
    アプリケーションリスナの設定中にエラーが発生しました
    • これはJBoss ASのバージョンが4.2.3であるのに対し、使ったサンプルが Seam 1.2.1GAのものであったためらしい。
    • Seamの2.0.3CR1を落としてきてbooking exampleをantしたら今度は無事に動いた

JBossの正常起動判定

  • run.shは非同期なので正常に起動されたかどうかは判定できない
  • twiddle.shというスクリプトがあり、これでJMXにアクセスする
    $ ./twiddle.sh -s <server> -u <user> -p <pass> query 'jboss.management.local:J2EEServer=Local,j2eeType=J2EEApplication,*'

URLからGETパラメータを得るには

  • エンティティ側に以下のメンバを用意
    @Stateful
    @AutoCreate
    @Name("hogeBean")
    @Scope(ScopeType.CONVERSATION)
    public class HogeBean
    ...
    	/** パラメータ */
    	@RequestParameter("customer_id")
    	private String customerId;
  • 呼び出し側
    http://svr/contentroot/hogehoge.html?customer_id=xxxxx
  • pages.xmlにメソッド記述
    <page view-id="hogehoge.html" action="#{hogeBean.hoge()}" />
    これでhoge()メソッド内でcustomer_idを参照できる模様

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-06-24 (火) 22:43:13 (2513d)