【发布时间】:2012-01-03 07:24:31
【问题描述】:
我想知道JSF中是否有拦截器(就像我们在Spring中使用的那样),我们如何实现它?
【问题讨论】:
-
不太可能存在一对一的映射。看看PhaseListeners。
标签: jsf jsf-2 interceptor
我想知道JSF中是否有拦截器(就像我们在Spring中使用的那样),我们如何实现它?
【问题讨论】:
标签: jsf jsf-2 interceptor
您可以为此实现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.
}
}
【讨论】: