FacesContext クラスの利用 J2EE II 第9回 2005年5月15日 1 ここでの内容 JSFの内部状態を保持している、 FacesContext クラスを使ってみる。 2 図書検索プログラムの作成 (2) 3 やりたいこと 図書検索アプリ ケーションの検索 結果表示画面で、 本のタイトルをク リックすると、詳細 なデータが出るよう にしたい 4 何をすればよいのか 「リンクをクリック」することによって、詳細 表示画面に遷移する。 そのためには、「どの本のデータがクリック されたか」を知る必要がある。 具体的には、h:dataTable でどの JavaBeans のデータがクリックされたかを チェックする。 5 list.jsp からの ハイパーリンクの実現 <h:column> …… <h:commandLink id="detail" action="#{BookSearcher.searchBookDetail}"> <h:outputText id="bookTitle" value="#{book.title}"/> </h:commandLink> </h:column> 6 h:commandLink 要素 (1) <h:commandLink id="detail" action="#{BookSearcher.searchBookDetail}"> <h:outputText id="bookTitle" value="#{book.title}"/> </h:commandLink> ハイパーリンクを実現するためのUIコンポーネント id 属性がある。 action 属性では、Action Method を指定する。 7 h:commandLink 要素 (2) <h:commandLink id="detail" action="#{BookSearcher.searchBookDetail}"> <h:outputText id="bookTitle" value="#{book.title}"/> </h:commandLink> h:outputText 要素で指定された文字列をクリックす ると、Action Method の outcome と facesconfig.xml の設定によって画面が遷移する。 8 何が問題になるのか? クリックされたらその詳細表示に飛ぶのだ が、ではどうやって「どのデータがクリックさ れたか」知るのだろうか? どのデータがクリックされたか、 Action Method が知っておく必要がある。 9 dataTable の var 属性 この例では、value 属性は List 型である bookList プロパティ を指定している。 bookList には、複数の BookData が格納されている。 従って、var 属性で指定された book という変数名は、 BookData Bean を指している。 <h:dataTable id="table" border="1" value="#{BookSearcher.bookList}“ var="book"> </h:dataTable> 10 Action Method の実装 public String searchBookDetail() { FacesContext context = FacesContext.getCurrentInstance(); ExternalContext exContext = context.getExternalContext(); Map map = exContext.getRequestMap(); book = (BookData)map.get("book"); } return "detail"; 11 FacesContext FacesContext context = FacesContext.getCurrentInstance(); FacesContext は、JSFアプリケーションの 現在の状態を保持しているオブジェクト JSF の状態を取得するための出発点とな るオブジェクト 12 ExternalContext ExternalContext exContext = context.getExternalContext(); ExternalContext は、Servlet や Portlet か ら JSF を利用することを(特に)意識してい るクラス。 request や session スコープの中で管理さ れているオブジェクトを取り出す。 13 BookDataオブジェクトの取得 (1) Map map = exContext.getRequestMap(); book = (BookData)map.get("book"); request スコープで管理されている情報を Map で取得 “book” という変数名がついている BookData オブジェクトを取得 14 BookDataオブジェクトの取得 (2) Map map = exContext.getRequestMap(); book = (BookData)map.get("book"); この book は、BookSearcher のフィールド。 (ハイパーリンクを)クリックした行の book 変数 に対応付けられている BookData オブジェクトが 取得できる。 このオブジェクト (Bean) のデータを詳細画面で 表示する。 15 bookData プロパティ BookSearcher には bookData というプロパティ がある。 この book は、先の searchBookDetail メソッドで 取得した BookData 型のオブジェクト public BookData getBookData { return book; } 16 詳細表示画面 <h1>詳細表示</h1> <h:outputText value="#{BookSearcher.bookData.id}" /> ...... BookSearcher Bean の bookData プロパティ の id プロパティを表示する。 17
© Copyright 2024 ExpyDoc