[摘 要] 本文結(jié)合中小企業(yè)電子商務(wù)系統(tǒng)的特點(diǎn),分析了J2EE平臺(tái)下開(kāi)發(fā)模式的發(fā)展,介紹了一種在實(shí)踐中積累形成的業(yè)務(wù)構(gòu)造平臺(tái)的初步設(shè)想和原型,分析了其特點(diǎn)、應(yīng)用前景和待完善的地方。
[關(guān)鍵詞] 框架技術(shù) 軟件復(fù)用 電子商務(wù)系統(tǒng) MVC
一、概述
軟件的可重用性一直是軟件工程所追求的目標(biāo)之一,軟件工程界希望有一天能和其他工業(yè)領(lǐng)域一樣,利用標(biāo)準(zhǔn)化的軟件模塊快速構(gòu)建特定的應(yīng)用系統(tǒng)。
這種情況下框架應(yīng)運(yùn)而生,面向?qū)ο笙到y(tǒng)獲得的最大的復(fù)用方式就是框架,一個(gè)大的應(yīng)用系統(tǒng)往往可能由多層互相協(xié)作的框架組成。因此框架技術(shù)已經(jīng)日益成為提高軟件生產(chǎn)效率的關(guān)鍵。
1.什么是應(yīng)用框架
對(duì)于應(yīng)用框架,一直以來(lái)沒(méi)有一個(gè)統(tǒng)一的定義,下面給出兩個(gè)最常用的定義:“框架是一個(gè)系統(tǒng)全部或者部分的可復(fù)用設(shè)計(jì),通常由一組抽象類和類之間的協(xié)作組成”;“框架是一個(gè)能夠被開(kāi)發(fā)人員實(shí)例化的系統(tǒng)骨架”。這兩個(gè)定義是相互補(bǔ)充的,前者從復(fù)用的角度描述了框架,而后者給出了框架的目的。根據(jù)以上兩個(gè)定義可知:(1)框架既分割了應(yīng)用領(lǐng)域中的類、定義了各部分的主要責(zé)任和類與對(duì)象的協(xié)作關(guān)系,還規(guī)定了控制流程;(2)框架記錄并實(shí)現(xiàn)了其應(yīng)用領(lǐng)域的主要公共設(shè)計(jì)決策。由此可以認(rèn)為,框架是一個(gè)“部分實(shí)現(xiàn)”的軟件體系結(jié)構(gòu),是支持軟件設(shè)計(jì)復(fù)用1.2電子商務(wù)系統(tǒng)開(kāi)發(fā)過(guò)程中框架技術(shù)應(yīng)用的重要性
電子商務(wù)系統(tǒng)有著應(yīng)用系統(tǒng)的共性,同時(shí)也有著自身的特點(diǎn),相對(duì)來(lái)說(shuō)流程和操作較為規(guī)范和簡(jiǎn)單,完全可以總結(jié)出規(guī)范的流程,從而可以說(shuō)為復(fù)用技術(shù)的應(yīng)用創(chuàng)造了條件。
2.框架技術(shù)在系統(tǒng)開(kāi)發(fā)中的重要作用
(1)知識(shí)積累。從代碼出發(fā)進(jìn)行知識(shí)的積累是最佳的辦法??蚣芫褪沁@種思路的產(chǎn)出物??蚣馨舜罅康拇a,這些代碼是對(duì)某個(gè)特定問(wèn)題領(lǐng)域中抽象概念及這些抽象概念之間關(guān)系的描述。
(2)資產(chǎn)的保護(hù)。知識(shí)積累本身就是一項(xiàng)對(duì)資產(chǎn)的保護(hù)工作。而另一項(xiàng)很重要的保護(hù)工作就是軟件組織(尤其是企業(yè))需要保證對(duì)知識(shí)的學(xué)習(xí)和改進(jìn)是經(jīng)過(guò)合法授權(quán)的。將知識(shí)積累為框架的形式有助于緩解這種情況。
(3)鼓勵(lì)重用。在軟件組織中形成以框架為核心的開(kāi)發(fā)方式,在開(kāi)發(fā)中使用框架,并在開(kāi)發(fā)完成后改進(jìn)框架。在這個(gè)反覆的過(guò)程中,重用的工作就已經(jīng)開(kāi)展起來(lái)了。
(4)優(yōu)化架構(gòu)??蚣艽砹艘环N優(yōu)秀的軟件架構(gòu)??蚣芏x了擴(kuò)展方式,從而規(guī)范了框架的使用行為。這使得軟件能夠保持整體架構(gòu)的穩(wěn)定性和一致性。
二、應(yīng)用框架eCommerce Framework的設(shè)計(jì)實(shí)現(xiàn)
1.J2EE平臺(tái)下應(yīng)用系統(tǒng)開(kāi)發(fā)模式的進(jìn)化過(guò)程
(1)JSPModel1
早期的JSP規(guī)范提出了兩種用JSP技術(shù)建立應(yīng)用程序的方式。這兩種方式在術(shù)語(yǔ)中分別稱作JSP Model 1 和JSP Model 2,它們的本質(zhì)區(qū)別在于處理批量請(qǐng)求的位置不同。在Model 1體系中,如圖1所示,JSP頁(yè)面獨(dú)自響應(yīng)請(qǐng)求并將處理結(jié)果返回客戶。這里仍然存在表達(dá)與內(nèi)容的分離,因?yàn)樗械臄?shù)據(jù)存取都是由bean來(lái)完成的。盡管Model 1體系十分適合簡(jiǎn)單應(yīng)用的需要,它卻不能滿足復(fù)雜的大型應(yīng)用程序的實(shí)現(xiàn)。不加選擇地隨意運(yùn)用Model 1,會(huì)導(dǎo)致JSP頁(yè)內(nèi)被嵌入大量的腳本片段或Java代碼,特別是當(dāng)需要處理的請(qǐng)求量很大時(shí),情況更為嚴(yán)重。
圖中文字:Request:請(qǐng)求;Response:響應(yīng);Application Server:應(yīng)用服務(wù)器;
Enterprise Servers/Data Sources:企業(yè)服務(wù)器/數(shù)據(jù)源。
(2)JSPModel2
Model 2體系結(jié)構(gòu),如圖2所示,是一種把JSP與servlets聯(lián)合使用來(lái)實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容服務(wù)的方法。它吸取了兩種技術(shù)各自的突出優(yōu)點(diǎn),用JSP生成表達(dá)層的內(nèi)容,讓servlets完成深層次的處理任務(wù)。
圖中文字:Controller、View、Model分別為MVC設(shè)計(jì)模式中的控制者、視圖、模型;
其他同圖1。
(3)MVC模式的杰出實(shí)現(xiàn)——Struts
MVC本身就是一個(gè)非常復(fù)雜的系統(tǒng),所以采用MVC實(shí)現(xiàn)Web應(yīng)用時(shí),最好選一個(gè)現(xiàn)成的MVC框架,在此之下進(jìn)行開(kāi)發(fā),從而取得事半功倍的效果。現(xiàn)在有很多可供使用的MVC框架,由于Struts有完整的文檔并且相對(duì)來(lái)講比較簡(jiǎn)單,所以用它開(kāi)發(fā)MVC系統(tǒng)還是比較方便地。
作為一個(gè)MVC的框架,Struts對(duì)Model、View和Controller都提供了對(duì)應(yīng)的實(shí)現(xiàn)組件,下面分別進(jìn)行介紹,并且看看它們是如何結(jié)合在一起的。
Struts框架的處理流程清楚的體現(xiàn)了MVC系統(tǒng)的特點(diǎn),簡(jiǎn)單的Struts組件結(jié)構(gòu)如圖3所示。Struts Controller ActionServlet處理客戶請(qǐng)求,利用配置的ActionMapping對(duì)象把請(qǐng)求映射到Action處理器對(duì)象進(jìn)行處理。Action處理對(duì)象訪問(wèn)ActionForm中的數(shù)據(jù),處理和響應(yīng)客戶請(qǐng)求,它還調(diào)用后臺(tái)的Bean組件,這些組件封裝了具體的業(yè)務(wù)邏輯。Action處理器對(duì)象根據(jù)處理結(jié)果通知Controller,Controller進(jìn)行下一步的處理。
2.eCommerceFramework的設(shè)計(jì)
從上面的介紹不難看出struts在將問(wèn)題分為幾個(gè)部分的同時(shí)也引入了復(fù)雜性。毫無(wú)疑問(wèn),要理解 Struts 必須接受一定的培訓(xùn),對(duì)開(kāi)發(fā)者的要求較高。而且在實(shí)際開(kāi)發(fā)中我們發(fā)現(xiàn)它的有些特性并不合適規(guī)模相對(duì)較小的電子商務(wù)系統(tǒng)的開(kāi)發(fā),如taglib等。
這樣我們就希望根據(jù)需要開(kāi)發(fā)適合自己的MVC框架實(shí)現(xiàn),這就是下面要重點(diǎn)介紹的eCommerceFramework。
(1)傳統(tǒng)MVC的弱點(diǎn)
MVC框架體現(xiàn)了一種“分治”的思想,他將業(yè)務(wù)邏輯、數(shù)據(jù)的訪問(wèn)與界面表現(xiàn)進(jìn)行了分離,為我們開(kāi)發(fā)具有伸縮性、便于擴(kuò)展、便于整個(gè)流程維護(hù)的系統(tǒng)提供了必要的條件。但是在項(xiàng)目實(shí)踐中不難發(fā)現(xiàn),即使使用了MVC,開(kāi)發(fā)基于J2EE的系統(tǒng)仍然不是一件輕松的事情。過(guò)多的bean其實(shí)重復(fù)著大致相同的操作——存取數(shù)據(jù);不同層間數(shù)據(jù)交換的格式?jīng)]有規(guī)范;布局相似的JSP頁(yè)面仍然重用性不高;框架沒(méi)有加進(jìn)權(quán)限控制……等等,這些都制約了系統(tǒng)開(kāi)發(fā)的效率和質(zhì)量。
(2)持久化對(duì)象模型hibernate的啟示
幾乎所有的企業(yè)級(jí)應(yīng)用都必定要涉及對(duì)象模型與數(shù)據(jù)庫(kù)之間的交互,因此持久層成為J2EE系統(tǒng)中最重要的部分之一。直接用JDBC或是DAO來(lái)實(shí)現(xiàn)會(huì)造成維護(hù)的”高消費(fèi)”,對(duì)于大型系統(tǒng)簡(jiǎn)直是一場(chǎng)噩夢(mèng)。
作為一個(gè)純JAVA的O/R(對(duì)象/關(guān)系)映射框架,Hibernate很好的實(shí)現(xiàn)了對(duì)應(yīng)用程序持久化的管理。其基本原理是用xml映射文件描述業(yè)務(wù)實(shí)體類映射數(shù)據(jù)庫(kù)的方式,然后通過(guò)hibernate api實(shí)現(xiàn)持久化操作。
(3)框架原型
對(duì)MVC及Hibernate的思想進(jìn)行了整合與改進(jìn),我們提出了框架的原型。
從圖4中不難看出,整個(gè)系統(tǒng)完全遵循MVC設(shè)計(jì)模式的框架,系統(tǒng)各個(gè)模塊之間的耦合相對(duì)寬松,在系統(tǒng)開(kāi)發(fā)期間,各部分開(kāi)發(fā)人員之間不存在明顯的制約關(guān)系。實(shí)際上,我們只需要關(guān)心業(yè)務(wù)邏輯,對(duì)于數(shù)據(jù)庫(kù)的操作,數(shù)據(jù)格式的轉(zhuǎn)換等等頭疼的問(wèn)題全由框架代勞了。下面的例子說(shuō)明了使用eCommerceFramework后實(shí)現(xiàn)一個(gè)業(yè)務(wù)流程所要做的工作。
(4)框架的其他組件
①XML是關(guān)鍵。與HTML不同的是,XML語(yǔ)言能把數(shù)據(jù)與數(shù)據(jù)表示(例如界面)分開(kāi)。這種特性能夠讓XML適合在網(wǎng)絡(luò)上不同計(jì)算環(huán)境(無(wú)論是不同的操作系統(tǒng)環(huán)境,還是不同的設(shè)備顯示方式)中采用一致的信息表示方式?;贘2EE的大多數(shù)框架都使用了XML及相關(guān)技術(shù),如struts, velocity等等。
在框架中,XML可以說(shuō)是框架的核心技術(shù)之一。無(wú)論在前臺(tái)頁(yè)面的展現(xiàn)、服務(wù)器的配置,還是遠(yuǎn)程數(shù)據(jù)傳輸、數(shù)據(jù)的持久化都可以看到XML的應(yīng)用。
②集成的權(quán)限控制。框架在設(shè)計(jì)之初就考慮了權(quán)限控制的接口(如圖5)?;具^(guò)程是這樣的,每一個(gè)頁(yè)面請(qǐng)求所對(duì)應(yīng)的Action都惟一的與模塊(Module)和組(Datagroup)關(guān)聯(lián),當(dāng)解析出請(qǐng)求的Action后,連接數(shù)據(jù)庫(kù)判斷當(dāng)前用戶是否有模塊操作權(quán)限和數(shù)據(jù)權(quán)限。通過(guò)Check進(jìn)行后續(xù)實(shí)體操作,反之則拒絕服務(wù),將信息返回用戶。
三、結(jié)語(yǔ)
eCommerceFramework設(shè)計(jì)的初衷主要是為了使基于J2EE的項(xiàng)目產(chǎn)品化,縮短開(kāi)發(fā)周期,提高系統(tǒng)質(zhì)量。經(jīng)過(guò)幾個(gè)項(xiàng)目的測(cè)試與檢驗(yàn),同等規(guī)模的系統(tǒng)開(kāi)發(fā)較普通MVC模式節(jié)省了超過(guò)50%的代碼量,相應(yīng)也就節(jié)省了50%的人月,并且測(cè)試中發(fā)現(xiàn)的bug數(shù)量?jī)H為過(guò)去開(kāi)發(fā)的系統(tǒng)的三分之一。當(dāng)然有一個(gè)前提,項(xiàng)目初期的架構(gòu)培訓(xùn)工作一定要做好,要讓項(xiàng)目組中每一個(gè)人知道框架的意義和接口,包括分析設(shè)計(jì)人員和程序員。
但是可以看到框架在UI的設(shè)計(jì)和開(kāi)發(fā)方面做的還不夠,對(duì)于類似頁(yè)面的巨大工作量和重復(fù)勞動(dòng)還無(wú)能為力。這一點(diǎn)我們希望引入模型組件庫(kù)和邏輯頁(yè)面模板庫(kù)來(lái)解決。
目前的應(yīng)用MIS系統(tǒng)都不可避免的有大量的統(tǒng)計(jì)和數(shù)據(jù)導(dǎo)入導(dǎo)出功能。對(duì)于統(tǒng)計(jì)結(jié)果的表現(xiàn)我們準(zhǔn)備應(yīng)用VML語(yǔ)言,并逐步形成自己的一套組件;數(shù)據(jù)轉(zhuǎn)換采用常用的EXECL格式,基本能夠滿足大部分應(yīng)用的要求。
參考文獻(xiàn):
[1]Sun Microsystem Inc.Java: 2 Platform Enterprise Edition Specfication v1.4,http://java.sun.com/j2ee
[2]Mark Eagle:Object to Relational Mapping and Relationships with Hibernate
[3]Chi-Hsing Chu Chien-Hsuan Huang Michael Lee:Building a XML-based unified interface system under J2EE architecture
[4]Gorel HedinJorgen Lindskov Knudsen:Language Support for Application Design, Wiley 1999
[5]Jiewei Lin:3D Web Graphics without Plugins using VML, CS297 Report
[6]David S.Frankel著/鮑志云譯:《應(yīng)用MDA》
[7] Johnson RE. Frameworks = (Components + Patterns). Communications of the ACM, 1997
[8]Rumbaugh J, Jacobon I, Booch G. The UML Reference Manual. New York: Addison-Wesley, 1999
[9]JamesTurner, Kevin Bedell. Struts Kick Start[M].北京電子工業(yè)出版社,2004