Chcę wiedzieć, czy w JSF znajduje się przechwytywacz (jak używamy na wiosnę) i jak go wdrożyć?Interceptor w JSF
Odpowiedz
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
).
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