2012-01-03 138 views
8

我想知道JSF中是否有攔截器(就像我們在Spring中使用的一樣),以及如何實現它?JSF中的攔截器

+1

不可能存在一對一的映射。看看[PhaseListeners](http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html)。 – McDowell 2012-01-03 09:03:57

回答

10

您可以爲此執行PhaseListener。您可以將它們編程爲在specific JSF phase上進行收聽,您可以在覆蓋的getPhaseId()方法中指定。您可以通過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. 
    } 

}