- - PR -
JSF valueChangeListenerについて
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-26 15:34
元の質問に対する直接的な回答ではないのですが、私の場合、他項目の表示内容を変更したいだけのときはValueChangeListenerを使わずに当該項目のgetterで切り替えます。
かなり雑ですが↓こんな感じです。
ここでは取得元を配列にしていますが、取得元はDBやその他のリソースかもしれません。 「どんなアクションが動いた場合でも当該画面の項目に設定されているプロパティのgetterが呼ばれる」という性質を利用しています。この方法であれば常にチェック後の値を簡単に利用できるかと思います。 人によって解釈が異なるかと思いますが、私はValueChangeListenerをView側のロジックと捉え、「バッキングビーンにたどり着く前に値を改竄したい場合」や「UIComponentを直にいじる必要がある場合」などに利用します。
ActonをRequestスコープにし、そこにビーンのsetter/getterを追加してあげるとビーンへのアクセス方法がすっきりするような気がします(設計のスタンスにもよりますが)。 この場合、ビーンのインスタンスをActionに実際に格納するためにfaces-config.xmlに<managed-property>の設定を追加します。 この設定により、FooServiceを生成した段階でBarも生成(あるいは取得)され、自動的にFooServiceに格納されます(スコープに注意)。
参考: http://izu.shinzui.org/space/JSF/faces-config.xml/%3Cmanaged-bean%3E/Initialize+Managed+Bean+Properties | ||||||||||||
|
投稿日時: 2006-01-26 16:58
はい。その通りです。本当に分かりずらい説明で申し訳ありません。 原因も(2)に該当するものでした。 JavaScriptでsubmitする前にChangeLisner対象項目以外を全てdisabled=trueに設定されていました。 お恥ずかしい限りです。。。やはり漠然と見直すのではなく一から処理を追わなければはまる一方ですね。
今回のシステムも、上記のメリットを生かせるように基底クラスを作られているようでした。 <f:valueChangeListener type="src.FacesLisner"/> <f:actionListener type="src.FacesLisner"/> ActionListenerもvalueChangeListenerも全て同一のクラスを指定すればいいようになっていてJSP側の実装は軽減されていました。(そのお陰でどっぷりはまってしまいましたが・・・) とりあえず、全体を見直してみようと思います。 よしださん、henachocoさんの意見も今後参考にさせて頂きます。 分かりにくい説明に丁寧にご回答頂き有難うございました。 |