2003年度 データベース論

Component Binding
エンタープライズアプリケーション II
第8回 / 2006年7月23日
1
ここでの内容

図書検索アプリケーションを通じて、
Component Binding のしくみを理解する
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
Component Binding (1)


Component Binding = UIコンポーネントと
Managed Bean を結びつけること。
Managed Beanに UIData 型のプロパティを用
意する。

dataTable は "UIData" という型になる。
public UIData getBookDataTable{ … };
public void setBookDataTable(UIData d) {};
11
Component Binding (2)


bookDataTable と h:dataTable を結びつける。
 これがComponent Binding
これで、dataTable の内部状態を調べることができる。
<h:dataTable id="table" border="1”
value="#{BookSearcher.bookList}“ var="book”
binding="#{BookSearcher.bookDataTable}">
</h:dataTable>
12
Action Method の実装
public String searchBookDetail() {
// これだけで、クリックされた行の
// book インスタンスを取得できる
book =
(BookData)bookDataTable.getRowData();
}
return "detail";
13
bookData プロパティ


BookSearcher には bookData というプロパティ
がある。
この book は、先の searchBookDetail メソッドで
取得した BookData 型のオブジェクト
public BookData getBookData {
return book;
}
14
詳細表示画面
<h1>詳細表示</h1>
<h:outputText
value="#{BookSearcher.bookData.id}" />
......

BookSearcher Bean の bookData プロパティ
の id プロパティを表示する。
15


h:dataTable 中のどのデータがクリックされた
のかを Action Method で調べたい
そのために




まとめ
Managed Bean にh:dataTable に対応するオブ
ジェクトであるUIData型のプロパティを用意
Component Binding によって、このプロパティと
h:dataTable を明示的に結びつける
h:dataTable に対してどのような操作が行わ
れたか、Component Binding されている
UIData型のプロパティを通して調べることが
できる
クリックされた行に対応する BookData オブ
ジェクトを取得できた
16