Ads by Google
[--/--/-- (--)]
UIコンポーネント2
[2008/11/21 (金)]
2008/10/20の記事に追記で書いた方法よりもっといい方法を見つけたっぽい気がする…。(前の記事の方法はお蔵入り…うまくいきそうにない…。ちなみに今回の方法はある程度検証済み!!)
その記事でおいらはJSFの複数のコンポーネントの値を連携させようとしていた。で、遅延評価式の確定は大概RenderResponseフェーズだって事に気づいた。そんなら、そこで確定した値を他のコンポーネントに設定するのは同じくRenderResponseフェーズしかないわけで…。だけど、RenderResponseフェーズでetcいじるのはまずいのでは…という事に。
今回の方法のポイントはMapを利用したEL式を作る所。参照する時はこんな感じ…
#{requestScope['myFQCN']['clientId']['key']}キーの意味はそれぞれ…
- myFQCN
- 専用クラスのFQCN (FQCNでなくても他とかぶらなければ何でもいい)
- clienId
- 子コンポーネントと共有すべき値を持つ親コンポーネントのclientId
- key
- 共有する属性値のキー
で、このマップに対して…
- PhaseListenerでRenderResponseフェーズの直前に共有すべき値を持つ コンポーネント(マーカインタフェース等で識別)の全てにアナウンスを流す。
- アナウンスを受けたコンポーネントは自身のclientIdと共有属性のキーを指定して先のマップを参照するEL式を作り、それを子コンポーネントのEL式として設定。
- コンポーネントはレンダリングと同時に自身のELを評価して、その値を先のマップに設定する。
こうすれば、遅延評価式の評価はレンダリング時に行われ、なおかつ連携するコンポーネントは予め設定された場所を参照するだけなので、レンダリング時にコンポーネントの値を再設定する必要が無い。
ちなみに、本当はMapを使わなくても、EL式から参照できてコンポーネントの外で値を共有出来れば何でもいい。ただEL式には予めマップを処理する機能があるのでありがたく拝借する。
コメント
この記事へのコメント
コメントを投稿する


