2

JSF + Primefaces 初心者。(JSF 2.1、Primefaces 3.4.2 を使用)

Primefaces commandButton を使用してデータをフェッチし、さまざまなフォーム コンポーネントに入力する内部 panelGroup を持つフォームがあります。partialSubmit は、まだ入力されていないフィールドの検証の問題を回避するため、うまく機能します。ページは意図したとおりに機能しますが、実装を「よりクリーン」に調整しようとしています。

私の質問は、フォームが使用しているバッキング Bean に使用している JSF スコープに関するものです。セッションスコープを使用すると、すべてがうまくいきますが、リクエストスコープを使用する場合はそうではありません. 「最終」送信 (別の p:commandButton コンポーネント経由) とこのフェッチ ボタンの両方が送信を呼び出しているため、いずれかへの応答が要求ライフサイクルの完了を構成することを理解しています。私が正しければ、(requst スコープを使用して) 以下を取得する理由が説明されています:
java.lang.IllegalStateException: Cannot create a session after the response has been commited

取得ボタンを使用する場合。

しかし、明らかにこれは、フォームが Bean を介して更新されたデータを使用するようにするだけのフェッチ要求に対する私の意図を「壊します」。

したがって、(partialSubmit="true" commandButton (デフォルトで ajax 動作が有効になっている) を介して) 中間送信を使用する設計パターンでは、少なくともセッション スコープのバッキング Bean を使用する必要があるという私の理解は正しいでしょうか? 理想的には実装リクエストとナビゲーション レベル リクエストのメカニズムにより、これらの中間サブミットを 1 つのリクエストのコンテキスト内で実行できるようになります。または、追加の調査を行う必要がありますか?私の 1.2 コピー?) MTIA でフィードバックをお寄せください。

私のフェッチコンポーネント:

<p:commandButton id="returningBtn" partialSubmit="true" value="Hit if returning" 
    process="nameInfo" actionListener="#{player.loadReturning}" update="registrationForm">
    <p:resetInput target="registrationForm" />
</p:commandButton>

私の最終提出:

<p:commandButton tabindex="0" id="SubmitButton" value="Register"
   action="#{player.register}" update="regPage"/>
4

1 に答える 1

3

partialSubmit は、まだ入力されていないフィールドの検証の問題を回避するため、うまく機能します。

いいえ、それはしません。現在のフォームのすべての入力フィールドではなく、属性で指定された入力フィールドのみをprocessサーバーに送信します。これはまさに、どの入力を処理 (変換、検証、更新) する必要があるかを示す属性です。は、ネットワーク帯域幅とリクエスト パラメータ解析のオーバーヘッドを削減するだけです。この件に関する PrimeFaces ブログも参照してください。processpartialSubmit="true"


ページは意図したとおりに機能しますが、実装を「よりクリーン」に調整しようとしています。私の質問は、フォームが使用しているバッキング Bean に使用している JSF スコープに関するものです。セッションスコープを使用すると、すべてがうまくいきますが、リクエストスコープを使用する場合はそうではありません.

セッション スコープは、実際にはフォームの間違ったスコープです。リクエストまたはビュー スコープのいずれかが必要です。フォームに、同じフォームでの後続の送信で記憶する必要がある特定の状態がある場合は、ビュー スコープが必要です。適切な Bean スコープを選択する方法も参照してください。


java.lang.IllegalStateException: 応答がコミットされた後にセッションを作成できません

これは、2.1.8 で修正された Mojarra のバグとして認識できます。アップグレードできない場合のいくつかの回避策については、「 <h:form> を追加すると java.lang.IllegalStateException: Cannot create a session after response has been commited」も参照してください。


したがって、(partialSubmit="true" commandButton (デフォルトで ajax 動作が有効になっている) を介して) 中間送信を使用するデザイン パターンでは、少なくともセッション スコープのバッキング Bean を使用する必要があるという私の理解は正しいでしょうか? 理想的には、ナビゲーション レベルの要求に対して実装要求を行うメカニズムにより、これらの中間送信を 1 つの要求のコンテキスト内で実行できるようになります。

前述のように、ビュー スコープが必要です。


それとも、追加の調査を行う必要がありますか? (私の 1.2 のコピーを使用するのではなく、JSF 2.x の本を入手しますか?)

絶対。ビュー スコープが JSF2 以降に新しくなっただけでなく、JSF1 と比較して JSF2 では他の多くのことが異なって (よりエレガントに) 行われています。JSF wiki ページの下部に、適切な JSF2 リソースへのリンクがいくつかあります。

于 2013-01-15T14:06:41.400 に答える