JSF中的拦截器

9

我想知道JSF中是否有拦截器(类似于Spring中使用的),以及如何实现它?


1
不太可能存在一对一的映射关系。请查看PhaseListeners - McDowell
1个回答

13
您可以使用PhaseListener实现此功能。您可以编程监听您在重写的getPhaseId()方法中指定的特定JSF阶段。您可以通过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>

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

}

或者,如果你想要一个更全局的钩子(因此不完全关注JSF请求/响应并且不需要从FacesContext获取任何内容),Filter 也应该同样好用。

@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.
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接