JSF2相当于IBM';s hx:scriptCollector预渲染和后渲染

JSF2相当于IBM';s hx:scriptCollector预渲染和后渲染,jsf,jsf-2,websphere,Jsf,Jsf 2,Websphere,我正在将一个旧的JSF应用程序从WebSphere迁移到JBoss:旧版本使用JSF的IBM实现。我的问题涉及以下部分: <hx:scriptCollector id="aScriptCollector" preRender="#{aBean.onPageLoadBegin}" postRender="#{aBean.onPageLoadEnd}"> 为了在JSF2中重现预呈现行为,我使用表单的绑定。我的问题是: 1) 你知道在JSF2中模拟postRender

我正在将一个旧的JSF应用程序从WebSphere迁移到JBoss:旧版本使用JSF的IBM实现。我的问题涉及以下部分:

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

为了在JSF2中重现预呈现行为,我使用表单的绑定。我的问题是:

1) 你知道在JSF2中模拟postRender的技巧吗

2) 你认为这是我用于预渲染“干净”的技巧吗

非常感谢你的帮助!
再见

你能达到的最接近的目标完全一样

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

preRender
可以以更简单的方式实现,请将其放在视图中的任意位置:

<f:event type="preRenderView" listener="#{bean.preRenderView}" />
(该参数是可选的,如果从未使用过,可以省略)


没有
postRenderView
,但是您可以轻松创建自定义事件。例如

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

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

}

faces config.xml
中注册为

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

嗨,巴卢斯克!非常感谢您的回答,一如往常,很有启发性!:)不幸的是,调用postRenderView()方法时遇到问题。我完全按照你写的那样做了,但没有被调用。如果我在f:event代码中将type=“postRenderView”替换为“preRenderView”,则会调用该方法(当然,就好像它是一个preRenderView)。。PostRenderViewListener的afterPhase()也会被调用。我错过什么了吗?再次感谢!
是否包含在
中?这样,它将被附加到
UIViewRoot
(在
publishEvent()调用中传递)。否则,您需要遍历整个组件树,并为视图树中的所有单个组件发布该组件,这相对比较昂贵。
preRenderView
作为标准事件类型已经被
UIComponent
特殊处理,因此它不是必须被放置在
中才能直接附加到
UIViewRoot
。不,它没有包含在f:元数据中(至少是明确的?):无论如何,我刚刚将构造函数更改为publicPostRenderViewEvent(UIViewRootComponent){super(component);},现在可以工作了。这样对吗?哦!那也可以:)好的发现。
@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());
    }

}
<lifecycle>
    <phase-listener>com.example.PostRenderViewListener</phase-listener>
</lifecycle>
<f:event type="postRenderView" listener="#{bean.postRenderView}" />
public void postRenderView(ComponentSystemEvent event) {
    // ...
}