上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

役に立ったらぽちっとよろしく。 人気ブログランキングへ

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
共有する属性値のキー

で、このマップに対して…

  1. PhaseListenerでRenderResponseフェーズの直前に共有すべき値を持つ コンポーネント(マーカインタフェース等で識別)の全てにアナウンスを流す。
  2. アナウンスを受けたコンポーネントは自身のclientIdと共有属性のキーを指定して先のマップを参照するEL式を作り、それを子コンポーネントのEL式として設定。
  3. コンポーネントはレンダリングと同時に自身のELを評価して、その値を先のマップに設定する。

こうすれば、遅延評価式の評価はレンダリング時に行われ、なおかつ連携するコンポーネントは予め設定された場所を参照するだけなので、レンダリング時にコンポーネントの値を再設定する必要が無い。

ちなみに、本当はMapを使わなくても、EL式から参照できてコンポーネントの外で値を共有出来れば何でもいい。ただEL式には予めマップを処理する機能があるのでありがたく拝借する。

UMLシーケンス図
スポンサーサイト

役に立ったらぽちっとよろしく。 人気ブログランキングへ

コメント
この記事へのコメント
コメントを投稿する

トラックバック
この記事のトラックバックURL
この記事へのトラックバック
Copyright © ふらふら技術者の日記 All Rights Reserved.
Powered by FC2 Blog
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。