2011-12-19 4 views
4

NewsBean.javaに裏打ちされたJSFページがあります。これは、<f:event type="preRenderComponent" listener="#{newsBean.init}" />がBean初期化子です。JSF2 preRenderComponentは、f:ajaxが実行されたときに常に呼び出されます。

<f:ajax event="click" execute="@form" render="@form" listener="#{newsBean.sendComment}" />のコメントを送信するためのボタンがページ下部にあり、<h:form>で囲まれています。ボタンをクリックすると、常にNewsBean.init()が呼び出されます。

私のbeanスコープはビューです。これは有効な動作ですか(常にinit()を呼び出しますか?) init()はいつも電話するのを防ぐことができますか?

答えて

9

preRenderリスナーは、初期要求またはポストバック要求であるかどうかにかかわらず、常にプリレンダリングイベントで呼び出されます。すべての単一の要求には、通常の要求かAjax要求かにかかわらず、レンダリング応答フェーズがあります。したがって、この動作は仕様によるものです。ポストバック要求の場合は、リスナーメソッドで自分自身をチェックする必要があります。FacesContext#isPostback()をチェックしてください。

public void sendComment() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     // ... 
    } 
} 

<f:event type="preRenderXxx">XxxView又はComponentできる場合)、ビューパラメータは上の処理された後に本質的に方法によりビーンアクションメソッドを呼び出すことができるという機能要件は、「この問題を回避するアプローチ」であります最初の要求。今後のJSF 2.2では新しい<f:viewAction>タグはintentedとして正確に仕事をするべきかを紹介します:

<f:viewAction action="#{newsBean.sendComment}" /> 

このタグは、すでにデフォルトfalseからonPostback属性をサポートします。

<f:viewAction action="#{newsBean.sendComment}" onPostback="false" /> 

JSF 2.2の意志2012年の第1四半期にリリースされる予定です。現在、JSF 2.2のスナップショットリリースは既に利用可能です。

+0

ありがとうございます。いつものように完璧な答え。 – Mohsen

0

あなたの<f:event>タグは<h:form>タグの中に入れられているようです。したがって、ajaxボタンをクリックすると、<h:form>コンポーネント全体が再描画され、preRenderComponentイベントが再度トリガーされます。

あなたが使うべきものはPreRenderViewEventだと思います。

関連する問題