【问题标题】:Interceptor in JSFJSF 中的拦截器
【发布时间】:2012-01-03 07:24:31
【问题描述】:

我想知道JSF中是否有拦截器(就像我们在Spring中使用的那样),我们如何实现它?

【问题讨论】:

标签: jsf jsf-2 interceptor


【解决方案1】:

您可以为此实现PhaseListener。您可以对它们进行编程以侦听您在覆盖的getPhaseId() 方法中指定的specific JSF phase。您可以通过beforePhase()afterPhase() 方法拦截前后阶段事件。

下面的例子监听渲染响应阶段:

public class RequestInterceptor implements PhaseListener {

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

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

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

}

要使其运行,您需要在faces-config.xml 文件的<life-cycle> 部分中将其注册为<phase-listener>。你可以有多个<phase-listener>s。

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

您可以在getPhaseId() 中指定PhaseId.ANY_PHASE 以让阶段侦听器在每个单独的JSF 阶段上运行(注意,不一定所有 都将始终执行,这取决于请求类型)。如有必要,您可以通过PhaseEvent#getPhaseId() 在前阶段和后阶段方法中获取当前阶段 ID。

public class PhaseDebugger implements PhaseListener {

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

    @Override
    public void beforePhase(PhaseEvent event) {
        System.out.println("Before phase " + event.getPhaseId());
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        System.out.println("After phase " + event.getPhaseId());
    }

}

或者,如果您想要一个更全局的钩子,Filter 应该同样有效(因此您对 JSF 请求/响应并不完全感兴趣,并且您不需要来自 FacesContext 的任何内容)。

@WebFilter("/*")
public class RequestInterceptor implements Filter {

    @Override
    public void init(FilterConfig config) {
        // Initialize global variables if necessary.
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        // Do your job here which should run before the request processing.
        chain.doFilter(request, response);
        // Do your job here which should run after the request processing.
    }

    @Override
    public void destroy() {
        // Cleanup global variables if necessary.
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2015-10-28
    • 2015-11-22
    • 2014-03-10
    • 2018-05-31
    • 2013-06-25
    相关资源
    最近更新 更多