dorado是一套成熟的Web應(yīng)用開發(fā)套件, 其中包含了一個(gè)完整的具有下一代Web應(yīng)用特征的表現(xiàn)層解決方案。本文著重介紹了如何利用dorado的表現(xiàn)層與目前較為流行的Struts、Hibernate、Spring進(jìn)行協(xié)同開發(fā)。

圖表 1基于MVC模式的總體框架圖
上圖是利用dorado的表現(xiàn)層與目前較為流行的Struts、Hibernate、Spring進(jìn)行協(xié)同開發(fā)的總體框架圖。從此圖中我們不難看出與傳統(tǒng)的MVC的開發(fā)模式的最大區(qū)別在于View部分dorado的表現(xiàn)層實(shí)現(xiàn)。
1. 發(fā)起請(qǐng)求 從瀏覽器發(fā)出請(qǐng)求開始(如圖中的1號(hào)箭頭)。該請(qǐng)求首先將被Struts的ActionServlet接受,然后ActionServlet會(huì)根據(jù)用戶的Struts配置確定應(yīng)觸發(fā)哪一個(gè)具體的Action。
2. 調(diào)用業(yè)務(wù)邏輯 Action的主要任務(wù)是調(diào)用某一個(gè)業(yè)務(wù)邏輯對(duì)象BO(Business Object)已完成相應(yīng)的業(yè)務(wù)操作。由于我們?cè)诖丝蚣芸紤]引入了Spring,因此Action將不必直接創(chuàng)建具體的BO。而是通過Spring框架利用反向注入的原理(Ioc)來得到BO的實(shí)例。
在BO當(dāng)中我們應(yīng)當(dāng)通過數(shù)據(jù)訪問對(duì)象DAO(Data Access Object)來實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問操作。由于我們考慮在開發(fā)模式中引入Spring。因此,此處具體使用的DAO實(shí)例也應(yīng)通過Spring來獲取。
為了更好地實(shí)現(xiàn)業(yè)務(wù)邏輯的面向?qū)ο蠡覀冞€可以考慮利用Hibernate來作為DAO的具體實(shí)現(xiàn)方式。如此便有的了上圖中所展示的Model層的架構(gòu)。最終在整個(gè)系統(tǒng)中DAO成為了唯一的數(shù)據(jù)庫(kù)訪問途經(jīng)。通常我們可以將此圖中的DAO和Hibernate統(tǒng)稱為數(shù)據(jù)持久層。
另外,在某些情況我們也可以考慮簡(jiǎn)化此處的持久層設(shè)計(jì)。由于Hibernate本身就可以作為獨(dú)立的持久層實(shí)現(xiàn),因此也可以將此處的DAO對(duì)象省去,直接在BO中利用Hibernate完成數(shù)據(jù)訪問。
當(dāng)我們的Action完成了對(duì)BO的調(diào)用之后,我們應(yīng)當(dāng)將業(yè)務(wù)邏輯個(gè)直接結(jié)果存入到上下文對(duì)象(Context)當(dāng)中,以便于稍后的View能夠得到這些數(shù)據(jù)并用于界面的繪制和展現(xiàn)。在通常模式下BO的執(zhí)行結(jié)果都是以VO(Value Object)的方式返回的。VO既可以可以獨(dú)立的JavaBean也可以是JavaBean的集合(Collection, 例如:List 、Set) 。
3. 轉(zhuǎn)發(fā)請(qǐng)求 當(dāng)Action完成上述操作之后Struts應(yīng)根據(jù)BO的執(zhí)行結(jié)果和用戶的配置將請(qǐng)求轉(zhuǎn)發(fā)給某個(gè)具體的JSP來實(shí)現(xiàn)界面的展現(xiàn)。由于此處引入了dorado的表現(xiàn)層,因此JSP的作用已被弱化為了單一的對(duì)視圖模型(ViewModel)中的各種可視化對(duì)象進(jìn)行布局。
視圖模型是一種用戶描述視圖邏輯的對(duì)象。例如我們將表格要如何顯示、單擊按鈕后要完成什么動(dòng)作、下拉框如何進(jìn)行賦值等信息都?xì)w納為視圖邏輯。視圖模型只負(fù)責(zé)聲明和描述對(duì)象,而不負(fù)責(zé)對(duì)象具體的擺放位置。視圖模型無法獨(dú)立的訪問View層之外的數(shù)據(jù),視圖模型只能引用在數(shù)據(jù)模塊(Module)中定義的數(shù)據(jù)。
數(shù)據(jù)模塊是dorado的表現(xiàn)層中專門用于訪問外部數(shù)據(jù)的一種對(duì)象。例如在此處的開發(fā)模式當(dāng)中我們就利用數(shù)據(jù)模塊來訪問BO返回的執(zhí)行結(jié)果。
4. 值對(duì)象(VO)的傳遞 由于我們不能把數(shù)據(jù)模塊的激活和BO的調(diào)用看作是一個(gè)同步的過程。因此數(shù)據(jù)模塊無法直接得到BO返回的執(zhí)行結(jié)果,而只能通過上下文對(duì)象來獲取BO返回的VO。此處的上下文對(duì)象一般是指Request對(duì)象的Attributies屬性集。
數(shù)據(jù)模塊在得到VO之后需要自動(dòng)將VO中包含的信息反射成dorado中的數(shù)據(jù)集(Dataset)。由于此種數(shù)據(jù)轉(zhuǎn)化在某些極端的情況是非常復(fù)雜的(例如VO的多級(jí)集合嵌套),因此我們必要定義一些描述信息來輔助dorado按照正確的方式進(jìn)行數(shù)據(jù)轉(zhuǎn)換。值得慶幸的是dorado的Studio可以自動(dòng)生成絕大部分的描述信息。我們只需要根據(jù)實(shí)際情況的在必要的時(shí)候?qū)@些描述信息做少量的調(diào)整就可以了。
5. 反饋 VO的信息被正確的轉(zhuǎn)化到Dataset中之后,dorado的Module和ViewModel將按照其標(biāo)準(zhǔn)的方式運(yùn)行,并最終通過JSP將視圖信息反饋給瀏覽器。此處,dorado的表現(xiàn)層之所以需要數(shù)據(jù)模塊、視圖模型和JSP的協(xié)同工作是為了更好的實(shí)現(xiàn)代碼的重用。
綜上5個(gè)步驟,我們不難看出dorado與Struts、Hibernate、Spring這些產(chǎn)品進(jìn)行整合的關(guān)鍵在步驟4,即如何將VO轉(zhuǎn)換成dorado中的Dataset。而且事實(shí)上dorado的對(duì)象本身完全不需要對(duì)Struts、Hibernate、Spring中的任何對(duì)象進(jìn)行直接調(diào)用。這種松耦合的結(jié)合方式可以充分的保證系統(tǒng)架構(gòu)將來的靈活性和擴(kuò)展性。
結(jié)論
此種開發(fā)模式與傳統(tǒng)的開發(fā)模式比較,其最大的優(yōu)勢(shì)在于可以利用dorado大大的節(jié)省開發(fā)人員在開發(fā)Web應(yīng)用表現(xiàn)層式的工作量,同時(shí)又為我們的應(yīng)用提供非常友好、易用的用戶交互界面,將應(yīng)用直接升級(jí)成新一代的富客戶端網(wǎng)絡(luò)應(yīng)用(Rich Internet Application)。
此種開發(fā)模式與標(biāo)準(zhǔn)的dorado的開發(fā)相比將會(huì)帶來開發(fā)工作量的明顯加大,不過同時(shí)在開發(fā)模式上的標(biāo)準(zhǔn)化也可以在另外一些方面為我們帶來好處。例如可以系統(tǒng)架構(gòu)具有更好的擴(kuò)展性,使得將來在需要的時(shí)候引入其他框架類產(chǎn)品的變得相對(duì)容易。
|
工作量 |
界面 |
擴(kuò)展性 |
傳統(tǒng)MVC
(使用上述開發(fā)模式中除dorado外的所有技術(shù)) |
最大 |
簡(jiǎn)陋 |
好 |
引入dorado的MVC架構(gòu)
(使用本文介紹的開發(fā)模式) |
較大 |
友好
(富客戶端) |
好 |
dorado的標(biāo)準(zhǔn)開發(fā)模式
(不包含Struts、Hibernate、Spring) |
較小 |
友好
(富客戶端) |
較好 |
Dorado除可以幫我們改善界面之外,還可以為我們提供國(guó)際化、性能分析、權(quán)限配置等等諸多實(shí)用的功能,由此可見引入dorado作帶來的好處是不言而喻的,此處不做過多累述。但是對(duì)于上表中的后兩種開發(fā)方式的取舍應(yīng)根據(jù)多方面的實(shí)際情況來決斷。一般而言,對(duì)于規(guī)模不是特別大,參與開發(fā)的人員不多且預(yù)計(jì)系統(tǒng)將來升級(jí)和擴(kuò)展不是很頻繁的項(xiàng)目,我們?nèi)酝扑]選用相對(duì)簡(jiǎn)單且快速的第三種方式,即直接使用dorado標(biāo)準(zhǔn)的開發(fā)模式。
與了解更多詳情請(qǐng)瀏覽一下網(wǎng)址:
http://61.151.239.187/doradosample/hibernate2.show.d
http://61.151.239.187/doradosample/hibernate3.show.d