2012-01-03 2 views
8

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

+1

Существует маловероятное сопоставление один-к-одному. Посмотрите на [PhaseListeners] (http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html). – McDowell

ответ

10

Для этого можно использовать PhaseListener. Вы можете запрограммировать их для прослушивания на specific JSF phase, который вы укажете в переопределенном методе 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> s.

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

} 
Смежные вопросы