淺談JSF的生命週期和對ajax處理的影響


<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
JSF一個最重要的特點就是組件化(It is all about components),組件化的特點決定了其可擴展性強和協議無關性。對一個JSF組件來說,爲其定義特定的Render,該該組件將在WML或telnet中可用。

解讀JSF的生命週期:
我覺得研究B/S系統最好的方法就是從web.xml開始,相比於傳統的JSP系統,JSF需要定義一個Servlet用來對HttpServletRequest進行處理,該servlet爲javax.faces.webapp.FacesServlet。在該servlet初始化階段,它將生成兩個對象:FacesContextFactory和Lifecycle。而在處理請求的service階段,則會利用FacesContextFactory對象獲得當前的FacesContext,lifecycle對象將會對該context對象進行處理。簡單的來說,FacesServlet產生一個FacesContext對象,(在JSF的處理過程中,FacesContext是唯一被修改的對象),然後將控制權交給了lifecycle對象,Lifecycle對象將會在六個生命週期中對FacesContext對象進行處理。有一點需要注意的:FacesContext是ThreadLocal的。
JSF包含六個生命週期:
  1. Restore view
  2. Apply request values; process events
  3. Process validations; process events
  4. Update model values; process events
  5. Invoke application; process events
  6. Render response

其中的1-5個階段將會執行lifecycle的execute()方法,而第六個階段將會執行lifecycle的render()方法。

接下來說說如何將AJAX的應用體現在JSF組件上:

1. AJAX完全獨立於JSF。即爲AJAX請求創建一個額外的Servlet/Filter 控制器,這也是最自然而然的想法。通過傳統的ajax請求方式完成該jsf組件的ajax體現,該ajax請求通過jsf組件中寫入的js觸發。優點是自然,不需要接觸JSF層面的東西,比較獨立;缺點是重用性差,且頁面開發者必須自己寫js代碼。

2. AJAX嵌入JSF組件中,即需要自定義組件。該方法與方法1很相似,不同的是組件開發者將會封裝js代碼和js請求獲得的呈現代碼。即ajax應用已經包裝在此組件中了,頁面開發者不需要關心該ajax應用是如何完成的,只需要簡單調用該組件就可以了。在Lifecycle的Apply Request Values階段,當ajax請求處理完後,該組件的Renderer將會調用FacesContext的responseComplete()方法退出lifecycle。

3. 使用PhaseListener判斷是否爲ajax請求,如是,立即執行responseComplete()方法,禁止進入JSF生命週期以後的Phase。看下PhaseListener接口的代碼,相信用過Spring的都覺得似曾相識,沒錯,它提供了2個方法beforePhase()和afterPhase()用來對生命週期中的每一個phase進行pre-action和post-action處理。比較類似Spring中的advice。一般選擇在PhaseListner的afterPhase()方法中進行ajax處理,處理的過程其實也很簡單,當請求到達服務器端,PhaseListener進行處理,當Restore View階段完成後如果是ajax請求則進入afterPhase()方法中,進行ajax處理然後調用FacesContext的responseComplet()方法完成lifecycle的處理。這也是目前用的最多的一種處理方法。

4. 定義獨立的Lifecycle,該Lifecycle只包含三個Phase,即:Apply Request Values; Invoke Application;RenderResponse。在進入lifecycle之前就判斷到底進入何種lifecycle,如果是ajax請求則進入剛定義的包含三個階段的生命週期,否則則進入常規的六階段生命週期。其做法就是定義一個類似FacesServlet的選擇Lifecycle的servlet,對指定的ajax請求(通過url mapping)進行處理。該方法在Pro JSF and AJAX: Building Rich Internet Components一書中有詳細的介紹。本文這次就不詳細介紹了。

 
 
發佈了245 篇原創文章 · 獲贊 1 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章