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()
{
}
}
@ 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
アクションを実行できます。
マネージドBeanのプロパティを初期化する必要がありますか? ->次に、@ PostConstructを使用します。それ以外の場合、他のビューから渡されたパラメーターを操作する必要がありますか? ->次に、「preRenderView」を使用します