如何实现在生命周期结束时运行的 PhaseListener?

发布于 2024-12-19 12:40:13 字数 55 浏览 6 评论 0 原文

如何实现在 JSF 生命周期结束时运行的 PhaseListener

How can I implement a PhaseListener which runs at end of the JSF lifecycle?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一梦浮鱼 2024-12-26 12:40:13

您需要实现 PhaseListener 接口并挂钩 <代码> href="http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseId.html#RENDER_RESPONSE" rel="noreferrer">PhaseId_RENDER_RESPONSE。渲染响应是 JSF 生命周期的最后一个阶段。

public class MyPhaseListener implements PhaseListener {

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

    @Override
    public void beforePhase(PhaseEvent event) {
        // Do your job here which should run right before the RENDER_RESPONSE.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        // Do your job here which should run right after the RENDER_RESPONSE.
    }

}

要使其运行,请在faces-config.xml中按如下方式注册:

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

更新上述阶段侦听器确实是应用程序范围内的。要为特定视图设置阶段侦听器,请使用 beforePhase 和/或 afterPhase 属性/6/javaserverfaces/2.1/docs/vdldocs/facelets/f/view.html" rel="noreferrer">

例如,

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

更多

public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        // Do here your job which should run right before the RENDER_RESPONSE.
    }
}

的 JSF 2.0 方式是使用

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

public void preRenderView() {
    // Do here your job which should run right before the RENDER_RESPONSE.
}

You need to implement the PhaseListener interface and hook on beforePhase() of the PhaseId_RENDER_RESPONSE. The render response is the last phase of the JSF lifecycle.

public class MyPhaseListener implements PhaseListener {

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

    @Override
    public void beforePhase(PhaseEvent event) {
        // Do your job here which should run right before the RENDER_RESPONSE.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        // Do your job here which should run right after the RENDER_RESPONSE.
    }

}

To get it to run, register it as follows in faces-config.xml:

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

Update the above phase listener is indeed applicaiton-wide. To have a phase listener for a specific view, use the beforePhase and/or afterPhase attributes of the <f:view>.

E.g.

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

with

public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        // Do here your job which should run right before the RENDER_RESPONSE.
    }
}

A more JSF 2.0 way is by the way using the <f:event type="preRenderView">:

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

with

public void preRenderView() {
    // Do here your job which should run right before the RENDER_RESPONSE.
}
清泪尽 2024-12-26 12:40:13

在 jsf 2 中,您可以使用 为某些 facelet 挂钩 MyPhaseListener MyPhaseListener 应该实现 PhaseListener 并覆盖

  • afterPhase - 代码在阶段结束后运行
  • beforePhase - 代码在阶段启动之前运行
  • getPhaseId - PhaseId 枚举,指定要调用侦听器的阶段名称
    PhaseId.RENDER_RESPONSE 作为生命周期的最后阶段)

In jsf 2 you can use <f:phaseListener type="my.MyPhaseListener"> to hook MyPhaseListener for some facelet. MyPhaseListener should implement PhaseListener and override

  • afterPhase - with code to be run after end of phase
  • beforePhase - with code to be run before phase started
  • getPhaseId - PhaseId enum specifying name of phase for which the listener to be invoked
    (PhaseId.RENDER_RESPONSE as last phase of lifecycle)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文