標籤:style blog java 2014 cti for
在這個階段JSF實現將處理任何應用界別的事件,例如表單的提交或者連結點擊後跳轉到另一個頁面。
這時如果應用需要重新導向不同 的web應用字眼或者產生一個資源其並不喊任何的JSF組件,那麼就調用FacesContext.responseComplete方法。
如果正在被處理的這個視圖是從重建狀態資訊從先前的一個請求而且如果一個組件引發了一個事件,那麼這些事件將會傳遞到相關的監聽器中。
最終JSF實現者將控制權轉移到下一個步驟render Response phase
這個階段是整個JSF宏觀生命週期中Execute階段的最後一個階段,前面依次經曆了幾個對值進行處理的階段:通過根據不同的請求對view進行處理(Restore View Phase),然後取值(Apply Request Values Phase),驗證值的合法性(ProcessValidations Phase),更新頁面中組件的值(Update Model Values Phase)。最終拿到值之後開始了對事件的處理。
public void execute(FacesContext facesContext) throws FacesException { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Entering InvokeApplicationsPhase"); } UIViewRoot root = facesContext.getViewRoot(); assert (null != root); try { root.processApplication(facesContext); } catch (RuntimeException re) { String exceptionMessage = re.getMessage(); if (null != exceptionMessage) { if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.log(Level.WARNING, exceptionMessage, re); } } throw new FacesException(exceptionMessage, re); } if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Exiting InvokeApplicationsPhase"); } }
如果對processApplication方法感興趣的童鞋可以反編譯看一下源碼。其實在javaee的文檔中對這個方法的描述已經很清楚了。
Broadcastany events that have been queued for the Invoke Application phase of therequest processing lifecycle and to clear out any events for later phases ifthe event processing for this phase caused FacesContext.renderResponse() orFacesContext.responseComplete() to be called.
大致的意思就是為此階段傳遞事件,並且清除引起上面兩個方法被調用的事件。因為這兩個方法被調用標誌著整個請求的結束,但是目前階段還未完全處理完請求。
到此為止整個JSF的生命週期宏觀上的Execute部分(在伺服器上所執行的部分)就已經執行完畢了,接下來就是渲染用戶端的頁面了。