- - PR -
JSFの警告について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-05-22 18:35
JSFで画面を遷移した際に、コンソールに下記のようなログが出力されるのですが
原因がよく分かりません。警告を無視して操作しても特に問題なく動作するのですが このメッセージについてご存じの方アドバイスお願いします。 (出力されるときは必ず2行対で出力されます。) ・J2SE5.0 ・Tomcat5.0.28 ・MyFaces1.1.1 ======================================================================= 2006/05/22 18:22:36 org.apache.myfaces.renderkit.html.HtmlRendererUtils decodeUIInput 警告: There should always be a submitted value for an input if it is rendered, its form is submitted, and it is not disabled or read-only. 2006/05/22 18:22:36 org.apache.myfaces.renderkit.html.HtmlRendererUtils decodeUIInput 警告: There should always be a submitted value for an input if it is rendered, its form is submitted, and it is not disabled or read-only. | ||||
|
投稿日時: 2006-05-23 09:08
MyFaceは詳しくないのですが,メッセージから察するに...
例えば, <h:form> <h:inputText value="#{...}"/> <h:commandButton value="button" action="#{...}"/> </h:form> に対して生成するHTMLは <form id="_id0" method="post" action="..."> <input type="text" name="_id0:_id1"/> <input type="submit" name="_id0:_id2" value="button"/> </form> のようになるので,ボタンを押したときに次のようなパラメタが飛ぶはずです _id0:_id1=inputText _id0:_id2=button _id0=_id0 メッセージの内容は, _id0というパラメタが来ているからformがsubmitされているはずなのに, 期待している_id0:_id1あるいは_id0:_id2が来ていない, という意味でしょう. 理由として考えられるのは (1)クライアント側でJavaScriptなどで勝手な編集をしている (2)htmlを生成したタイミングではdisabled, readonly, !renderedのいずれかになって いるフィールドかボタンが,レスポンスを受けるタイミングで,!disabled & !readonly & rendered になっている. (2)の原因として典型的なのは,disabledやrenderedにリクエストスコープのバッキング ビーンをバインドしていることです. | ||||
|
投稿日時: 2006-05-23 09:10
メッセージはdecodeUIInputから出ているので入力フィールドの方ですね.
| ||||
|
投稿日時: 2006-05-23 09:32
よしだ様、アドバイス有り難うございました。ご指摘頂いた内容でJSPを確認したところ
該当するような箇所が見つかりました。 下記のようにpanelStackを利用していたのですが条件に沿わない際はレンダリング されていないものだと解釈おりました。おそらく明示的にrenderedをfalseに設定 してやる必要があるということですよね?早速テストを行ってみたいと思います。 <t:panelStack id="sample" selectedPanel="#{loginAction.userState}"> <h:panelGrid id="guest"> <h:outputText value="社員コード"/> <h:inputText id="employeeno" value="#{loginAction.employeeCode}"/> ←ここ <h:outputText value="パスワード"/> <h:inputSecret id="passwd" value="#{loginAction.passwd}"/> ←ここ </h:panelGrid> <h:panelGrid id="login"> <h:outputText value="ようこそ#{loginAction.userInfo.firstName}さん"/> <h:commandButton value="ログアウト" action="#{loginAction.logout}"/> </h:panelGrid> </t:panelStack> | ||||
|
投稿日時: 2006-05-23 10:25
おそらくそういうことではなくて,レンダリングの時と次のリクエストの時とで 状態が違っていることが問題なのではないでしょうか? 最も典型的な原因はリクエストスコープのビーンと使っていることですが, loginActionはリクエストスコープではありませんか? セションスコープで試してみてください. | ||||
|
投稿日時: 2006-05-23 21:21
> 最も典型的な原因はリクエストスコープのビーンと使っていることですが,
> loginActionはリクエストスコープではありませんか? > セションスコープで試してみてください. 返事有り難うございます。本日、作業が出来ていないのでテスト出来ていませんが loginActionはfaces-configにてセッションスコープになるように設定しています。 ご指摘頂いた内容を踏まえ、明日再チャレンジしてみます。 | ||||
|
投稿日時: 2006-05-24 09:02
そうですか..ピントはずれな指摘でしたね. ちなみに,結果を表示する方のJSPに次のようなタグを入れておくと,リクエストパラメタ の値が確認できますので,お試しください. <p/><h:outputText value="param= #{param}"/> | ||||
|
投稿日時: 2006-05-24 17:54
解決しましたので結果を報告させて頂きます。
結論から申し上げると、トマホークのpanelStackを使用した場合に分岐で処理されなかった と思っていた部分に記述されていたUIコンポーネントもバックエンドでは存在しており、 そのコンポーネントに対する値がサブミット時に渡されなかったのが原因のようです。 従いまして、UIコンポーネントのrenderedを明示的にfalseと指定してやることで現象が 解決しました。 よしだ様には最後までご協力頂き大変有り難うございました。また、別の質問をさせて頂く こともあるかと思いますがその際は宜しくお願いします。 |