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