S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

h:selectOneMenuでのa4f:supportの挙動


■環境


JDK 1.4.2_13
MyFaces 1.1.1
Ajax4jsf 1.0.1
InternetExplorer 6 SP2
FireFox 1.5.0.10


■現象


以下のようなJSPを書いて実行したとき、cのプルダウンメニューの選択を選択するとonchangeなイベントで処理("#{hogeForm.doChangeC}")が実行される。
その時cのsetterは呼び出される。
しかし、なぜかbとdのsetterが呼び出されている。
aとeのsetterは呼び出されない。
HTTPのリクエストを覗くと、cの値はパラメータとして送信しているが、a,b,d,eの値は送信していない。
ちなみにeの値を変更すると、e,b,c,dのsetterが呼び出され、aのsetterは呼び出されない。
HTTPのリクエストを覗くと、eの値はパラメータとして送信しているが、a,b,c,dの値は送信していない。


#タグa4f:supportのイベントonchageでは必ずh:selectOneMenuのsetterが呼び出される
#という動作に見える。

  <h:form>
    <h:inputText id="a" value="#{hogeForm.a}" />
    <h:selectOneMenu id="b" value="#hogeForm.b}">
      <f:selectItems value="#{hogeForm.bList}" />
    </h:selectOneMenu>
    <h:selectOneMenu id="c" value="#hogeForm.c}">
      <f:selectItems value="#{hogeForm.cList}" />
      <a4j:support id="bSupport" event="onchange"
        action="#{hogeForm.doChangeC}"
        ajaxSingle="true" reRender="d" />
    </h:selectOneMenu>
    <h:selectOneMenu id="d" value="#hogeForm.d}">
      <f:selectItems value="#{hogeForm.dList}" />
    </h:selectOneMenu>
    <h:inputText id="e" value="#{hogeForm.e}">
      <a4j:support id="eSupport" event="onchange"
        action="#{hogeForm.doChangeE}"
        ajaxSingle="true" reRender="a" />
  </h:form>


■試行


試しにタグa4j:supportの属性ajaxSingleをfalseにしてみたところ、リクエストのパラメータにa,b,c,d,eの値が送信されるようになったが、onchangeなイベントの処理("#{hogeForm.doChangeC}")が動作しない。
phase-listenerで動作を確認すると、

RESTORE_VIEW(1)
APPLY_REQUEST_VALUES(2)
PROCESS_VALIDATIONS(3)
RENDER_RESPONSE(6)

となっており、モデル更新(UPDATE_MODEL_VALUES)に入らずにレスポンスを返している。
実際のJSPにはタグh:meaagesを入れており、バリデータ等によるエラーはないことを確認している。
ちなみに、上記のJSPのままだと、下記の通り各フェーズが処理されている。

RESTORE_VIEW(1)
APPLY_REQUEST_VALUES(2)
PROCESS_VALIDATIONS(3)
UPDATE_MODEL_VALUES(4)
INVOKE_APPLICATION(5)
RENDER_RESPONSE(6)

その他の
・タグa4j:supportの属性parentPropertiesを設定する
・タグh:form→a4j:formに変更する
等の処置を行ってみたが、上記のJSPの動作に変化はなかった。
念のためにFireFoxでも確認してみたが、動作は同じであった。

ちなみに、タグa4j:supportをbとeに記述しても同じ結果となる。


■対処

b,dのsetterにはnullが送られてきていたことから、a,b,c,d,eそれぞれのsetterで、「nullの場合には値をセットしない」という対処により、実現したい機能を実装した。

既に稼動中のシステムへの機能追加のため、コンポーネントのバージョンアップ等による対処ができないため、コンポーネントのバージョンによる問題かどうかの確認は行えていない。