- PR -

JSFでの値の保持について

1
投稿者投稿内容
まるこ
会議室デビュー日: 2005/12/03
投稿数: 12
投稿日時: 2005-12-16 10:13
現在,JSFで開発を行っています。
登録・更新系の画面で,あるボタンを押した場合に,
同じ画面を再表示します。
その際,コンバータエラー等が発生するのですが,
そのボタンを押した時は入力チェック等を回避したいです。
ただし,入力値は再表示時に画面に反映させておきたいのです。
ボタンの属性にimmediate="true"をつけた場合,
入力チェック等は行われなくなりますが,代わりに
画面再表示時に入力値が消えてしまいます。
(当たり前といえば当たり前ですが...)
入力チェック等を行わず,かつ入力値を保存しておきたいのですが,
何かよい方法はあるでしょうか?
(JavaScriptでも良いです。ブラウザはIE5.5以上限定です。)
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-12-19 10:26
引用:

ボタンの属性にimmediate="true"をつけた場合,
入力チェック等は行われなくなりますが,代わりに
画面再表示時に入力値が消えてしまいます。
(当たり前といえば当たり前ですが...)


そんなことはないはずですが..
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/03
投稿数: 12
投稿日時: 2005-12-19 13:00
よしだひろゆきさん、詳細な返答ありがとうございます。
phaseListenerで確認したところ、確かに
Apply Request Valuesフェーズは通っているのですが,
なぜか,入力値は消えてしまいます。
参照実装はMy Facesの1.1(_以降のバージョンは覚えてないです。)だったと思います。
dataTableではない部分でも入力値が消えてしまいます。

もう少し調べてみます。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-12-20 13:54
私はMy Facesを使ったことがないのですが,
コンポーネント上に値が残っている場合には,それを表示するのは仕様だと思います.
そうでないと,Validationエラーがあった時にも入力値が消えてしまうので.

actionイベントが発行されるということは,パラメタの処理が行われている証拠で,
ボタンだけ処理されて,入力フィールドは処理されないという現象も考えにくいですね.

ボタンと入力フィールドは同じformに入っていますか?
違うformだと送信されません.
<h:outputText value="Request Parameters = #{param}"/>
を書いておくとパラメタを確認できます.
まるこ
会議室デビュー日: 2005/12/03
投稿数: 12
投稿日時: 2005-12-21 23:43
返答ありがとうございます。

ボタンと入力フィールドは同じformに入っています。
<h:outputText value="Request Parameters = #{param}"/>を
書いてみましたが,何も表示されません。
ただ、これはimmediate="true"をはずして,値が取得できる場合でも,
上記のタグでは,何も表示されません。
springと連携していますが,何か関係あるのでしょうか?
ちなみにデバッグしてみたところ,ApplyRequestValuesのフェーズで
入力値がUIComponentにセットされていないようです。
ただ,BackingBean側で
uiInput.getSubmittedValue("コンポーネントのID")のようにすると,
値は取得できます。
しかし、そのやり方でもdataTable内にあるコンポーネントの値は
取得できていません。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 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

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