2012-12-06 60 views
1

方法階段偵聽器和命令按鈕

public void beforePhase(PhaseEvent event) 
public void afterPhase(PhaseEvent event) 

被稱爲與

<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" /> 

當我想實現註銷功能目前相關的方法後,按鈕必須按兩次以離開頁面。

有沒有什麼辦法讓「命令按鈕」的方法被稱爲前「階段聽衆」的方法上面提到的?

回答

1

您需要發送登錄和註銷後重定向,以便讓客戶端觸發新的HTTP請求。

E.g.

public String login() { 
    // ... 
    return "home?faces-redirect=true"; 
} 

public String logout() { 
    // ... 
    return "login?faces-redirect=true"; 
} 

順便說一句,一個PhaseListener不執行基於請求驗證的工具。你應該更喜歡這個工作的servlet Filter。該PhaseListener有它僅在JSF請求和它的調用高達12次在每個請求的基礎上運行的主要缺點。對於這樣的過濾器的一個例子開球,也參見How to provide bean methods without EL expression

0

編輯:我要指出的是,BalusC的答案也許應該是解決這一問題的首選方式。但是如果你仍然想玩相位順序,請繼續閱讀。 /最終編輯

其實可以的PhaseListeners前兩者,如果你實現它來聽每一個階段的動作屬性指定的,你的方法後調用。

public class MyPhaseListener implements PhaseListener { 
    public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; } 

    public void beforePhase(PhaseEvent event) { 
     System.out.println("Before Phase: " + event.getPhaseId()); 
    } 
    public void afterPhase(PhaseEvent event) { 
     System.out.println("After Phase: " + event.getPhaseId()); 
    } 
} 

啓動監聽器faces-config.xml中

<faces-config ... > 
    <lifecycle> 
     <phase-listener>MyPhaseListener</phase-listener> 
    </lifecycle> 
</faces-config> 

這裏是所有監聽invokations的打印輸出和當的ActionListener和行動被調用:

INFO: Before Phase: RESTORE_VIEW 1 
INFO: After Phase: RESTORE_VIEW 1 
INFO: Before Phase: APPLY_REQUEST_VALUES 2 
INFO: After Phase: APPLY_REQUEST_VALUES 2 
INFO: Before Phase: PROCESS_VALIDATIONS 3 
INFO: After Phase: PROCESS_VALIDATIONS 3 
INFO: Before Phase: UPDATE_MODEL_VALUES 4 
INFO: After Phase: UPDATE_MODEL_VALUES 4 
INFO: Before Phase: INVOKE_APPLICATION 5 
INFO: ActionListener Done 
INFO: Action Done 
INFO: After Phase: INVOKE_APPLICATION 5 
INFO: Before Phase: RENDER_RESPONSE 6 
INFO: After Phase: RENDER_RESPONSE 6