3

ボタン( )をクリックしたり、 .ActionEventAjaxBehaviorEvent

私の Bean は にあり@RequestScoped、JSF 2.1 と Primefaces を使用しています。

ActionEventandは後で呼び出されるため、イベントのために呼び出されたという点でAjaxBehaviorEventBean を伝える方法がわかりません。@PostConstruct

Bean が間違ったスコープに配置されているためですか?

4

2 に答える 2

7

ページ読み込みのGET リクエストでのみコードを実行する

FacesContext#isPostback()を返す場合は、(ポスト)コンストラクターをチェックインするだけfalseです。

@PostConstruct
public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

ちなみに、今後の JSF 2.2<f:viewAction>では、代わりに new を使用できます。

<f:viewAction action="#{bean.init}" onPostback="false" />

Bean が間違ったスコープに配置されているためですか?

具体的な機能要件に依存します。適切な Bean スコープを選択する方法も参照してください。


ViewScoped で重大な問題が発生しました。それは常にシリアライズされたクラスを必要とします;) - さらに、「java.sql」でスライトの問題を引き起こします

これは、ビュー スコープではなく、独自のコード設計に問題があることを示しています。JDBC コードは JSF マネージド Bean に属しません。などのJDBC リソースは、インスタンス変数として決して宣言しないでConnectionください。

于 2013-04-09T12:23:15.763 に答える
1

RequestScoped Bean は、クライアントからサーバーに送信されるリクエストごとに再作成されます。そのため、ボタンをクリックするたびに @PostConstruct のロジックが実行されます。代わりに、ページの読み込みごとに作成される ViewScoped Bean を使用する必要があると思います。

このリンクで BalusC によって書かれたこの主題に関する優れたチュートリアルを見つけることができます: http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes

于 2013-04-09T12:23:56.617 に答える