- - PR -
JSFでの値の保持について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-16 10:13
現在,JSFで開発を行っています。
登録・更新系の画面で,あるボタンを押した場合に, 同じ画面を再表示します。 その際,コンバータエラー等が発生するのですが, そのボタンを押した時は入力チェック等を回避したいです。 ただし,入力値は再表示時に画面に反映させておきたいのです。 ボタンの属性にimmediate="true"をつけた場合, 入力チェック等は行われなくなりますが,代わりに 画面再表示時に入力値が消えてしまいます。 (当たり前といえば当たり前ですが...) 入力チェック等を行わず,かつ入力値を保存しておきたいのですが, 何かよい方法はあるでしょうか? (JavaScriptでも良いです。ブラウザはIE5.5以上限定です。) | ||||
|
投稿日時: 2005-12-19 10:26
そんなことはないはずですが.. HttpRequest上のパラメタはまずApply Request Valuesフェーズでコンポーネントに反映され ます.この時,ボタンのimmediate属性がtrueであれば,Actionイベントを生成します. Apply Request Valuesフェーズの最後でActionイベントが処理されると RenderResponseフラグが立つので,Process Validationsフェーズなどをスキップして Render Responseフェーズへ進みます. Render Responseフェーズではコンポーネントにnull以外の値があればそれを表示します. (つまりバッキングビーンの値を見ませんので,アクションの方でバッキングビーンの値を変えても無効です). なお,参照実装の1.1_01では,たしか,dataTableでは入力値が消えるというバグがあったかと思います. | ||||
|
投稿日時: 2005-12-19 13:00
よしだひろゆきさん、詳細な返答ありがとうございます。
phaseListenerで確認したところ、確かに Apply Request Valuesフェーズは通っているのですが, なぜか,入力値は消えてしまいます。 参照実装はMy Facesの1.1(_以降のバージョンは覚えてないです。)だったと思います。 dataTableではない部分でも入力値が消えてしまいます。 もう少し調べてみます。 | ||||
|
投稿日時: 2005-12-20 13:54
私はMy Facesを使ったことがないのですが,
コンポーネント上に値が残っている場合には,それを表示するのは仕様だと思います. そうでないと,Validationエラーがあった時にも入力値が消えてしまうので. actionイベントが発行されるということは,パラメタの処理が行われている証拠で, ボタンだけ処理されて,入力フィールドは処理されないという現象も考えにくいですね. ボタンと入力フィールドは同じformに入っていますか? 違うformだと送信されません. <h:outputText value="Request Parameters = #{param}"/> を書いておくとパラメタを確認できます. | ||||
|
投稿日時: 2005-12-21 23:43
返答ありがとうございます。
ボタンと入力フィールドは同じformに入っています。 <h:outputText value="Request Parameters = #{param}"/>を 書いてみましたが,何も表示されません。 ただ、これはimmediate="true"をはずして,値が取得できる場合でも, 上記のタグでは,何も表示されません。 springと連携していますが,何か関係あるのでしょうか? ちなみにデバッグしてみたところ,ApplyRequestValuesのフェーズで 入力値がUIComponentにセットされていないようです。 ただ,BackingBean側で uiInput.getSubmittedValue("コンポーネントのID")のようにすると, 値は取得できます。 しかし、そのやり方でもdataTable内にあるコンポーネントの値は 取得できていません。 | ||||
|
投稿日時: 2005-12-22 16:31
何か根本的なすれ違いがあるようです.
私が試したコードは以下です. <f:view> <h:form> name: <h:inputText value="#{mybean.name}"/> <h:commandButton value="none" immediate="true" action="none"/> </h:form> <h:messages/> <h:outputText value="param= #{param}"/> </f:view> 入力フィールドに適当な文字列を入れてnoneボタンを押すと,再表示され 入力フィールドの文字列はそのままで,下部に以下の表示が現れます. param= {_id0:_id2=none, _id0:_id1=asdfa, _id0=_id0} _id0:_id2はnoneボタンのIDです. _id0:_id1は入力フィールドのIDでasdfaが入力した文字列です. まずはこのサンプルで動作確認してみてください. |
1