2012-01-03 10 views
8

Chcę wiedzieć, czy w JSF znajduje się przechwytywacz (jak używamy na wiosnę) i jak go wdrożyć?Interceptor w JSF

+1

Jest mało prawdopodobne, aby mapowanie jeden do jednego. Spójrz na [PhaseListeners] (http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html). – McDowell

Odpowiedz

10

Możesz zaimplementować PhaseListener. Można zaprogramować je do nasłuchiwania na specific JSF phase, które określa się w nadpisanej metodzie getPhaseId(). Można przechwytywać zdarzenia przed i po fazie, metodami beforePhase() i afterPhase().

Poniższy przykład nasłuchuje na tynku fazie reagowania:

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

} 

Aby go uruchomić, trzeba zarejestrować go jako <phase-listener> w sekcji <life-cycle> pliku faces-config.xml. Możesz mieć wiele s. <phase-listener>.

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

Można określić PhaseId.ANY_PHASE w getPhaseId() aby słuchacz faza uruchomienia na każdym etapie JSF (zauważ, że niekoniecznie wszystko z nich będzie zawsze wykonywana, to zależy od rodzaju żądanie). Możesz w razie potrzeby uzyskać aktualny identyfikator fazy w metodach przed i po fazie przez 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()); 
    } 

} 

Alternatywnie Filter powinny działać równie dobry, jeśli chcesz hak globalnego (a więc nie jesteś dokładnie zainteresowany JSF żądań/odpowiedzi i nie trzeba nic z FacesContext).