- PR -

JSF actionListener実行時にvalueChangeListenerが実行される

1
投稿者投稿内容
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2007-03-19 14:09
こんにちは。いつもお世話になっております。

ただいま、actionListenerとvalueChangeListenerを両方置くページを作成しています。
valueChangeListenerの箇所は問題なく動くのですが、actionListenerを実行すると、1度目のクリック時にはactionListenerが実行され、2度目のクリック時にはvalueChangeListenerが実行されてしまいます。3度目、4度目…はその繰り返しです。
それぞれに応じた動作のみを行わせたいのですが、何が原因なのかがつかめません。
お分かりになる方がいらっしゃいましたらご教授お願いいたします。

======================================================
□JSP
<!-- プルダウン1 -->
<h:selectOneMenu onchange="submit();"
valueChangeListener="#{testBEAN.name1Chage}" value="#{testBEAN.name1}" >
 <f:selectItem itemValue="nameA" itemLabel="nameA" />
 <f:selectItem itemValue="nameB" itemLabel="nameB" />
 <f:selectItem itemValue="other" itemLabel="other" />
</h:selectOneMenu>

<!-- プルダウン1でother選択時にのみ表示 -->
<h:inputText value="#{testBEAN.other1}" rendered="#{testBEAN.nameX1 == 3}" />

<!-- ここをクリックすることでname2を表示する -->
<h:commandButton value="+" actionListener="#{testBEAN.name2H}" />

<!-- name2:name2xが0以外の場合に表示 -->
<h:inputText value="#{testBEAN.name2}" rendered="#{testBEAN.name2x >= 1}" />

======================================================
□testBEAN.java (値の保持:request)

public class TestBean {
 private String name1;
 private int nameX1;
 private String other1;
 private int name2x;
 private String name2;

 …各getter/setter…

 public void name1Chage(ValueChangeEvent event){

  FacesContext.getCurrentInstance().renderResponse();
  String strVal = event.getNewValue().toString();

   if(strVal.equals("nameA")){
     this.setNameX1(1);
   }else if(strVal.equals("nameB")){
     this.setNameX1(2);
   }else{
     this.setNameX1(3);
   }
 }

 public void name2H(ActionEvent event){
 
  //requestのため、値を再set
  if(this.getName1().equals("nameA")){
   this.setNameX1(1);
  }else if(this.getName1().equals("nameB")){
   this.setNameX1(2);
  }else{
   this.setNameX1(3);
  }

  //name2を表示する
  this.name2x++;
 }
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2007-03-28 17:15
動作のみを書いて、肝心の何がしたいのかを書き忘れていました。。
申し訳ございません。

表示・非表示を制御したかったのですが、他ページで「valueChangeListener」はあまり使わないほうが良い、ということでしたので、JavaScriptを用いてその箇所は制御することにしました。

書き込みに不備があり、誠に申し訳ございませんでした。
また、お考えくださった方、ありがとうございました。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2007-04-03 14:54
もう解決してしまったようですが、一応解説しておきます。

valueChangeListenerはクライアントから戻ってきた入力値が、保持されている古い値と異なった時に、呼び出されます。

もし、バインディングされているマネージドビーンがrequestスコープだと、リクエスト毎に初期化されるので「保持されている古い値」は対応するプロパティの初期値(通常はnull)になります。

当たり前の話なのですが、一つ前のリクエスト時点の値を保持していなければvalueChangeListenerを使う意味はありませんから、マネージドビーンはsessionスコープに置かなければなりません。
1

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