1. ホーム
  2. jsf

[解決済み] f:viewAction / preRenderView と PostConstruct はいつ使うのか?

2022-12-04 06:46:40

質問

どのような場合に f:viewAction または preRenderView イベントを使ってページのデータを初期化するのと @PostConstruct アノテーションを使うのとでは、どちらがいいのでしょうか?どちらかを使用する根拠は、バッキングビーンのスコープのタイプに基づくものでしょうか。 @RequestScoped であれば f:viewAction または preRenderView 以上 @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>

または

ポストコンストラクト

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

    }
}

どのように解決するのですか?

<ブロッククオート

f:viewAction または preRenderView イベントを使用して、@PostConstruct アノテーションを使用してページ詩のデータを初期化するには、どのような場合に使用する必要がありますか。

この場合 <f:viewAction> を使うことで、HTML がレンダリングされる前にメソッドを実行することができます。で設定されたモデルの値に基づいてアクションを実行したい場合に特に便利です。 <f:viewParam> によって設定されたモデル値に基づくアクションを実行したい場合に特に有用です。すなわち、これらのメソッドは、モデル値を更新した瞬間に @PostConstruct が実行されます。JSF 2.0/2.1 では、このタグは存在しなかったので、このタグを使うには preRenderView を使用する必要があります。

バッキングビーンが @RequestScoped である場合、これらは事実上まったく同じことをするのでしょうか。(そして、それは開発者の選択次第なのでしょうか? (@PostConstructは"clean"のようです。).

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

要約すると @PostConstruct によって設定された注入された依存関係や管理されたプロパティに対してアクションを実行したい場合は @EJB , @Inject , @ManagedProperty などをビーンの構築時に使用します。使用方法 <f:viewAction> もし また で設定されたプロパティに対してアクションを実行したい場合 <f:viewParam> . まだJSF 2.0/2.1を使っている場合は preRenderView の代わりに <f:viewAction> . 必要であれば FacesContext#isPostback() を実行するために preRenderView アクションを実行します。

も参照してください。