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