MVC三層模型(struts+spring+hibernate)總結

1 SSH在開發中的位置

現在J2EE的開源框架多的數不清楚,目前(已經、正在)比較流行的常用框架大概有struts,spring,hibernate,jsf,webwork,而 struts+spring+hibernate(SSH)這種輕量級架構被譽爲“黃金組合”。spring和hibernate更是被許多人認爲是未來五年內不會被淘汰的技術,猶如當年的struts,今天的開發中依然被廣泛採用。

2 爲什麼使用SSH  

其實,就算用Java建造一個不是很煩瑣的web應用,也不是件輕鬆的事情。 在構架的一開始就有很多事情要考慮。從高處看,擺在開發者面前有很多問題:要考慮是怎樣建立用戶接口?在哪裏處理業務邏輯? 怎樣持久化的數據。 而這三層構架中,每一層都有他們要仔細考慮的。 各個層該使用什麼技術?怎樣的設計能鬆散耦合還能靈活改變? 怎樣替換某個層而不影響整體構架?應用程序如何做各種級別的業務處理(比如事務處理)?

    構架一個Web應用需要弄明白好多問題。 幸運的是,已經有不少開發者已經遇到過這類問題,並且建立了處理這類問題的框架。 一個好框架具備以下幾點:減輕開發者處理複雜的問題的負擔("不重複發明輪子");內部有良好的擴展; 並且有一個支持它的強大的用戶團體。 好的構架一般有針對性的處理某一類問題,並且能將它做好(Do One Thing well)。 然而,你的程序中有幾個層可能需要使用特定的框架,已經完成的UI(用戶接口) 並不代表你也可以把你的業務邏輯和持久邏輯偶合到你的UI部分。 舉個例子,你不該在一個Controller(控制器)裏面寫JDBC代碼作爲你的業務邏輯, 這不是控制器應該提供的。 一個UI 控制器應該委派給其它給在UI範圍之外的輕量級組件。 好的框架應該能指導代碼如何分佈。 更重要的是,框架能把開發者從編碼中解放出來,使他們能專心於應用程序的邏輯(這對客戶來說很重要)。

他們裏面有很我優秀的設計理念及模式應用。比如, struts屬於MVC框架,關鍵是要了解MVC的概念及大致原理,掌握就很容易了;而hibernate屬於orm系統,屬於持久層的解決方案,同樣需要對ORM的概念及原理有一個總體的瞭解,必要時可以去查查EJB1及EJB2裏面用於持久層的Entity Bean的使用。而spring屬於應用程序框架,其核心是IOC容器以及AOP,把這兩個核心概念(也可稱爲大模式)瞭解以後,再加上一定的內力修爲,其它就都不難了。Spring中還集成了很多適用東西(不過這些東西80%的在某一個項目中可能一直用不上),比如對JDBC的封裝、自己的MVC、對動態語言的簡潔訪問等,這些你根據自己的項目情況來選擇學習,用到的時候再看看他的文檔,一個項目下來應該就能把握。

3 對於SSH的理解

在SSH框架中,struts用來解決MVC中顯示、請求控制部分,spring主要負責訪問數據庫DAO類的事務控制以及它被人稱譽的IOC思想在業務類中的恰當運用,hibernate主要是充當數據訪問層組件。由於spring對hibernate的良好支持,在DAO類主要由spring來完成,hibernate更多關注的應是O/R影射文件上的配置,如級聯關係,延遲加載等如何設置才能使效率更高。見圖1 (框架組合示意圖)

 

4 收穫和問題

4.1 actionform,PO,VO三對象的運用

討論最多的是actionform,PO,VO三對象的運用,本人傾向的觀點是:在SSH框架中,PO和VO可以不必區分,即業務層和持久層都可以使用hibernate產生的PO對象,我暫時把對象分成actionform和po兩種來分析,action 應該是actionform和po的分界點,po不能穿透業務層,突破action到達頁面顯示層,同樣actionform也不能突破action傳到後臺業務、持久層。(原因:po是持久對象,到達頁面後就脫離了session成爲無狀態(暫理解爲脫管態)的對象,而hibernate的持久對象是有狀態(包含數據庫主鍵)的,無狀態的對象傳到後臺在調用hibernate的保存方法時會出錯,一定要把無狀態的對象先轉化成持久態對象才能保存)在action中應該對兩對象進行轉化,轉化的方法目前我還沒發現有什麼非常好的方法(歡迎高手不惜賜教),最普通的就是用get(),set()方法,也可以使用struts提供的屬性複製方法BeanUtils類,但這個好象只支持單個類的轉化,對於集合對象不行,需要我們自己擴展。

4.2 spring事務管理

在配置spring的事務管理中,最好把事務控制配置在業務類上,而不要配置在DAO類(需要保證多個原子事務操作同時失敗回滾時這是一種解決辦法);

4.3 action如何獲取業務類

action中如何獲取業務類:寫一個父類action,在父類中通過spring的webapplicationcontent獲得業務類的實例。struts中的具體action繼承該父類,通過調用父類的getService()直接獲得業務類的實例。

4.4 理解AOP思想

深入理解AOP思想,我暫時感覺到的就是儘量面向接口編程,不管是域對象還是業務類或者是DAO類都設計出接口,在各方法中我們儘量傳入對象的接口,這對我們重用這些方法,擴展是很有好處的。

4.5 分頁處理 level

5 系統包劃分

這是一個真實項目的例子:

 

系統包劃分

包名

描述

com.projectname.domain

邏輯調用信息的載體Bean和hibernate的配置

com.projectname.lgc

邏輯層服務封裝的接口或抽象類

com.projectname.dao

數據庫訪問的抽象類

com.projectname.dao.impl

數據庫操作的具體實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章