0

JSF 値バインディングは単方向ですか、それとも双方向ですか?

バッキング Bean データをクリアしても、ビューは古い値を保持します。これはJSFの仕組みですか?ビューをバッキング Bean と同期する方法を知りたいです。

4

3 に答える 3

1

はい、データバインディングは双方向です。しかし、これは次の 2 つの重要な質問に答えなければ、ほとんど意味がありません。

  • 読み取りと書き込みが発生すると、
  • どのような条件で発生します。

答えは次のとおりです。

  • すべてのコンポーネントが有効な場合、データはポストバック後にコントロールから Bean にプッシュされます。
  • レンダリングの直前、つまり、各アクションが発生し、各標準イベント (コマンド ボタン、valuechange イベントなど) が発生した後で、データが Bean から読み取られます。

これは、最初の直感に反して、次のことを意味します。 - 入力などのコンポーネントはその状態を保持し、バッキング Bean から切り離されます。これは、バッキング Bean との同期を行わずに (たとえば、フォームの他のコンポーネントが検証に失敗した場合に) 長時間保持することができます。

ライフサイクルを想像する最も簡単な方法は次のとおりです。

  1. コンポーネントは、要求データを使用して状態を復元し、場合によってはその他の構成依存の手段を使用します [ポストバックのみ]
  2. 変換と検証に問題がない場合、バインディングを使用してコンポーネントからのデータがバッキング Bean にコピーされます。そうでない場合、次のステップはスキップされますが、コンポーネントはその状態を記憶します [ポストバックのみ]
  3. アクションが実行されます (ビュー アクション、コマンド)。この段階では、いつでも Bean からデータを読み取り、それが有効であることを確認できます (「一貫性」ではなく、「分離された各コンポーネントに許容値がある」ように)。次のステップで確実に使用されるように、Bean の値を変更することもできます。
  4. バインディングは、バッキング Bean からデータをプルしてプルするためにコンポーネントによって使用されます。

要点は次のとおりです。

  • ゲッターとセッターにロジックを入れようとすると、問題が発生します。セッターのいずれかが追加のプロパティを設定すると、他の値を設定するコードになってしまいます。結果は、バインディングの呼び出しの順序に依存する場合があります (ステップ 2)。
  • データを変更する唯一の適切なタイミングは、ステップ 3 です。つまり、アクションが実行される瞬間です。
  • アクションがない場合は、PreRenderView イベントを使用することもできます。これは、ステップ 3 と 4 の間で呼び出されます (ポストバックなしの純粋な GET ページがある場合は、一部のデータを Bean に移動するために使用できます)。
  • Bean を変更したり、コンバーター、バリデーター、および valuechangelisteners で Bean の値に依存したりすることは、少なくとも注意が必要です。

木目に沿ってJSFを使ってみると、本当に使い心地がいいです。Web フレームワークがどのように機能するかについてのあなたのアイデア (バリデーターでのビジネス検証の使用、コンバーター内でのモデルの変更、コンストラクターからのデータベースの読み取りなど) に逆らって JSF を曲げようとする場合は、多くの BalusC の助けが必要になります。 :-)

于 2013-03-03T12:32:40.800 に答える
0

あなたが何を求めているのか正確にはわかりませんが、はい、Bean がリクエストスコープ以外の場合、HTML フォームコントロールに以前の値が入力されます。

Bean がビュー スコープまたはセッション スコープの場合でも、Bean のアクション メソッド (commandLink/commanButton アクション) でモデル値を操作することにより、レンダリングされた値を制御できます。

後で同じページにアクセスしたときに値をクリアしたい場合は、ページ Bean のリクエスト スコープを作成する必要があります。

必要に応じて、値ではなくバインディングを使用して完全な制御のために UIComponents を直接マイクロ管理し、bean.eg で直接 UIComponents を作成および管理できます。

<h:inputText binding="#{bean.inputComponent" />そしてあなたのコードで

public class myBean {
    private UIInput inputComponent;

    public UIComponent getInputComponent() {
        // create your UIComponent here, and manage values in your command methods
    }

    public void setInputComponent(UIComponent component) {
         inputComponent = component;
    }

}

于 2013-03-03T08:24:02.697 に答える
0

JSF は、指定されたとおりに実行します。

ビューを更新するには (Bean に変更を加えた後) 、元のビューにポストバックするか、アクション メソッドから null/void を返すか、クライアント ID (または @form などの他の受け入れられる値) を指定する必要があります。 ) 実行 (更新) され、後でBean に変更を加えるコンポーネントに添付されたタグの属性としてレンダリング (更新) されるコンポーネントの。<f:ajax>

于 2013-03-03T08:24:09.997 に答える