PowerPointファイル

Download Report

Transcript PowerPointファイル

FacesContext クラスの利用
JSFによるWebアプリケーション開発
第8回
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