2012-01-03 11 views
8

Voglio sapere se c'è un intercettore in JSF (come usiamo in primavera), e come possiamo implementarlo?Interceptor in JSF

+1

È improbabile che sia una mappatura uno-a-uno. Dai un'occhiata a [PhaseListeners] (http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html). – McDowell

risposta

10

Per questo è possibile implementare un PhaseListener. È possibile programmarli per l'ascolto su un specific JSF phase specificato nel metodo getPhaseId() sottoposto a override. È possibile intercettare gli eventi della fase prima e dopo tramite i metodi beforePhase() e afterPhase().

L'esempio che segue in ascolto sulla fase di render response:

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

} 

Per farlo funzionare, è necessario registrarsi come <phase-listener> nella sezione <life-cycle> del file faces-config.xml. Puoi avere più <phase-listener> s.

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

È possibile specificare PhaseId.ANY_PHASE in getPhaseId() per lasciare l'ascoltatore fase eseguito su ogni singola fase JSF (si noti che non necessariamente tutte di loro sarà sempre essere eseguito, che dipende dal tipo di richiesta). Se necessario, è possibile ottenere l'ID fase corrente nei metodi della fase prima e dopo di 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()); 
    } 

} 

In alternativa, un Filter dovrebbe funzionare altrettanto buono se si vuole un gancio più globale (e quindi non siete esattamente interessati a richieste JSF/risposte e non avete bisogno di qualcosa dal 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. 
    } 

}