2011-01-25 19 views
3

HI、JSFのActionListenerフェーズ

JSF BeanでActionListenerメソッドを呼び出すことに疑問があります。たとえば、JSFフォームのリクエストや提出はすべて、6つのフェーズのライフサイクルを経ています。しかし、アクションリスナーやバリュー変更リスナーのような特定のイベントをトリガするとき、そのリクエストに関連するライフサイクルはありますか?

私を明確にしてください。

答えて

10

呼び出しアクションフェーズの間にアクションリスナーが呼び出されるのは、の前に、実際のアクションメソッドより前です。どのアクションリスナメソッドが呼び出されるかは、サブミットに関連付けられたUICommandコンポーネントのactionListener属性に基づいて決定されます。

任意の値変更リスナーは、検証フェーズ中に呼び出される(または特定UIInputコンポーネントの要求値の位相immediate="true"を適用)後に送信された値の成功し変換/検証をおよびのみ送信された値が異なる場合初期値。どの値変更リスナーメソッドが呼び出されるかは、サブミットに関連付けられたUIInputコンポーネントのvalueChangeListener属性に基づいて決定されます。

いいえ、独自のライフサイクルはありません。彼らが実行を終えてリターンすると、それはライフサイクルの同じ段階の中にあります。 valueChangeListenerを呼び出した後、JSFは次のUIInputコンポーネントの変換/検証を継続します。存在しない場合は、次のフェーズに進みます。 actionListenerを呼び出した後、JSFは次のactionListenerに進みます。存在しない場合は、実際のアクションメソッドを呼び出します。


更新は:もう一度あなたのコメントを読んだ後、私は今、特に値変更リスナーについてのあなたの疑問を見ていると思います。既定では、クライアント側の変更イベント中に、サーバー側に対してまったく新しい要求がすぐに発生すると考えるようです。それはではなく、デフォルトでです。 JavaScriptコードという小さな部分を追加して、HTML入力フィールドの変更イベント中にHTMLフォーム全体を送信することによってのみこれを達成できます。

onchange="this.form.submit()" 

この部分はJSFとは関係ありません。これは単純なHTML属性です。 Webブラウザでページを開き、右クリックしてソースを表示を選択します。それがそこにあることがわかります。あなたのブラウザでJavaScriptを無効にするか、JSFコードでJavaScriptを削除すると、それ以上動作しなくなることがわかります。送信ボタンを自分でにする必要があります。

+0

OK。たとえば、コンボボックスの値を変更しているときなどです。 ValueChangeListenerがトリガーされます。これは、サーバーへの完全な新しい要求をトリガーし、ページが再ロードされると言うことを意味します。 Resore Viewフェーズから開始します。私は正しいですか? – Krishna

+1

いいえ、そうではありません。少なくとも、デフォルトではありません。値変更リスナーメソッドの内部で 'ExternalContext#redirect()'または 'FacesContext#responseComplete()'を呼び出した場合にのみ、JSFがライフサイクルから飛び出すようになります。最初のリクエストは、リクエスト全体を放棄してゴミ箱に移動し、ブラウザが指定されたURLで新しいGETリクエストを発行するようにします。 2番目のページはデフォルトで空白のページになります。これは、あなた自身がレスポンスに既に何か(バイナリファイルなど)を書いていて、JSFがビューをレンダリングするのを避けたい(そしてバイナリファイルを壊す)ときに(アクションメソッドで)よく使われます。 – BalusC

+0

こんにちはBalusC、私はあなたが私の質問を理解していないと思う。ここでは、値を変更するときは、リストアビューなどから新しいライフサイクルフェーズを開始します。前回のコメントでは、値変更リスナーを[リクエスト値の適用]フェーズで呼び出す必要があると説明しました。そのためにライフサイクルが始まりました。私は正しいですか?この質問はシンプルに見えるかもしれませんが、私は正しいファンダメンタルズを得たいと思っています。 – Krishna