2012-01-03 17 views
8

Quiero saber si hay un interceptor en JSF (como lo usamos en Spring), y cómo hacerlo lo implementamos?Interceptor en JSF

+1

Es poco probable que exista una asignación de uno a uno. Eche un vistazo a [PhaseListeners] (http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html). – McDowell

Respuesta

10

Puede implementar un PhaseListener para esto. Puede programarlos para que escuchen en un specific JSF phase que especifique en el método getPhaseId() reemplazado. Puede interceptar en los eventos de fase anterior y posterior mediante los métodos beforePhase() y afterPhase().

El ejemplo a continuación escucha en la fase de respuesta render:

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

} 

Para conseguir que se ejecute, es necesario registrarse como un <phase-listener> en la sección <life-cycle> del archivo faces-config.xml. Puede tener múltiples <phase-listener> s.

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

Puede especificar PhaseId.ANY_PHASE en getPhaseId() para que el oyente fase de ejecución en cada fase de JSF sola (tenga en cuenta que no necesariamente todos de ellos siempre se ejecutará, que depende del tipo de solicitud). Si es necesario, puede obtener la ID de fase actual en los métodos de fase antes y después por 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()); 
    } 

} 

Alternativamente, un Filter debería funcionar igual de bueno si quieres un gancho más global (y por lo tanto no está interesado en exactamente las peticiones JSF/respuestas y usted no necesita nada de la 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. 
    } 

}