■環境
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の場合には値をセットしない」という対処により、実現したい機能を実装した。
既に稼動中のシステムへの機能追加のため、コンポーネントのバージョンアップ等による対処ができないため、コンポーネントのバージョンによる問題かどうかの確認は行えていない。