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

Fed*_*ico 4 websphere jsf jsf-2

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

<hx:scriptCollector id="aScriptCollector"
        preRender="#{aBean.onPageLoadBegin}" postRender="#{aBean.onPageLoadEnd}">
Run Code Online (Sandbox Code Playgroud)

要在JSF 2中重现preRender行为,我使用表单的绑定(此处为s.).我的问题:

1)你知道在JSF 2中模拟postRender的技巧吗?

2)你认为我正在使用preRender"干净"的技巧吗?

非常感谢你的帮助!再见

Bal*_*usC 7

最接近你可以获得完全相同的钩子是

<f:view beforePhase="#{bean.beforePhase}" afterPhase="#{bean.afterPhase}">
Run Code Online (Sandbox Code Playgroud)

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

public void afterPhase(PhaseEvent event) {
    if (event.getPhaseId == PhaseId. RENDER_RESPONSE) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

preRender可以更容易的方式来实现,把你的观点这在任何地方:

<f:event type="preRenderView" listener="#{bean.preRenderView}" />
Run Code Online (Sandbox Code Playgroud)

public void preRenderView(ComponentSystemEvent event) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(参数是可选的,如果从未使用过,可以省略它)


没有这样的东西postRenderView,但你可以轻松创建自定义事件.例如

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

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

}
Run Code Online (Sandbox Code Playgroud)

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());
    }

}
Run Code Online (Sandbox Code Playgroud)

你注册的faces-config.xml是哪个

<lifecycle>
    <phase-listener>com.example.PostRenderViewListener</phase-listener>
</lifecycle>
Run Code Online (Sandbox Code Playgroud)

然后你终于可以使用了

<f:event type="postRenderView" listener="#{bean.postRenderView}" />
Run Code Online (Sandbox Code Playgroud)

public void postRenderView(ComponentSystemEvent event) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)