2012-01-03 26 views
8

JSFにインターセプタがあるかどうかを知りたいのですが(Springで使用するように)、実装する方法は?JSFのインターセプタ

+1

1対1マッピングはありそうにありません。 [PhaseListeners](http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html)を参照してください。 – McDowell

答えて

10

これには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>を持つことができます。

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

あなたはフェーズリスナーは、(リクエストの種類に依存し、それらの必要はないすべてが常に実行されることに注意してください、)すべての単一のJSF相上で実行できるようにgetPhaseId()PhaseId.ANY_PHASEを指定することができます。必要に応じて、前後のフェーズIDで現在のフェーズIDをPhaseEvent#getPhaseId()で取得できます。

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

} 
関連する問題