要了解dorado的詳情請(qǐng)瀏覽http://www.bstek.com
在http://www.aygfsteel.com/dorado/archive/2005/07/25/8367.html中我們已經(jīng)了解到dorado的開(kāi)發(fā)模式與傳統(tǒng)的基于MVC的企業(yè)應(yīng)用開(kāi)發(fā)模式之間存在著一些差異. 可能看到這里您已經(jīng)產(chǎn)生了一大堆的問(wèn)題:
l 為什么一定要有這樣的差異存在?
l 這種差異將在多大的程度上影響我們企業(yè)原有的系統(tǒng)或開(kāi)發(fā)框架(開(kāi)發(fā)規(guī)范)?
l 這種差異將在多大的程度上影響程序員原有的編程習(xí)慣?
l Dorado的開(kāi)發(fā)方式是否擁有足夠的健壯性、足夠的擴(kuò)展性?
為了深入的解答上述這些問(wèn)題, 我們首先來(lái)了解一下傳統(tǒng)的MVC開(kāi)發(fā)模式. 如下圖(此處的Control以目前最為流行的Struts為例):
圖表 傳統(tǒng)的基于MVC架構(gòu)開(kāi)發(fā)模式
1. Request(請(qǐng)求): 當(dāng)Client端(瀏覽器)發(fā)起請(qǐng)求時(shí), 改請(qǐng)求將首先被控制層(Struts的Action)接受.
2. Dispatch(分發(fā)): Action將調(diào)用具體的Model中的BO對(duì)象來(lái)完成實(shí)際的業(yè)務(wù)邏輯操作, 然后將執(zhí)行結(jié)果存貯于Request的Attributies中. (一般慣例是這樣的)
3. Forward(轉(zhuǎn)向): 商業(yè)邏輯執(zhí)行完成后Action將根據(jù)商業(yè)邏輯的執(zhí)行結(jié)果將Request轉(zhuǎn)向給具體的視圖(JSP).
4. Extract(提取): 一般而言JSP不會(huì)去直接訪問(wèn)Model層, 而是直接到Request的Attributies中提取已經(jīng)在第2歩存放好的業(yè)務(wù)數(shù)據(jù).
5. Response(反饋): 視圖的Server端準(zhǔn)備工作完成后會(huì)自動(dòng)將各種信息輸出到Response對(duì)象中反饋給Client端.
從上面的分析我們不難看到在這種開(kāi)發(fā)模式中, 業(yè)務(wù)邏輯主要都是在Action中完成調(diào)用的, 然后通過(guò)Request的Attributies作為上下文對(duì)象在Action和JSP之間傳遞信息.
那么基于dorado的開(kāi)發(fā)是否也可以按照這種方式來(lái)操作呢? 答案是可以, 但是dorado中某些高級(jí)功能會(huì)受到一些影響.
因?yàn)樵趥鹘y(tǒng)的B/S應(yīng)用中, Client與Server端的交互完全是通過(guò)HTML FORM來(lái)完成. 而且每次執(zhí)行完一個(gè)業(yè)務(wù)邏輯操作之后往往會(huì)刷新整個(gè)Client頁(yè)面, 即連同操作結(jié)果和HTML一起下載并重新裝載整個(gè)Client頁(yè)面. 可是在dorado的Client中我們可以實(shí)現(xiàn)很多類似頁(yè)面局部刷新、數(shù)據(jù)分批下載、遠(yuǎn)程方法調(diào)用、復(fù)雜數(shù)據(jù)對(duì)象的整體提交這樣的功能. 這些功能的實(shí)現(xiàn)不能完全依賴于傳統(tǒng)的HTML FORM的提交來(lái)完成, 而是需要依靠瀏覽器的XMLHTTP技術(shù).
提示 |
上面提到的dorado中的頁(yè)面局部刷新、數(shù)據(jù)分批下載、遠(yuǎn)程方法調(diào)用、復(fù)雜數(shù)據(jù)對(duì)象的整體提交等功能您可以通過(guò)dorado的SampleCenter中的下面一個(gè)例子來(lái)體驗(yàn).
|
綜上, 對(duì)于Server端的程序而言傳統(tǒng)的B/S應(yīng)用和dorado應(yīng)用最大的差別就在于此.
l 在傳統(tǒng)的B/S應(yīng)用中Server端的程序只需要處理一種Client請(qǐng)求, 即執(zhí)行邏輯然后返回視圖, 且要處理的Client請(qǐng)求的參數(shù)類型都是類同的.
l 在dorado應(yīng)用中Server端的程序需要處理至少兩種Client請(qǐng)求. 其中一種是簡(jiǎn)單的類似傳統(tǒng)B/S應(yīng)用的請(qǐng)求, 另一種是dorado獨(dú)具的用于處理類似數(shù)據(jù)分批下載和復(fù)雜數(shù)據(jù)提交的請(qǐng)求, 這一類請(qǐng)求都是通過(guò)XMLHTTP技術(shù)提交的, 其參數(shù)信息都包含在一段XML中. 且這一類請(qǐng)求的反饋結(jié)果必須同樣是XML格式的, 其中只包含數(shù)據(jù)和執(zhí)行結(jié)果, 不能包含HTML信息.
這樣一來(lái)我們便很難將所有的請(qǐng)求的處理代碼一概放到Action中完成. 因?yàn)閷?duì)于dorado應(yīng)用, 其中的部分請(qǐng)求的參數(shù)是相對(duì)比較復(fù)雜的XML. 所以為了避免自己手工的去解析和組裝XML, 我們應(yīng)當(dāng)把這種請(qǐng)求的業(yè)務(wù)邏輯調(diào)用放到dorado的Module或著ViewModel中, 讓dorado來(lái)幫我們完成繁瑣的XML信息處理, 我們只要直接使用通過(guò)解析獲得的Java對(duì)象型的數(shù)據(jù)就可以了.
那么這種方式是否意味著原本集中在Action中的業(yè)務(wù)邏輯調(diào)用被分散到了幾個(gè)不同的環(huán)節(jié), 造成系統(tǒng)中業(yè)務(wù)邏輯的分散而不易管理呢? 應(yīng)該說(shuō)只要我們對(duì)系統(tǒng)稍作調(diào)整就可以避免這個(gè)問(wèn)題的出現(xiàn)了 – 我們需要引入業(yè)務(wù)代表層(BO Delegate).
圖表 原有的系統(tǒng)調(diào)用BO的模式
如上圖所示, 在原有的系統(tǒng)中我們一般首先會(huì)在Action中將Request中附帶的Parameter等信息提供給BO Delegate, 由BO Delegate將其組裝成一個(gè)或幾個(gè)VO(Value Object)對(duì)象, 或者直接使用Struts提供的FormBean對(duì)象作為VO對(duì)象. 然后再利用這些VO對(duì)象去調(diào)用自己的業(yè)務(wù)邏輯對(duì)象. 對(duì)于BO而言, 他的前端介面就是VO.
注意 |
在您的系統(tǒng)有可能并沒(méi)有明確的定義BO Delegate這種對(duì)象, 可它事實(shí)上往往是存在的. 除非您的系統(tǒng)中直接將Request對(duì)象傳進(jìn)了BO層. 如果是這樣的話, 我們認(rèn)為你的系統(tǒng)原本也屬于應(yīng)進(jìn)行重構(gòu)的范疇. 因?yàn)檫@樣的BO層與Request進(jìn)行了不必要的耦合, 大大降低了系統(tǒng)的可擴(kuò)展性. 且這樣的BO是無(wú)法支持單元測(cè)試(測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的)的. |
對(duì)于dorado應(yīng)用而言BO仍可以以完全相同的VO作為其前端介面, 只是我們需要另外一種或幾種BO Delegate負(fù)責(zé)將不同的外部數(shù)據(jù)構(gòu)造成統(tǒng)一的VO對(duì)象.
圖表 改造后系統(tǒng)調(diào)用BO的模式
如上圖所示, 當(dāng)Action接到XMLHTTP發(fā)送的請(qǐng)求時(shí)會(huì)將處理轉(zhuǎn)交給dorado中的Module或ViewModel對(duì)象來(lái)處理, 由他們首先來(lái)完成對(duì)XML提交信息的解析. 而后再利用BO Delegate將這些信息組裝成BO所需要的VO對(duì)象. 這樣, 我們事實(shí)上幾乎不需要對(duì)BO層做什么改動(dòng)就可以將dorado導(dǎo)入到系統(tǒng)中了. 而且很明顯這樣的調(diào)整是不會(huì)影響到整個(gè)系統(tǒng)的擴(kuò)展性的.
從另外一個(gè)簡(jiǎn)單的角度來(lái)看這個(gè)問(wèn)題, 事實(shí)上就是在新的系統(tǒng)架構(gòu)中我們保留整個(gè)Model層的設(shè)計(jì), 用dorado來(lái)替換原先的View層. 然后在Model層和dorado的View層直接通過(guò)一組特別定義的交互接口來(lái)實(shí)現(xiàn)對(duì)接. 對(duì)接時(shí)使用VO作為數(shù)據(jù)交換對(duì)象. 同時(shí)dorado又特別提供了DODataset和DOUtils等對(duì)象和工具類可以輔助我們更加方便的構(gòu)造和溶解各種類型的VO對(duì)象. 因此你大可不必為整合dorado而大傷腦筋, 盡管他需要我們適當(dāng)?shù)恼{(diào)整原有的開(kāi)發(fā)習(xí)慣, 但是dorado帶給我們的其它好處是顯而易見(jiàn)的.