閑人野居
          好好學(xué)習(xí),天天向上
          posts - 57,  comments - 137,  trackbacks - 0
              這是jsf 的分析系列第三篇,隨著不斷的深入,jsf的設(shè)計(jì)變得越來(lái)越清晰。當(dāng)然,在目前的規(guī)范中,jsf還是很不完善的,這也就導(dǎo)致了為什么jsf還是不能成為目前的主流框架。先不去談?wù)撨@些弊端,還是先看看一下jsf具體是如何運(yùn)作的。
              對(duì)于jsf規(guī)范,個(gè)人覺(jué)得和其他框架相比,最大的區(qū)別,可能在于jsf劃分了web 請(qǐng)求的生命周期。like ejb一樣,web 請(qǐng)求也是有生命周期的。雖然,在其他的框架中,也可以看到相關(guān)的生命周期,但還是沒(méi)有jsf劃分的清晰。也許,這也是jsf的一大特色。
              對(duì)于生命周期的執(zhí)行,所有的操作都?xì)w結(jié)到Lifecycle這個(gè)接口。接口包括了兩個(gè)主要的方法:
              public abstract void execute(FacesContext context) throws FacesException;和
              public abstract void render(FacesContext context) throws FacesException;
             前者是用來(lái)執(zhí)行各個(gè)生命周期的階段,也就是除了render之外的其他五個(gè)階段,而且是按照相應(yīng)的順序執(zhí)行。而render,是執(zhí)行最后一個(gè)階段,展示頁(yè)面。可能有人不太理解,為什么不把兩個(gè)方法合并成一個(gè)方法,剛開(kāi)始,我也是這么認(rèn)為。既然已經(jīng)定義了相應(yīng)的Phase,何必要把最后的render過(guò)程分離出來(lái)。看了sun 的RI實(shí)現(xiàn)類(lèi),發(fā)現(xiàn)在render之前需要進(jìn)行context.getResponseComplete()判斷,可能規(guī)范中,認(rèn)為render是必須要執(zhí)行的階段,其他的階段可以跳過(guò),所以分離了相應(yīng)的方法,同時(shí)在執(zhí)行前,為了避免重復(fù)輸出,需要對(duì)render過(guò)程進(jìn)行特殊的處理.
             規(guī)范中定義了6個(gè)階段,從下面的流程圖中可以看到。

          簡(jiǎn)單介紹一下每個(gè)階段的工作:

          RESTORE_VIEW:查找原有的view ,恢復(fù)原有的狀態(tài),如果沒(méi)有,則調(diào)用ViewHandler.createView,如果為post操作,則按照順序執(zhí)行各個(gè)階段。
          否則執(zhí)行RENDER_RESPONSE階段。
          APPLY_REQUEST_VALUES:讀取客戶(hù)端參數(shù),處理各個(gè)組件的processDecodes方法,內(nèi)部調(diào)用decode方法,由Renderer執(zhí)行decode方法
          PROCESS_VALIDATIONS:執(zhí)行組件的processValidators方法,對(duì)于UIInput執(zhí)行validate方法,用于綁定值,調(diào)用convert,和validate
          UPDATE_MODEL_VALUES:執(zhí)行組件的processUpdates方法,對(duì)于UIViewRoot,執(zhí)行broadcastEvents和notifyPhaseListeners
          所有的UIInput,執(zhí)行updateModel方法。
          INVOKE_APPLICATION:調(diào)用UIViewRoot.processApplication方法。這一過(guò)程主要讀取相應(yīng)的action配置,如果存在action,則調(diào)用action,也就是調(diào)用應(yīng)用邏輯。在執(zhí)行完相應(yīng)的邏輯后,查詢(xún)action是否返回值,如果有,由navigationHandler去讀取下一個(gè)view id。
          RENDER_RESPONSE:展示view,調(diào)用ViewHandler.renderView,展示view。

          每個(gè)階段定義定義的都比較清晰,有一點(diǎn)需要注意的是,在處理請(qǐng)求時(shí),并不一定會(huì)執(zhí)行每個(gè)階段,可能其中會(huì)直接跳到最后的render response階段。舉例來(lái)說(shuō),如果validator時(shí),存在錯(cuò)誤信息,那么就會(huì)直接到render response階段,而下一個(gè)階段不會(huì)執(zhí)行。


          posted on 2007-05-04 15:44 布衣郎 閱讀(3527) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): web view技術(shù)

          FeedBack:
          # re: 關(guān)于jsf 生命周期
          2007-05-04 16:42 | BeanSoft
          不錯(cuò), 期待進(jìn)一步的文章... 面向標(biāo)準(zhǔn)編程, 這樣寫(xiě)的代碼可以不用老考慮框架的升級(jí)問(wèn)題, 像用開(kāi)源框架的感覺(jué)和用 JSP, Servlet 這樣的標(biāo)準(zhǔn) API 總是覺(jué)得開(kāi)源框架有點(diǎn)懸. 期待 JSF 獲得廣泛的支持.  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于jsf 生命周期
          2007-05-08 12:16 | Tendy
          調(diào)試 JSF 的程序讓人無(wú)比痛苦
          等 2.0 以后再看看吧 ...  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于jsf 生命周期[未登錄](méi)
          2008-10-10 10:10 | aa
          初學(xué)者看這文檔是看不懂的,我是初學(xué)者  回復(fù)  更多評(píng)論
            

          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(12)

          隨筆分類(lèi)(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357739
          • 排名 - 155

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 鄂尔多斯市| 瓮安县| 兰考县| 韶山市| 壶关县| 中宁县| 扬中市| 凉山| 曲阜市| 元江| 海城市| 台北市| 兴和县| 万载县| 旅游| 浦东新区| 石柱| 吉安市| 叙永县| 普定县| 寿宁县| 修文县| 神农架林区| 新竹县| 泸定县| 大城县| 临泉县| 夹江县| 鹿邑县| 张家港市| 阳原县| 北流市| 汾西县| 万宁市| 资源县| 绩溪县| 宝兴县| 文安县| 大足县| 广宁县| 乐亭县|