Voglio sapere se c'è un intercettore in JSF (come usiamo in primavera), e come possiamo implementarlo?Interceptor in JSF
risposta
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.
}
}
È 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