2003年度 データベース論

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