JSF 2 相当于 IBM 的 hx:scriptCollector pre- and postRender



我正在将旧的JSF应用程序从WebSphere迁移到JBOSS:旧版本使用JSF的IBM实现。我的问题涉及以下组件:

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

为了重现JSF 2中的Prerender行为,我对形式使用绑定(此处)。我的问题:

1)您知道在JSF 2中模拟Postrender的技巧吗?

2)您认为我正在为Prerender使用的技巧"清洁"?

非常感谢您的帮助!再见

最接近您可以实现的恰好相同的钩子是

<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) {
    // ...
}

最新更新