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

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

前回に続きJSFと格闘中。ASP.Netで出来た事がJSFでクールに出来ない…。やるせないのでメモ。

おいらはASP.Netを使っていた時はUIコンポーネント(.Netでは確かコントロールとか言ってた)同士を連携させるまとめ役のUIコンポーネントを作って楽する手がお気に入りだった。で、ただコンポーネント同士をまとめるのでなく、あるコンポーネントに設定された値に基づき他のコンポーネントの値を調整するといった、やや混みいった事をしてた。

例えば、エンドユーザにラジオボタン等で幾つか代表的な候補を示し、それ以外の値を入力したい場合のみ最後のラジオボタンを選びその隣の入力コンポーネントにカスタム値を入力してもらう。カスタム値を入力するコンポーネントは子コンポーネントとして記述できるようにし、内容に応じて種類を変えられるようにする。そしてプログラムから入力された値を取り出す時はただの単一値入力コンポーネントと同様に扱えるようにしておく。名づけて"UISelectOrCustom"!うん、我ながらいいネーミング!

このUISelectOrCustomを実装する場合、モデル側からカスタム入力でしかあり得ない値を取得したらば、それを子コンポーネントにも設定しないといけない。すると問題になるのはJSFのUnifiedELの遅延評価式の存在とその評価タイミング。標準のUIコンポーネントの実装方法に倣うなら遅延評価のタイミングはRender Responseフェーズにおける描画時になる。となるとそこで取得した値を子コンポーネントに伝えるタイミングもRender Responseフェーズの描画時になる。

ここが問題になる。てのは、まずRender Responseフェーズでコンポーネントの木構造を書き換えるとクライアントIDの関係が崩れる。そのためJSFではこれは反則になっている。だから設定を受けてコンポーネントの木構造が書き換わるようなコンポーネントは取り扱えなくなる。また、保存する状態の取得は描画前にやっておくので、描画時に子コンポーネントの値を再設定されるとValueChangeEvent等がおかしな事になるし、保存前の状態を前提とするコンポーネント(標準のコンポーネントではないけど)も取り扱えなくなる。つまり、そんなこんなでRender Responseフェーズでコンポーネントに手を加えるのは禁止されていたり危険だったりでチキン野郎のおいらには到底出来ない…。

で、ASP.Netでこれが出来たような気がする理由はそもそも遅延評価ってのが無かったような覚えがある。データバインドにしろ何にしろどっかのタイミングではいドーン!って感じで設定される。だからレンダリング前に値は確定させれるし、それがASP.Netは普通なわけで…。おかげでまぁユーザコントロールやカスタムコントロールは気軽にほいほい作れる。

う~ん、、、せめてJSFが描画前に全ての値を確定するフェーズをデフォルトで用意して、値の確定はそこでやるのを標準にしてくれてればいいのだけど、そんなのは無い…。ま、JSFでも解決策は無くはないような気もするんだけど→追記を参照、なんかトリッキーな手のような気がして自分に自身が持てない。なので遅延評価はいいんだけど…この件についてはASP.Netに一票…。

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


JSFにおける解決策なんだけども、たぶんコンポーネントを参照し値を変えるような派生EL式を作成して、それを子コンポーネントに設定してやればいい。そうすれば子コンポーネントはそのEL式を評価するだけで親コンポーネントの状況が分かる。ま、参照する親コンポーネントがシリアライズ可能て用件にひっかかりそうだけど、これはその親コンポーネント自身の復元で親コンポーネントにやってもらえばいいわけだ。

問題なのははたしてEL式がそんな使い方を想定しているかって事…。なんか用意されてるメソッドがどうも手の込んだ雰囲気がある。getすれば値が取れるただそれだけのインタフェースを継承してたりすると安心出来るんだけど。現状こいつの派生クラスを作るのは、、、やり過ぎかも、、、と思えてくる。かといって安全にコンポーネント同士を連携する手段は今の所これしか無い…何かすごく嫌な感じ…。

上記の方法は試すまでに、もっとましな方法を発見。詳しくは2008/11/21の記事を。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する

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