FacesContext クラスの利用 J2EE II 第11回 2004年12月16日 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 属性 <h:dataTable id="table" border="1" value="#{BookSearcher.bookList}“ var="book"> </h:dataTable> var 属性は、コレクション中の1つの要素を表す 変数名となる。 List 中の1つの BookData が、表の1行分とな る。 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 変数に対応付けられている BookData オ ブジェクトが取得できる。 このオブジェクト (Bean) のデータを詳細 画面で表示する。 15 詳細表示画面 <h1>詳細表示</h1> <h:outputText value="#{BookSearcher.bookData.id}" /> ...... BookSearcher Bean の bookData プロパティ の id プロパティを表示する。 16
© Copyright 2025 ExpyDoc