表現(xiàn)層是傳統(tǒng)的JSP技術(shù),自1999年問(wèn)世以來(lái),經(jīng)過(guò)多年的發(fā)展,其廣泛的應(yīng)用和穩(wěn)定的表現(xiàn),為其作為表現(xiàn)層技術(shù)打下了堅(jiān)實(shí)的基礎(chǔ)。
中間層采用的是流行的Spring+Hibernate,為了將控制層與業(yè)務(wù)邏輯層分離,又細(xì)分為以下幾種。
Web層,就是MVC模式里面的“C”(controller),負(fù)責(zé)控制業(yè)務(wù)邏輯層與表現(xiàn)層的交互,調(diào)用業(yè)務(wù)邏輯層,并將業(yè)務(wù)數(shù)據(jù)返回給表現(xiàn)層作組織表現(xiàn),該系統(tǒng)的MVC框架采用Struts。
Service層(就是業(yè)務(wù)邏輯層),負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)邏輯。業(yè)務(wù)邏輯層以DAO層為基礎(chǔ),通過(guò)對(duì)DAO組件的正面模式包裝,完成系統(tǒng)所要求的業(yè)務(wù)邏輯。
DAO層,負(fù)責(zé)與持久化對(duì)象交互。該層封裝了數(shù)據(jù)的增、刪、查、改的操作。
PO,持久化對(duì)象。通過(guò)實(shí)體關(guān)系映射工具將關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)映射成對(duì)象,很方便地實(shí)現(xiàn)以面向?qū)ο蠓绞讲僮鲾?shù)據(jù)庫(kù),該系統(tǒng)采用Hibernate作為ORM框架。
Spring的作用貫穿了整個(gè)中間層,將Web層、Service層、DAO層及PO無(wú)縫整合,其數(shù)據(jù)服務(wù)層用來(lái)存放數(shù)據(jù)。
一個(gè)良好的框架可以讓開發(fā)人員減輕重新建立解決復(fù)雜問(wèn)題方案的負(fù)擔(dān)和精力;它可以被擴(kuò)展以進(jìn)行內(nèi)部的定制化;并且有強(qiáng)大的用戶社區(qū)來(lái)支持它。框架通常能很好的解決一個(gè)問(wèn)題。然而,你的應(yīng)用是分層的,可能每一個(gè)層都需要各自的框架。僅僅解決UI問(wèn)題并不意味著你能夠很好的將業(yè)務(wù)邏輯和持久性邏輯和UI 組件很好的耦合。
不可否認(rèn),對(duì)于簡(jiǎn)單的應(yīng)用,采用ASP或者PHP的開發(fā)效率比采用J2EE框架的開發(fā)效率要高。甚至有人會(huì)覺(jué)得:這種分層的結(jié)構(gòu),比一般采用JSP + Servlet的系統(tǒng)開發(fā)效率還要低。
筆者從一下幾個(gè)角度來(lái)闡述這個(gè)問(wèn)題。
— 開發(fā)效率:軟件工程是個(gè)特殊的行業(yè),不同于傳統(tǒng)的工業(yè),例如電器、建筑及汽車等行業(yè)。這些行業(yè)的產(chǎn)品一旦開發(fā)出來(lái),交付用戶使用后將很少需要后續(xù)的維護(hù)。但軟件行業(yè)不同,軟件產(chǎn)品的后期運(yùn)行維護(hù)是個(gè)巨大的工程,單純從前期開發(fā)時(shí)間上考慮其開發(fā)效率是不理智的,也是不公平的。眾所周知,對(duì)于傳統(tǒng)的ASP和 PHP等腳本站點(diǎn)技術(shù),將整個(gè)站點(diǎn)的業(yè)務(wù)邏輯和表現(xiàn)邏輯都混雜在ASP或PHP頁(yè)面里,從而導(dǎo)致頁(yè)面的可讀性相當(dāng)差,可維護(hù)性非常低。即使需要簡(jiǎn)單改變頁(yè)面的按鈕,也不得不打開頁(yè)面文件,冒著破壞系統(tǒng)的風(fēng)險(xiǎn)。但采用嚴(yán)格分層J2EE架構(gòu),則可完全避免這個(gè)問(wèn)題。對(duì)表現(xiàn)層的修改即使發(fā)生錯(cuò)誤,也絕對(duì)不會(huì)將錯(cuò)誤擴(kuò)展到業(yè)務(wù)邏輯層,更不會(huì)影響持久層。因此,采用J2EE分層架構(gòu),即使前期的開發(fā)效率稍微低一點(diǎn),但也是值得的。
— 需求的變更:以筆者多年的開發(fā)經(jīng)驗(yàn)來(lái)看,很少有軟件產(chǎn)品的需求從一開始就完全是固定的??蛻魧?duì)軟件需求,是隨著軟件開發(fā)過(guò)程的深入,不斷明晰起來(lái)的。因此,常常遇到軟件開發(fā)到一定程度時(shí),由于客戶對(duì)軟件需求發(fā)生了變化,使得軟件的實(shí)現(xiàn)不得不隨之改變。當(dāng)軟件實(shí)現(xiàn)需要改變時(shí),是否可以盡可能多地保留軟件的部分,盡可能少地改變軟件的實(shí)現(xiàn),從而滿足客戶需求的變更?答案是——采用優(yōu)秀的解耦架構(gòu)。這種架構(gòu)就是J2EE的分層架構(gòu),在優(yōu)秀的分層架構(gòu)里,控制層依賴于業(yè)務(wù)邏輯層,但絕不與任何具體的業(yè)務(wù)邏輯組件耦合,只與接口耦合;同樣,業(yè)務(wù)邏輯層依賴于DAO層,也不會(huì)與任何具體的DAO組件耦合,而是面向接口編程。采用這種方式的軟件實(shí)現(xiàn),即使軟件的部分發(fā)生改變,其他部分也盡可能不要改變。
注意:即使在傳統(tǒng)的硬件行業(yè),也有大量的接口規(guī)范。例如PCI接口、顯卡或者網(wǎng)卡,只要其遵守PCI的規(guī)范,就可以插入主板,與主板通信。至于這塊卡內(nèi)部的實(shí)現(xiàn),不是主板所關(guān)心的,這也正是面向接口編程的好處。假如需要提高電腦的性能,需要更新顯卡,只要更換另一塊PCI接口的顯卡,而不是將整臺(tái)電腦拋棄。如果一臺(tái)電腦不是采用各種接口組合在一起,而是做成整塊,那將意味著即使只需要更新網(wǎng)卡,也要放棄整臺(tái)電腦。同樣,對(duì)于軟件中的一個(gè)個(gè)組件,當(dāng)一個(gè)組件需要重構(gòu)時(shí),盡量不會(huì)影響到其他組件。實(shí)際上,這是最理想的情況,即使采用目前最優(yōu)秀的架構(gòu),也會(huì)有或多或少的影響,這也是軟件工程需要努力提高的地方。
技術(shù)的更新,系統(tǒng)重構(gòu):軟件行業(yè)的技術(shù)更新很快,雖然軟件行業(yè)的發(fā)展不快,但小范圍的技術(shù)更新特別快。一旦由于客觀環(huán)境的變化,不得不更換技術(shù)時(shí),如何保證系統(tǒng)的改變最小呢?答案還是選擇優(yōu)秀的架構(gòu)。
在傳統(tǒng)的Model 1的程序結(jié)構(gòu)中,只要有一點(diǎn)小的需求發(fā)生改變,將意味著放棄整個(gè)頁(yè)面。或者改寫。雖然前期的開發(fā)速度快,除非可以保證以后永遠(yuǎn)不會(huì)改變應(yīng)用的結(jié)構(gòu),否則不要采用Model 1的結(jié)構(gòu)。
采用Hibernate作為持久層技術(shù)的最大的好處在于:可以完全以面向?qū)ο蟮姆绞竭M(jìn)行系統(tǒng)分析、系統(tǒng)設(shè)計(jì)。
DAO模式需要為每個(gè)DAO組件編寫DAO接口,同時(shí)至少提供一個(gè)實(shí)現(xiàn)類,根據(jù)不同需要,可能有多個(gè)實(shí)現(xiàn)類。用Spring容器代替DAO工廠
通常情況下,引入接口就不可避免需要引入工廠來(lái)負(fù)責(zé)DAO組件的生成。Spring實(shí)現(xiàn)了兩種基本模式:?jiǎn)螒B(tài)模式和工廠模式。而使用Spring可以完全避免使用工廠模式,因?yàn)镾pring就是個(gè)功能非常強(qiáng)大的工廠。因此,完全可以讓Spring充當(dāng)DAO工廠。
由Spring充當(dāng)DAO工廠時(shí),無(wú)須程序員自己實(shí)現(xiàn)工廠模式,只需要將DAO組件配置在Spring容器中,由 ApplicationContext負(fù)責(zé)管理DAO組件的創(chuàng)建即可。借助于Spring提供的依賴注入,其他組件甚至不用訪問(wèn)工廠,一樣可以直接使用 DAO實(shí)例。
優(yōu)點(diǎn):
Struts跟Tomcat、Turbine等諸多Apache項(xiàng)目一樣,是開源軟件,這是它的一大優(yōu)點(diǎn)。使開發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。
除此之外,Struts的優(yōu)點(diǎn)主要集中體現(xiàn)在兩個(gè)方面:Taglib和頁(yè)面導(dǎo)航。Taglib是Struts的標(biāo)記庫(kù),靈活動(dòng)用,能大大提高開發(fā)效率。另外,就目前國(guó)內(nèi)的JSP開發(fā)者而言,除了使用JSP自帶的常用標(biāo)記外,很少開發(fā)自己的標(biāo)記,或許Struts是一個(gè)很好的起點(diǎn)。
關(guān)于頁(yè)面導(dǎo)航,我認(rèn)為那將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過(guò)一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。
缺點(diǎn):
Taglib是Struts的一大優(yōu)勢(shì),但對(duì)于初學(xué)者而言,卻需要一個(gè)持續(xù)學(xué)習(xí)的過(guò)程,甚至還會(huì)打亂你網(wǎng)頁(yè)編寫的習(xí)慣,但是,當(dāng)你習(xí)慣了它時(shí),你會(huì)覺(jué)得它真的很棒。
Struts將MVC的Controller一分為三,在獲得結(jié)構(gòu)更加清晰的同時(shí),也增加了系統(tǒng)的復(fù)雜度。
以上內(nèi)容為轉(zhuǎn)發(fā)! 個(gè)人認(rèn)為,為什么我們要去學(xué)習(xí)struts,是因?yàn)槲覀円私釳VC思想,在別的MVC框架中,思想有啦,在學(xué)習(xí)別的MVC框架,你會(huì)很明確自己要看什么,了解什么! 學(xué)習(xí)SSH我在使用SSH框架的時(shí)候,也被配置文件搞暈過(guò),我沒(méi)有別人聰明,世界上也沒(méi)有什么絕對(duì)的天才。SSH,讓我的分層思想,有啦進(jìn)一步增強(qiáng),什么面向組件的編程思想,什么面向服務(wù)的編程思想,什么面向切面的編程思想。。。。。?!,F(xiàn)在我們想學(xué)習(xí)什么,如果你是初學(xué)者,請(qǐng)打好基礎(chǔ)。。。。。。。。。。。。。。。。。。。。
posted on 2009-07-06 20:13
Werther 閱讀(638)
評(píng)論(0) 編輯 收藏