標籤:amp 綁定 context apply ace 而且 err ext its
當一個組件樹在一個postbacks請求中被恢複之後其中每一個組件從request的參數中取得各自的值,這裡使用的是processDecodes方法。
這個值會儲存在本地的每一個組件中,在原始碼中此過程的代碼較為簡單,由於實現者將取值這個操作所有封裝在processDecodes方法中。只是說實話JSF的這部分的實現非常失敗。由於在UIViewRoot中有將近兩千行代碼,這,這。這……
(UIViewRoot.java中的processDecodes方法)
public void processDecodes(FacesContext context) { initState(); notifyBefore(context, PhaseId.APPLY_REQUEST_VALUES); try { if (!skipPhase) { if (context.getPartialViewContext().isPartialRequest() && !context.getPartialViewContext().isExecuteAll()) { context.getPartialViewContext().processPartial(PhaseId.APPLY_REQUEST_VALUES); } else { super.processDecodes(context); } broadcastEvents(context, PhaseId.APPLY_REQUEST_VALUES); } } finally { clearFacesEvents(context); notifyAfter(context, PhaseId.APPLY_REQUEST_VALUES); } }
假設不論什麼一個解碼方法或者監聽器的事件調用當前FacesContext執行個體中的renderResponse方法。JSF的實現者會跳過 Render Response步驟。事實上這非常好理解在處理組件所須要的值的時候假設遇到錯誤就會直接渲染頁面向使用者進行提示。可是筆者在JSF原始碼中還未找到這部分的實現(衰~)
假設不論什麼的事件在此步驟中加進隊列JSF會將這個事件傳遞給相關的監聽器。
假設頁面上的一些組件中的immediate屬性設定為true那麼驗證,轉化以及事件綁定將都會在這個步驟中進行,假設不論什麼轉換失敗這個組件會產生一個錯誤的提示資訊。並將這個資訊放到FacesContext的顯示隊列中。這個資訊將會在Render Response步驟中顯示出來,同理在驗證步驟中的驗證錯誤資訊也會如此顯示出來。
這時假設程式須要重新導向到不同的應用資源或者要產生一個響應,而且這個響應沒有包括不論什麼JSF組件。那麼就直接調用FacesContext.responseComplete方法。
在這個步驟的最後組件將會被賦予新的值,而且訊息以及時間將會被放到隊列其中等待處理。
假設當前請求被定義為一個局部的請求。那麼局部內容會被從FacesContext中恢複。而且局部處理方法會被運行。
上面的每一個段話都是說的在此階段要處理得各種不同的情況,或者說都是在processDecodes方法中應該考慮到的各個情況,Apply Request Values Phase一言以蔽之:拿值。
JSF教程(8)——生命週期之Apply Request Values Phase