- PR -

JSF valueChangeListenerについて

投稿者投稿内容
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2006-01-26 15:34
元の質問に対する直接的な回答ではないのですが、私の場合、他項目の表示内容を変更したいだけのときはValueChangeListenerを使わずに当該項目のgetterで切り替えます。

かなり雑ですが↓こんな感じです。

コード:
private int selectedItem = 0; // リストボックスの選択値
private String[] arrComment = { "未選択", "選択A", "選択B" };
public String getComment() {
  return arrComment[selectedItem];
}



ここでは取得元を配列にしていますが、取得元はDBやその他のリソースかもしれません。
「どんなアクションが動いた場合でも当該画面の項目に設定されているプロパティのgetterが呼ばれる」という性質を利用しています。この方法であれば常にチェック後の値を簡単に利用できるかと思います。

人によって解釈が異なるかと思いますが、私はValueChangeListenerをView側のロジックと捉え、「バッキングビーンにたどり着く前に値を改竄したい場合」や「UIComponentを直にいじる必要がある場合」などに利用します。

引用:

いなふみさんの書き込み (2006-01-25 18:26) より:

今回のシステムでは基底クラスが用意されているのですが、ビーンはあくまでデータ格納用として使用し、Action、ValueChangeイベントは基底クラスを敬称した別クラスを作成する仕組みになっています。
この基底クラスでcreateValueBindingを使用していますので、全てがreateValueBindingでビーンの情報を取得していることになります。



ActonをRequestスコープにし、そこにビーンのsetter/getterを追加してあげるとビーンへのアクセス方法がすっきりするような気がします(設計のスタンスにもよりますが)。
この場合、ビーンのインスタンスをActionに実際に格納するためにfaces-config.xmlに<managed-property>の設定を追加します。
この設定により、FooServiceを生成した段階でBarも生成(あるいは取得)され、自動的にFooServiceに格納されます(スコープに注意)。

コード:
---------
public class FooService { // Action
  private Bar bar = null;
  public void setBar(Bar bar) { this.bar = bar; }
  public Bar getBar() { return bar; }
  public String doAction() {
    updateDB(bar); // 適当な処理
    return "ok";
  }
}
---------
public class Bar { // ビーン
  private String name = null;
  public void setName(String name) { this.name = name; }
  public String getName() { return name; }
}
---------
↓JSPからのアクセス方法
#{fooService.bar.name}
---------



参考:
http://izu.shinzui.org/space/JSF/faces-config.xml/%3Cmanaged-bean%3E/Initialize+Managed+Bean+Properties
いなふみ
常連さん
会議室デビュー日: 2005/09/14
投稿数: 20
投稿日時: 2006-01-26 16:58
引用:

h:selectOneMenuはonclickのJavaScriptにてsubmitするようになっているのではないかと
思います.違いますか?

原因として私が思いつくのは二つです:
(1)ボタンとセレクトメニューが異なるformに含まれている
(2)JavaScriptを使って,入力値を変更している


はい。その通りです。本当に分かりずらい説明で申し訳ありません。
原因も(2)に該当するものでした。
JavaScriptでsubmitする前にChangeLisner対象項目以外を全てdisabled=trueに設定されていました。
お恥ずかしい限りです。。。やはり漠然と見直すのではなく一から処理を追わなければはまる一方ですね。

引用:

JSFの最大のメリットは,画面設計をしてJSPを作る人(JSFの仕様書ではPage Authorと
呼ばれています)と,処理ロジックを書く人(同じくApplication Developer)の役割
分担がはっきりできることだと思っています.


今回のシステムも、上記のメリットを生かせるように基底クラスを作られているようでした。
<f:valueChangeListener type="src.FacesLisner"/>
<f:actionListener type="src.FacesLisner"/>
ActionListenerもvalueChangeListenerも全て同一のクラスを指定すればいいようになっていてJSP側の実装は軽減されていました。(そのお陰でどっぷりはまってしまいましたが・・・)
とりあえず、全体を見直してみようと思います。
よしださん、henachocoさんの意見も今後参考にさせて頂きます。
分かりにくい説明に丁寧にご回答頂き有難うございました。

スキルアップ/キャリアアップ(JOB@IT)