From PmWiki@caterpillar

JavaServerFaces: PhaseEvents

即時事 件 中我們提到,JSF的請求執行到回應,完整的過程會經過六個階段:
依客戶端傳來的session資料或伺服端上的session資料,回復JSF畫面元件。
JSF畫面元件各自獲得請求中的值屬於自己的值,包括舊的值與新的值。
轉換為物件並進行驗證。
更新Bean或相關的模型值。
執行應用程式相關邏輯。
對先前的請求處理完之後,產生畫面以回應客戶端執行結果。

在每個階段的前後會引發javax.faces.event.PhaseEvent,如果您想嘗試在每個階段的前後捕捉這個事 件,以進行一些處理,則可以實作javax.faces.event.PhaseListener,並向 javax.faces.lifecycle.Lifecycle登記這個Listener,以有適當的時候通知事件的發生。

PhaseListener有三個必須實作的方法getPhaseId()、beforePhase()與afterPhase(),其中 getPhaseId()傳回一個PhaseId物件,代表Listener想要被通知的時機,可以設定的時機有:

其中PhaseId.ANY_PHASE指的是任何的階段轉換時,就進行通知;您可以在beforePhase()與afterPhase()中撰寫階段 前後撰寫分別想要處理的動作,例如下面這個簡單的類別會列出每個階段的名稱:
 
package onlyfun.caterpillar;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class ShowPhaseListener implements PhaseListener {

public void beforePhase(PhaseEvent event) {
String phaseName = event.getPhaseId().toString();
System.out.println("Before " + phaseName);
}

public void afterPhase(PhaseEvent event) {
String phaseName = event.getPhaseId().toString();
System.out.println("After " + phaseName);
}

public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}

撰寫好PhaseListener後,我們可以在faces-config.xml中向Lifecycle進行註冊:
 
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

<faces-config>
<lifecycle>
<phase-listener>
onlyfun.caterpillar.ShowPhaseListener
</phase-listener>
</lifecycle>
......
</faces-config>

您可以使用這個簡單的類別,看看在請求任一個JSF畫面時所顯示的內容,藉此瞭解JSF每個階段的流程變化。

Retrieved from http://caterpillar.onlyfun.net/PmWiki/pmwiki.php/JavaServerFaces/PhaseEvents
頁面最後更新於 2005 年 03 月 20 日,02:36 下午