2010-11-27 11 views
2

今日はJSFのLifecycleについてarticleを読んでいました。JSF - ライフサイクルに関する質問

Iは、これらの点を理解するためにいくつかの問題を持っている:

1 - フェーズ3:プロセス検証 - これは、コンポーネントがその新しい値を検証することができる位相です。 新しい値が有効で以前の値と異なる場合は、値変更イベントが作成されてキューに入れられます。この例では、ユーザーがフォームを送信する前に名前を変更した場合、ValueChangeEventオブジェクトはNameテキストボックスに対応するUIInputコンポーネントObjectによって作成され、このフェーズの最後で処理するためにキューに入れられます。これはvalueChangeInputメソッドバッキングBeanが呼び出されます。

JSFは古い値と新しい値の違いをどのように知ることができますか?ビューオブジェクトのインスタンスは2ですか?前の(要求前のもの)と新しい? (最後のプロセスによって追加されたFacesContextの値を持つ、リクエストの値を適用する)

2 - フェーズ5:アプリケーションの呼び出し - 要求のすべての値がバッキングBeanに正常に設定されると、適用要求値フェーズが処理されます。 私たちの場合、送信ボタンアクションメソッド。

したがって、FacesContextのインスタンスをUI要素(およびその値)をHtmlに変換する最後のフェーズ(レンダリング応答)に直接送信します。それで、(豆の)ゲッターメソッドが呼ばれるのはいつですか?

乾杯

答えて

4

はどのようにJSFは、古い値と新しいものとの違いを知ることができますか?ビューオブジェクトのインスタンスは2ですか?前の(要求前のもの)と新しい? (最後のプロセスによって追加されたFacesContextの値を持つ、要求値の適用)​​

古い値は現在のモデル値です。新しい値は提出された値です。次の例では、

<h:inputText value="#{bean.value}" /> 

JSF 基本的には、以下の(簡潔にするため省略変換/検証)を行います。

Object oldValue = bean.getValue(); 
Object newValue = request.getParameter(clientId); 
if (oldValue == null ? newValue != null : !oldValue.equals(newValue)) { 
    // Create and queue ValueChangeEvent. 
} 

だから、それが直接のFacesContextのインスタンスを送信UI要素(およびその値)をHtmlに変換する最後のフェーズ(レンダリング応答)。

正確にはそうではありませんが、はい、レンダリング応答は、呼び出しアクションが終了したときに開始されます。


ので、(豆の)ゲッターメソッドが呼び出されるということであるとき?

はい、レンダリング応答中は、ビューにバインドされている場合にのみ発生します。

here JSFのライフサイクルをより実践的に説明する別の記事があります。

+0

最初の回答の回答:OK、Beanから値を取得します。しかし、Beanがリクエストスコープであれば、ビューを作成するとすべての値がnullになります。 (また、valueChangeハンドラを呼び出す必要がありますか?) 2点目について:私は理解していません。したがって、ライフサイクルの最初のポイントでViewインスタンス(FacesContext)の値を設定し、検証(または変換)してもエ​​ラーが発生しない場合は、Beanから同じ値を取得しますか?私はあなたの記事を今日の午後に見ました...しかし、まだ明らかではありません。私はもう一度練習する必要があります... – markzzz

+0

beanのコンストラクタまたはpostconstructにプリセットされている場合、値はnullになりません。値変更リスナーは、サブミットされた値が初期モデル値と異なる場合に呼び出されます。エラーがなければ、モデル値を表示します(更新モデル値フェーズ中に提出された値から設定されます)。エラーがある場合は、エラーのためにモデル値を設定できないため、提示された値が表示されます。 – BalusC

+0

一歩一歩(そうでなければもっと混乱させる)。 FacesContextは "古いモデル"(Beanに保存されている)によってgettedされた値を持つオブジェクトです。 (ライフサイクルの最初の時点で作成され、私はポストバック要求について話しました...) – markzzz