Перехватчик в JSF - PullRequest
       7

Перехватчик в JSF

8 голосов
/ 03 января 2012

Я хочу знать, есть ли в JSF перехватчик (как мы используем в Spring) и как его реализовать?

1 Ответ

10 голосов
/ 03 января 2012

Вы можете реализовать для этого PhaseListener.Вы можете запрограммировать их на прослушивание определенной фазы JSF , которую вы указываете в переопределенном методе getPhaseId().Вы можете перехватывать события до и после фазы методами beforePhase() и afterPhase().

В приведенном ниже примере прослушивается фаза ответа рендеринга:

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

}

Чтобы запустить его, необходимо зарегистрировать его как <phase-listener> в разделе <life-cycle> файла faces-config.xml.Вы можете иметь несколько <phase-listener> с.

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

Вы можете указать PhaseId.ANY_PHASE в getPhaseId(), чтобы позволить фазовому прослушивателю работать на каждой отдельной фазе JSF (обратите внимание, что это не обязательно все из них будут выполняться всегда, это зависит от типа запроса).При необходимости вы можете получить текущий идентификатор фазы в методах до и после фазы с помощью 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());
    }

}

В качестве альтернативы Filter должно работатьодинаково хорошо, если вы хотите более глобальный хук (и, следовательно, вы не совсем заинтересованы в запросах / ответах JSF, и вам ничего не нужно из 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.
    }

}
...