いつf:viewAction / preRenderViewとPostConstructを使用するのですか?


95

f:viewActionor preRenderViewイベントを使用して、ページのデータを初期化するのではなく、@PostConstruct注釈を使用する必要がありますか?バッキングBeanのスコープのタイプに基づいてどちらかを使用する根拠はあります。たとえば、バッキングBeanが@RequestScopedである場合、ビューをレンダリングする前にバッキングBeanを初期化するために使用するf:viewActionpreRenderViewオーバー@PostConstructするかの選択は、2つとは無関係です。同じ結果になりますか?

f:viewActionまたはpreRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

または

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

回答:


117

@PostConstructアノテーションを使用して、ページバースのデータを初期化するためにf:viewActionまたはpreRenderViewイベントをいつ使用する必要がありますか?

<f:viewAction>HTMLがレンダリングされる前にメソッドを実行する場合に使用します。これは、モデル値の<f:viewParam>更新フェーズで設定されたモデル値に基づいてアクションを実行する場合に特に便利です。つまり、現時点では使用できません@PostConstruct。JSF 2.0 / 2.1では、このタグは存在しなかったため、preRenderView回避策を使用する必要があります。

バッキングBeanが@RequestScopedの場合、それらは事実上まったく同じことを行いますか?(そして、それは開発者の選択次第ですか?(@PostConstructは「よりクリーン」に思えます)。

いいえ、彼らは確かに同じことを効果的に行いません。@PostConstructアクションを実行するためにintentedされ、直接 Beanの建設後、すべての注入された依存関係の設定やなどの管理プロパティ@EJB@Inject@ManagedProperty、などはすなわち、注入された依存関係は、内部のBeanのコンストラクタは使用できません。したがって、これは、Beanがビュー、セッション、またはアプリケーションスコープの場合、ビュー、セッション、またはアプリケーションごとに1回だけ実行されます。<f:viewAction>唯一の最初のGET要求に呼び出され、デフォルトではあるが、経由することができonPostback="true"、属性だけでなく、ポストバック要求に呼び出されるように構成すること。preRenderViewイベントは、すべてのHTTP要求に呼び出された(はい、これはまた、AJAXリクエストが含まれています!)。

使用、要約@PostConstructあなたが注入された依存関係とによって設定された管理プロパティにアクションを実行したい場合は@EJB@Inject@ManagedPropertyBeanの建設中に、など。によって設定されたプロパティに対してアクション実行する<f:viewAction>場合に使用します。それでもJSF 2.0 / 2.1を使用している場合は、の代わりにを使用してください。必要に応じて、最初のリクエストに対してのみアクションを実行するためのチェックを追加できます。<f:viewParam>preRenderView<f:viewAction>FacesContext#isPostback()preRenderView

以下も参照してください。


ありがとう。申し訳ありませんが、回答を書いている間に元の質問を編集しました...
BestPractices

@PostConstructは、BeanがSessionScopedの場合(Beanが最初に作成されたときに)一度だけ呼び出されるが、ページにアクセスするたびにpreRenderViewが呼び出されるため、Beanスコープについて言及しました。それとも私はそれを間違ったのですか?
BestPractices

それは正解です。レンダリング前ビューイベントは、アクションの起動フェーズで呼び出されます。postコンストラクトは、Beanの作成後に呼び出されます。セッションスコープBeanは、すべてのHTTPリクエストで作成されるわけではありません。
BalusC 2012年

私のメソッドがajaxリクエスト中に呼び出されているのではないかと思っていました。isPostBack()呼び出しがその日を節約しました!!
jacosta 2013年

1

管理対象Beanのプロパティを初期化する必要がありますか?->次に、@ PostConstructを使用 します。それ以外の場合、他のビューから渡されたパラメータを使用する必要がありますか?->次に、「preRenderView」を使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.