100

f:viewActionページのデータを初期化するためにまたはpreRenderViewイベントを使用して、@PostConstruct注釈を使用する必要があるのはいつですか? バッキング Bean のスコープのタイプに基づいて、どちらか一方を使用する根拠はありますか。たとえば、バッキング@RequestScopedBeanが同じ効果をもたらしますか?f:viewActionpreRenderView@PostConstruct

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()
    {

    }
}
4

2 に答える 2

124

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

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

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

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

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

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

于 2012-03-23T18:27:24.313 に答える
1

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

于 2015-07-31T09:54:15.623 に答える