web-dev-qa-db-ja.com

f:viewAction / preRenderViewとPostConstructを使用する場合

f:viewActionまたはpreRenderViewイベントを使用してページのデータを初期化する場合と@PostConstruct注釈を使用する場合バッキングBeanのスコープのタイプに基づいて、どちらを使用するのか。バッキングBeanが@RequestScopedの場合、f:viewActionまたはpreRenderView over @PostConstructを使用して、ビューをレンダリングする前にバッキングBeanを初期化するという選択は、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()
    {

    }
}
88
BestPractices

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

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

バッキングBeanが@RequestScopedの場合、まったく同じことを効果的に行いますか? (それでは開発者の選択次第ですか?(@PostConstructは「よりクリーンな」ようです)。

いいえ、彼らは間違いなく同じことをしません。 _@PostConstruct_はアクションを実行することを意図しています直接 Beanの構築と、挿入されたすべての依存関係と_@EJB_、_@Inject_、_@ManagedProperty_などの管理プロパティの設定後など。つまり、注入された依存関係は、Beanのコンストラクター内では使用できません。したがって、これは、Beanがビュー、セッション、またはアプリケーションスコープの場合、ビュー、セッション、またはアプリケーションごとに1回だけ実行されます。 _<f:viewAction>_はデフォルトでは最初のGETリクエストでのみ呼び出されますが、_onPostback="true"_属性を介してポストバックリクエストでも呼び出されるように設定できます。 preRenderViewイベントは、すべてのHTTPリクエストで呼び出されます(はい、これにはajaxリクエストも含まれます!)。

要約すると、Beanの構築中に_@PostConstruct_、_@EJB_、_@Inject_などによって設定された挿入された依存関係と管理プロパティに対してアクションを実行する場合は、_@ManagedProperty_を使用します。 also _<f:viewAction>_で設定されたプロパティに対してアクションを実行する場合は、_<f:viewParam>_を使用します。まだJSF 2.0/2.1を使用している場合は、_<f:viewAction>_の代わりにpreRenderViewを使用します。必要に応じて、FacesContext#isPostback()にチェックを追加して、最初のリクエストでのみpreRenderViewアクションを実行できます。

こちらもご覧ください:

113
BalusC

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

1
Val Martinez