2012-01-03 30 views
8

Tôi muốn biết nếu có một bộ chặn trong JSF (như chúng ta sử dụng trong Spring), và làm thế nào để chúng ta thực hiện nó?Interceptor trong JSF

+1

Không có khả năng là ánh xạ một đối một. Hãy xem [PhaseListeners] (http://docs.oracle.com/javaee/6/api/javax/faces/event/PhaseListener.html). – McDowell

Trả lời

10

Bạn có thể triển khai PhaseListener cho việc này. Bạn có thể lập trình để nghe trên specific JSF phase mà bạn chỉ định trong phương thức getPhaseId() đã ghi đè. Bạn có thể chặn các sự kiện pha trước và sau bằng các phương thức beforePhase()afterPhase().

Ví dụ dưới đây lắng nghe trên các giai đoạn phản ứng 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. 
    } 

} 

Để làm cho nó chạy, bạn cần đăng ký nó như là một <phase-listener> trong phần <life-cycle> của tập tin faces-config.xml. Bạn có thể có nhiều số <phase-listener> s.

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

Bạn có thể chỉ định PhaseId.ANY_PHASE trong getPhaseId() để cho người nghe giai đoạn chạy trên mọi giai đoạn JSF duy nhất (lưu ý rằng không nhất thiết phải tất cả trong số họ sẽ luôn luôn được thực thi, điều đó phụ thuộc vào loại yêu cầu). Bạn có thể nếu cần thiết nhận được ID giai đoạn hiện tại trong các phương pháp pha trước và sau bởi 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()); 
    } 

} 

Ngoài ra, một Filter nên làm việc tốt như nhau nếu bạn muốn một cái móc toàn cầu hơn (và do đó bạn không phải là chính xác quan tâm đến yêu cầu JSF/câu trả lời và bạn không cần bất cứ điều gì từ 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. 
    } 

} 
Các vấn đề liên quan