4

古いJSFアプリケーションをWebSphereからJBossに移行しています。古いバージョンはJSFのIBM実装を使用しています。私の質問は次のコンポーネントに関するものです。

<hx:scriptCollector id="aScriptCollector"
        preRender="#{aBean.onPageLoadBegin}" postRender="#{aBean.onPageLoadEnd}">

JSF 2でpreRenderの動作を再現するために、フォームのバインディングを使用します(s。here 。私の質問:

1)JSF 2でpostRenderをシミュレートするための秘訣を知っていますか?

2)preRenderの「クリーン」に使用しているトリックだと思いますか?

あなたの助けをどうもありがとう!さよなら

4

1 に答える 1

7

まったく同じフックを達成するために得ることができる最も近いものは

<f:view beforePhase="#{bean.beforePhase}" afterPhase="#{bean.afterPhase}">

public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId == PhaseId. RENDER_RESPONSE) {
        // ...
    }
}

public void afterPhase(PhaseEvent event) {
    if (event.getPhaseId == PhaseId. RENDER_RESPONSE) {
        // ...
    }
}

これpreRenderは簡単な方法で実現できます。これをビューのどこにでも配置できます。

<f:event type="preRenderView" listener="#{bean.preRenderView}" />

public void preRenderView(ComponentSystemEvent event) {
    // ...
}

(引数はオプションです。使用しない場合は省略できます)


のようなものはありませんpostRenderViewが、カスタムイベントを簡単に作成できます。例えば

@NamedEvent(shortName="postRenderView")
public class PostRenderViewEvent extends ComponentSystemEvent {

    public PostRenderViewEvent(UIComponent component) {
        super(component);
    }

}

public class PostRenderViewListener implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // NOOP.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.getApplication().publishEvent(context, PostRenderViewEvent.class, context.getViewRoot());
    }

}

faces-config.xmlとして登録する

<lifecycle>
    <phase-listener>com.example.PostRenderViewListener</phase-listener>
</lifecycle>

その後、最終的に使用することができます

<f:event type="postRenderView" listener="#{bean.postRenderView}" />

public void postRenderView(ComponentSystemEvent event) {
    // ...
}
于 2012-10-29T11:33:12.150 に答える