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 回答