在描述EOS的技術(shù)路線(xiàn)和產(chǎn)品內(nèi)容時(shí),都會(huì)重點(diǎn)提到
數(shù)據(jù)總線(xiàn)的概念。的確,如果在開(kāi)發(fā)中真正理解了基于數(shù)據(jù)
總線(xiàn)的數(shù)據(jù)傳遞機(jī)制,開(kāi)發(fā)起來(lái)將會(huì)得心應(yīng)手游刃有余。這個(gè)神秘的數(shù)據(jù)總線(xiàn)在EOS中到底是什么東西呢?為什么要在EOS中引入這樣一個(gè)東西呢?
總所周知,標(biāo)準(zhǔn)的J2EE應(yīng)用中數(shù)據(jù)傳遞是基于對(duì)象傳遞的,一個(gè)實(shí)例化后的對(duì)象既包括數(shù)據(jù),同時(shí)也包括一些操作,執(zhí)行過(guò)程是通過(guò)調(diào)用對(duì)象的方法,同時(shí)將包含數(shù)據(jù)的對(duì)象作為調(diào)用方法的參數(shù)傳遞進(jìn)去進(jìn)行相應(yīng)的操作。在EOS應(yīng)用中,結(jié)合J2EE WEB應(yīng)用的特點(diǎn),將運(yùn)行時(shí)的數(shù)據(jù)根據(jù)不同層次和作用范圍以XML格式被獨(dú)立封裝到3個(gè)不同的內(nèi)存數(shù)據(jù)區(qū)中。分別為會(huì)話(huà)數(shù)據(jù)區(qū)(SessionContext)、請(qǐng)求數(shù)據(jù)區(qū)(RequestContext)和業(yè)務(wù)處理數(shù)據(jù)區(qū)(BizContext),這幾個(gè)數(shù)據(jù)區(qū)就構(gòu)成了EOS的數(shù)據(jù)總線(xiàn)。
RequestContext數(shù)據(jù)區(qū)是根據(jù)HTTP Request對(duì)象建立的,封裝了HTML頁(yè)面上通過(guò)post或者get方式提交的表單數(shù)據(jù)以及一些系統(tǒng)信息(如客戶(hù)端IP、請(qǐng)求的URI等),這個(gè)數(shù)據(jù)區(qū)能夠被表單中的Action對(duì)應(yīng)的展現(xiàn)邏輯直接進(jìn)行讀取,也能通過(guò)EOS提供的JSP頁(yè)面TAG讀取數(shù)據(jù)顯示在頁(yè)面上,系統(tǒng)為每一次客戶(hù)端請(qǐng)求建立一個(gè)專(zhuān)有的RequestContext數(shù)據(jù)區(qū),當(dāng)系統(tǒng)完成響應(yīng)(Respone)后該數(shù)據(jù)區(qū)失效。
SessionContext數(shù)據(jù)區(qū)是根據(jù)HTTP Session對(duì)象建立的,封裝了WEB容器中的用戶(hù)的會(huì)話(huà)信息,這些Session信息是通過(guò)展現(xiàn)邏輯的數(shù)據(jù)設(shè)置接口寫(xiě)入的,也可以通過(guò)數(shù)據(jù)設(shè)置接口獲得SessionContext的數(shù)據(jù)后寫(xiě)入到RequestContext數(shù)據(jù)區(qū)中。JSP頁(yè)面通過(guò)TAG可以直接獲取SessionContext的數(shù)據(jù)。SessionContext的數(shù)據(jù)區(qū)在一個(gè)WEB會(huì)話(huà)建立時(shí)創(chuàng)建,在會(huì)話(huà)保持期間可以存取其中的內(nèi)容(一般通過(guò)展現(xiàn)邏輯實(shí)現(xiàn)),當(dāng)會(huì)話(huà)結(jié)束或超時(shí)后,該數(shù)據(jù)區(qū)失效。
BizContext數(shù)據(jù)區(qū)在調(diào)用某個(gè)業(yè)務(wù)邏輯時(shí)為該業(yè)務(wù)邏輯實(shí)例建立的數(shù)據(jù)區(qū),展現(xiàn)邏輯調(diào)用業(yè)務(wù)邏輯時(shí)可以將RequestContext的部分?jǐn)?shù)據(jù)通過(guò)接口設(shè)置傳入到業(yè)務(wù)邏輯的數(shù)據(jù)區(qū),業(yè)務(wù)邏輯執(zhí)行過(guò)程中也可以通過(guò)調(diào)用不同的運(yùn)算邏輯改變BizContext數(shù)據(jù)區(qū)的內(nèi)容。當(dāng)業(yè)務(wù)邏輯執(zhí)行完返回到展現(xiàn)邏輯時(shí),可以將BizContext數(shù)據(jù)區(qū)的部分內(nèi)容通過(guò)接口設(shè)置傳回到展現(xiàn)邏輯的數(shù)據(jù)區(qū)中,與此同時(shí),BizContext數(shù)據(jù)區(qū)的生命周期失效。
以下是各個(gè)數(shù)據(jù)區(qū)的數(shù)據(jù)傳遞關(guān)系圖:
由圖可見(jiàn),SessionContext的數(shù)據(jù)不能直接傳遞到業(yè)務(wù)邏輯的BizContext數(shù)據(jù)區(qū)中。如果在業(yè)務(wù)邏輯中需要使用SessionContext數(shù)據(jù),需要在調(diào)用業(yè)務(wù)邏輯的展現(xiàn)邏輯中先將SessionContext的數(shù)據(jù)傳入到RequestContext數(shù)據(jù)區(qū)中,再由展現(xiàn)邏輯將傳入到RequestContext數(shù)據(jù)區(qū)的Session信息傳入到業(yè)務(wù)邏輯對(duì)應(yīng)的數(shù)據(jù)區(qū)BizContext中。通過(guò)以下圖示,我們可以看到開(kāi)發(fā)的各個(gè)構(gòu)件邏輯是怎樣通過(guò)各種引擎實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)換或者傳遞的。
由上圖我們可以看到,假定頁(yè)面1的表單(Form)提交時(shí),調(diào)用展現(xiàn)邏輯1,表單數(shù)據(jù)將會(huì)形成數(shù)據(jù)區(qū)實(shí)例RequestContext1,展現(xiàn)邏輯分別調(diào)用了業(yè)務(wù)邏輯1和業(yè)務(wù)邏輯2,在調(diào)用業(yè)務(wù)邏輯1時(shí),指定傳入了部分?jǐn)?shù)據(jù)給業(yè)務(wù)邏輯1,在業(yè)務(wù)邏輯1的實(shí)例啟動(dòng)后,同樣會(huì)建立業(yè)務(wù)邏輯實(shí)例1的數(shù)據(jù)區(qū)實(shí)例BizContext1,在處理完成后,返回部分?jǐn)?shù)據(jù)到RequestContext1,BizContext1的生命就結(jié)束了,展現(xiàn)邏輯實(shí)例1以同樣方式調(diào)用業(yè)務(wù)邏輯實(shí)例2,調(diào)用結(jié)束后,業(yè)務(wù)邏輯實(shí)例2的數(shù)據(jù)區(qū)實(shí)例BizContext2也可能返回了部分信息到RequestContext1中,這樣RequestContext1通過(guò)調(diào)用業(yè)務(wù)邏輯后數(shù)據(jù)與之前有了變化,這些數(shù)據(jù)又可以顯示到用戶(hù)頁(yè)面2上,然后RequestContext1的生命周期就結(jié)束了。頁(yè)面2上進(jìn)行一次新的調(diào)用,又開(kāi)始了新的執(zhí)行過(guò)程,可見(jiàn),不同數(shù)據(jù)區(qū)是根據(jù)不同的實(shí)例產(chǎn)生的,并隨著實(shí)例執(zhí)行的結(jié)束而結(jié)束,每種實(shí)例都擁有響應(yīng)類(lèi)型的數(shù)據(jù)區(qū)實(shí)例。
通過(guò)以下表格對(duì)各個(gè)數(shù)據(jù)區(qū)的特點(diǎn)進(jìn)行總結(jié):
基于XML數(shù)據(jù)總線(xiàn)實(shí)現(xiàn)應(yīng)用的數(shù)據(jù)流轉(zhuǎn),使得應(yīng)用各個(gè)層次耦合度更加松散,更加便于與外部系統(tǒng)實(shí)現(xiàn)集成,而系統(tǒng)卻在數(shù)據(jù)處理上具有了很強(qiáng)的擴(kuò)展性。這些優(yōu)勢(shì)將在后續(xù)的培訓(xùn)內(nèi)容中以具體的案例進(jìn)行驗(yàn)證。
評(píng)論