ssh最基本分層機構功能與關係
首先這是現在最基本的分層方式,結合了SSH架構。
modle層就是對應的資料庫表的實體類。
Dao層是使用了Hibernate連線資料庫、操作資料庫(增刪改查)。
Service層:引用對應的Dao資料庫操作,在這裡可以編寫自己需要的程式碼(比如簡單的判斷)。
Action層:引用對應的Service層,在這裡結合Struts的配置檔案,跳轉到指定的頁面,當然也能接受頁面傳遞的請求資料,也可以做些計算處理。
以上的Hibernate,Struts,都需要注入到Spring的配置檔案中,Spring把這些聯絡起來,成為一個整體。
對於struts2專案的基本框架,action從service介面得到資料負責處理業務與過濾業務,把資料給網頁。
service是定義介面,serviceimpl是定義介面的實現,是功能程式碼編寫地方,它從DaoImpl介面中得到資料,而dao是對資料庫進行操作的程式碼。
簡而言之,action呼叫serviceimpl,service實現serviceimpl,serviceimpl呼叫daoimpl,dao實現daoimpl。你看看struts2三層結構就知道怎麼回事了
Spring的作用:
在SSH框假中spring充當了管理容器的角色。我們都知道Hibernate用來做持久層,因
為它將JDBC做了一個良好的封裝,程式設計師在與資料庫進行互動時可以不用書寫大量的SQL語
句。Struts是用來做應用層的,他它負責呼叫業務邏輯serivce層。所以SSH框架的流程大致
是:Jsp頁面----Struts------Service(業務邏輯處理類)---Hibernate(左到右)struts
負責控制Service(業務邏輯處理類),從而控制了Service的生命週期,這樣層與層之間的
依賴和強,屬於耦合。這時,使用spring框架就起到了控制Action物件(Strus中的)和
Service類的作用,兩者之間的關係就鬆散了,Spring的Ioc機制(控制反轉和依賴注入)正
是用在此處。
Spring的Ioc(控制反轉和依賴注入)
控制反轉:就是由容器控制程式之間的(依賴)關係,而非傳統實現中,由程式程式碼直
接操控。
依賴注入:元件之間的依賴關係由容器在執行期決定 ,由容器動態的將某種依賴關係注
入到元件之中。
從上面我們不難看出:從頭到尾Action僅僅是充當了Service的控制工具,這些具體的
業務方法是怎樣實現的,他根本就不會管,也不會問,他只要知道這些業務實現類所提供的
方法介面就可以了。而在以往單獨使用Struts框架的時候,所有的業務方法類的生命週期,
甚至是一些業務流程都是由Action來控制的。層與層之間耦合性太緊密了,既降低了資料訪
問的效率又使業務邏輯看起來很複雜,程式碼量也很多。,Spring容器控制所有Action物件和
業務邏輯類的生命週期,由與上層不再控制下層的生命週期,層與層之間實現了完全脫耦,
使程式執行起來效率更高,維護起來也方便。
使用Spring的第二個好處(AOP應用):
事務的處理:
在以往的JDBCTemplate中事務提交成功,異常處理都是通過Try/Catch 來完成,而在
Spring中。Spring容器集成了TransactionTemplate,她封裝了所有對事務處理的功能,
包括異常時事務回滾,操作成功時資料提交等複雜業務功能。這都是由Spring容器來管理,
大大減少了程式設計師的程式碼量,也對事務有了很好的管理控制。Hibernate中也有對事務的管
理,hibernate中事務管理是通過SessionFactory建立和維護Session來完成。而Spring對
SessionFactory配置也進行了整合,不需要在通過hibernate.cfg.xml來對
SessionaFactory進行設定。這樣的話就可以很好的利用Sping對事務管理強大功能。避免
了每次對資料操作都要現獲得Session例項來啟動事務/提交/回滾事務還有繁瑣的
Try/Catch操作。這些也就是Spring中的AOP(面向切面程式設計)機制很好的應用。一方面使
開發業務邏輯更清晰、專業分工更加容易進行。另一方面就是應用Spirng AOP隔離降低了
程式的耦合性使我們可以在不同的應用中將各個切面結合起來使用大大提高了程式碼重用度。
Hiberante的作用:
第一:資料庫連線不需要我們自己來管理,如開啟和關閉(優點吧)
第二:Hibernate對原來的SQL語句進行了封裝,以前寫很多SQL語句,現在你在儲存的時候直接可以用 SAVE(物件)來實現了。(節省程式碼吧)
第三:原來是對錶操作,現在是對物件操作,想法上是不是更好呢?都是物件。
Struts的作用:
1.獲取表單內容,並組織生成引數物件
2.根據請求的引數轉發請求給適當的控制器
3.在控制器中呼叫業務介面
4.將業務介面返回的結果包裝起來發送給指定的檢視,並由檢視完成處理結果的展現
5.做一些簡單的校驗或是國際化工作
簡單的說:
struts 控制用的
hibernate 操作資料庫的
spring 用解耦的
詳細的說:
STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Controller, 即 ActionServlet, 而 ActionServlet 的核心就是 Struts-confi g.xml. 主要控制邏輯關係的處理 .
hibernate 是資料持久化層 , 是一種新的物件、關係的對映工具 , 提供了從 Java 類到資料表的對映,也提供了資料查詢和恢復等機制 , 大大減少資料訪問的複雜度。把對資料庫的直接操作 , 轉換為對持久物件的操作 .
SPRING 是一個輕量級的控制反轉 (IoC) 和麵向切面 (AOP) 的容器框架 , 面向介面的程式設計 , 由容器控制程式之間的(依賴)關係,而非傳統實現中,由程式程式碼直接操控。這也就是所謂 “ 控制反轉 ” 的概念所在:(依賴)控制權由應用程式碼中轉到了外部容器,控制權的轉移,是所謂反轉。依賴注入,即元件之間的依賴關係由容器在執行期決定,形象的來說,即由容器動態的將某種依賴關係注入到元件之中
起到的主要作用是解耦
Struts 、 spring 、 Hibernate 在各層的作用
1 ) struts 負責 web 層 .
ActionFormBean 接收網頁中表單提交的資料,然後通過 Action 進行處理,再 Forward 到對應的網頁。
在 struts-config.xml 中定義 <action-mapping>, ActionServlet 會載入。
2 ) spring 負責業務層管理,即 Service (或 Manager).
1 . service 為 action 提供統計的呼叫介面,封裝持久層的 DAO.
2 .可以寫一些自己的業務方法。
3 .統一的 javabean 管理方法
4 .宣告式事務管理
5. 整合 Hiberante
3 ) Hiberante ,負責持久化層,完成資料庫的 crud 操作
hibernate 為持久層,提供 OR/Mapping 。
它有一組 .hbm.xml 檔案和 POJO, 是跟資料庫中的表相對應的。然後定義 DAO ,這些是跟資料庫打交道的類,它們會使用 PO 。
在 struts+spring+hibernate 的系統中,
物件的呼叫流程是: jsp-> Action - > Service ->DAO ->Hibernate 。
資料的流向是 ActionFormBean 接受使用者的資料, Action 將資料從 ActionFromBean 中取出,封裝成 VO 或 PO,
再呼叫業務層的 Bean 類,完成各種業務處理後再 forward 。而業務層 Bean 收到這個 PO 物件之後,會呼叫 DAO 介面方法,進行持久化操作。
spring:Aop管理事務控制,IoC管理各個元件的耦合,DaoTemplate作為常規持久層的快速開發模板!
struts:控制層Action,頁面標籤和Model資料,呼叫業務層
Hibernate:負責資料庫和物件的對映,負責DAO層(Data Access Object:資料訪問)
spring整合hibernate和struts,只要在配好了applicationContext.xml,在struts的action中直接呼叫就可以了。hibernate訪問資料庫的操作都在spring中實現了,spring的呼叫又在stuts的action中實現了。這個ssh框架就連到了一起……
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影射檔案上的配置,如級聯關係,延遲載入等如何設定才能使效率更高。
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