在描述EOS的技術(shù)路線(xiàn)和產(chǎn)品內容時(shí),都會(huì )重點(diǎn)提到
數據總線(xiàn)的概念。的確,如果在開(kāi)發(fā)中真正理解了基于數據
總線(xiàn)的數據傳遞機制,開(kāi)發(fā)起來(lái)將會(huì )得心應手游刃有余。這個(gè)神秘的數據總線(xiàn)在EOS中到底是什么東西呢?為什么要在EOS中引入這樣一個(gè)東西呢?
總所周知,標準的J2EE應用中數據傳遞是基于對象傳遞的,一個(gè)實(shí)例化后的對象既包括數據,同時(shí)也包括一些操作,執行過(guò)程是通過(guò)調用對象的方法,同時(shí)將包含數據的對象作為調用方法的參數傳遞進(jìn)去進(jìn)行相應的操作。在EOS應用中,結合J2EE WEB應用的特點(diǎn),將運行時(shí)的數據根據不同層次和作用范圍以XML格式被獨立封裝到3個(gè)不同的內存數據區中。分別為會(huì )話(huà)數據區(SessionContext)、請求數據區(RequestContext)和業(yè)務(wù)處理數據區(BizContext),這幾個(gè)數據區就構成了EOS的數據總線(xiàn)。
RequestContext數據區是根據HTTP Request對象建立的,封裝了HTML頁(yè)面上通過(guò)post或者get方式提交的表單數據以及一些系統信息(如客戶(hù)端IP、請求的URI等),這個(gè)數據區能夠被表單中的Action對應的展現邏輯直接進(jìn)行讀取,也能通過(guò)EOS提供的JSP頁(yè)面TAG讀取數據顯示在頁(yè)面上,系統為每一次客戶(hù)端請求建立一個(gè)專(zhuān)有的RequestContext數據區,當系統完成響應(Respone)后該數據區失效。
SessionContext數據區是根據HTTP Session對象建立的,封裝了WEB容器中的用戶(hù)的會(huì )話(huà)信息,這些Session信息是通過(guò)展現邏輯的數據設置接口寫(xiě)入的,也可以通過(guò)數據設置接口獲得SessionContext的數據后寫(xiě)入到RequestContext數據區中。JSP頁(yè)面通過(guò)TAG可以直接獲取SessionContext的數據。SessionContext的數據區在一個(gè)WEB會(huì )話(huà)建立時(shí)創(chuàng )建,在會(huì )話(huà)保持期間可以存取其中的內容(一般通過(guò)展現邏輯實(shí)現),當會(huì )話(huà)結束或超時(shí)后,該數據區失效。
BizContext數據區在調用某個(gè)業(yè)務(wù)邏輯時(shí)為該業(yè)務(wù)邏輯實(shí)例建立的數據區,展現邏輯調用業(yè)務(wù)邏輯時(shí)可以將RequestContext的部分數據通過(guò)接口設置傳入到業(yè)務(wù)邏輯的數據區,業(yè)務(wù)邏輯執行過(guò)程中也可以通過(guò)調用不同的運算邏輯改變BizContext數據區的內容。當業(yè)務(wù)邏輯執行完返回到展現邏輯時(shí),可以將BizContext數據區的部分內容通過(guò)接口設置傳回到展現邏輯的數據區中,與此同時(shí),BizContext數據區的生命周期失效。
以下是各個(gè)數據區的數據傳遞關(guān)系圖:
由圖可見(jiàn),SessionContext的數據不能直接傳遞到業(yè)務(wù)邏輯的BizContext數據區中。如果在業(yè)務(wù)邏輯中需要使用SessionContext數據,需要在調用業(yè)務(wù)邏輯的展現邏輯中先將SessionContext的數據傳入到RequestContext數據區中,再由展現邏輯將傳入到RequestContext數據區的Session信息傳入到業(yè)務(wù)邏輯對應的數據區BizContext中。通過(guò)以下圖示,我們可以看到開(kāi)發(fā)的各個(gè)構件邏輯是怎樣通過(guò)各種引擎實(shí)現數據的轉換或者傳遞的。

由上圖我們可以看到,假定頁(yè)面1的表單(Form)提交時(shí),調用展現邏輯1,表單數據將會(huì )形成數據區實(shí)例RequestContext1,展現邏輯分別調用了業(yè)務(wù)邏輯1和業(yè)務(wù)邏輯2,在調用業(yè)務(wù)邏輯1時(shí),指定傳入了部分數據給業(yè)務(wù)邏輯1,在業(yè)務(wù)邏輯1的實(shí)例啟動(dòng)后,同樣會(huì )建立業(yè)務(wù)邏輯實(shí)例1的數據區實(shí)例BizContext1,在處理完成后,返回部分數據到RequestContext1,BizContext1的生命就結束了,展現邏輯實(shí)例1以同樣方式調用業(yè)務(wù)邏輯實(shí)例2,調用結束后,業(yè)務(wù)邏輯實(shí)例2的數據區實(shí)例BizContext2也可能返回了部分信息到RequestContext1中,這樣RequestContext1通過(guò)調用業(yè)務(wù)邏輯后數據與之前有了變化,這些數據又可以顯示到用戶(hù)頁(yè)面2上,然后RequestContext1的生命周期就結束了。頁(yè)面2上進(jìn)行一次新的調用,又開(kāi)始了新的執行過(guò)程,可見(jiàn),不同數據區是根據不同的實(shí)例產(chǎn)生的,并隨著(zhù)實(shí)例執行的結束而結束,每種實(shí)例都擁有響應類(lèi)型的數據區實(shí)例。
通過(guò)以下表格對各個(gè)數據區的特點(diǎn)進(jìn)行總結:
基于XML數據總線(xiàn)實(shí)現應用的數據流轉,使得應用各個(gè)層次耦合度更加松散,更加便于與外部系統實(shí)現集成,而系統卻在數據處理上具有了很強的擴展性。這些優(yōu)勢將在后續的培訓內容中以具體的案例進(jìn)行驗證。
評論