5

<f:event type="preRenderComponent" listener="#{newsBean.init}" />Bean 初期化子として持つ NewsBean.java に裏打ちされた JSF ページがあります。

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

私のBeanスコープはビューです。これは有効な動作ですか (常に init() を呼び出します)? 常に呼び出すのを防ぐにはどうすればよいinit()ですか?

4

2 に答える 2

11

preRenderリスナーは、最初のリクエストかポストバック リクエストかに関係なく、レンダリング前のイベントで常に呼び出されます。通常のリクエストか ajax リクエストかに関係なく、すべてのリクエストにはレンダリング レスポンス フェーズがあります。したがって、この動作は仕様によるものです。ポストバック リクエストかどうかをチェックして、リスナー メソッドで自分自身をチェックする必要がありますFacesContext#isPostback()

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

ちなみに( <f:event type="preRenderXxx">where Xxxcan beViewまたはComponent) は、本質的に、最初のリクエストでビューパラメーターが処理された後に Bean アクションメソッドを呼び出すことができるという機能要件の「回避策」です。今後の JSF 2.2 では、<f:viewAction>意図したとおりに機能する新しいタグが導入されます。

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

このタグは、onPostbackすでにデフォルトで に設定されている属性をサポートしていますfalse:

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

JSF 2.2 は 2012 年の第 1 クォートにリリースされる予定です。JSF 2.2 のスナップショット リリースは現在すでに利用可能です。

于 2011-12-19T12:05:49.727 に答える
0

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

PreRenderViewEventを使用する必要があると思います。

于 2011-12-19T09:19:46.250 に答える