程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 淺談JSF的生命周期和對ajax處理的影響

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

編輯:J2EE

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)進行處理。以上是JSF的生命周期和對AJax處理的影響

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved