Java Web 三層架構詳解

來源:互聯網
上載者:User

王飛翔_

java 三層架構ssh

一個spring2.5+hibernate3.2+struts2.0組合架構,使用spring IoC來管理應用 所有bean,包括struts2 action,充分發揮了spring輕量級架構 優勢。

 摘 要: 針對當前Web應用程式開發面臨的問題,結合目前比較流行的開源架構Spring、Struts和Hibernate,提出了一種開發J2EE Web應用的輕量級解決方案,以協助開發人員在短期內搭建結構清晰、可複用性好、維護方便的Web應用程式。並且,通過案例具體說明了如何將這一方案應用到實際項目中。
關鍵詞: J2EE  MVC  Struts  Spring  Hibernate

    大型企業級Web應用系統的開發通常要求有一個良好的軟體架構、便於協作開發和擴充升級,而傳統的開發模式不能很好地滿足這些要求。本文針對當前Web應用程式開發面臨的問題,結合目前比較流行的開源架構SSH(Spring、Struts、Hibernate),提出一種開發J2EE 企業級Web應用的輕量級解決方案,並通過案例具體說明如何將這一方案應用到實際項目中。
1 架構技術
    著名的軟體大師Ralph Johnson對架構(Framework)進行了如下的定義: 架構是整個系統或系統的一部分的可重用設計,由一組抽象的類及其執行個體間的相互作用方式組成[1] 。
    架構一般具有隨插即用的可重用性、成熟的穩定性以及良好的團隊協作性。J2EE複雜的多層結構決定了大型的J2EE項目需要運用架構和設計模式來控制軟體品質。目前,市場上出現了一些商業的、開源的基於J2EE的應用程式框架,其中主流的架構技術有:基於MVC模式的Struts架構和基於IoC模式的 Spring架構以及對象/關係映射架構Hibernate等。
1.1  展示層架構Struts
     Struts是一個在JSP Model2基礎上實現的MVC架構,主要分為模型(Model)、視圖(Viewer)和控制器(Controller)三部分,其主要的設計理念是通過控制器將表現邏輯和商務邏輯解耦,以提高系統的可維護性、可擴充性和可重用性[2] 。Struts架構的體繫結構1所示。

  下面就圖1所示的體繫結構圖分析Struts架構中的MVC組件。
    (1)視圖:視圖部分主要由JSP頁面組成,其中沒有流程邏輯、商務邏輯和模型資訊,只有標記。Struts自身包含了一組標記庫(TagLib),這也是Struts的精華之一,靈活運用它們可以簡化JSP頁面的代碼,提高開發效率。
    (2)控制器:Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有來自用戶端的請求並根據設定檔(struts-config.xml)中的定義將控制轉移到適當的Action對象。
    (3)模型:Struts沒有定義具體Model層的實現,Model層通常是和商務邏輯緊密相關的,有持續化的要求。目前在商業領域和開源世界,都有一些優秀的工具可以為Model層的開發提供便利。
1.2  商務邏輯層架構Spring
    Spring是一個解決了許多J2EE開發中常見問題並能夠替代EJB技術的強大的輕量級架構。這裡所說的輕量級指的是 Spring架構本身,而不是指Spring只能用於輕量級的應用開發。Spring的輕盈體現在其架構本身的基礎結構以及對其他應用工具的支援和裝配能力。與EJB這種龐然大物相比,Spring可使程式研發人員把各個技術層次之間的風險降低。
    Spring架構的核心是控制翻轉IoC(Inversion of Control)/依賴注入DI(Dependence Injection)機制。IoC是指由容器中控制組件之間的關係(這裡,容器是指為組件提供特定服務和支援人員的一個標準化的運行時的環境)而非傳統實現中由程式碼直接操控,這種將控制權由程式碼到外部容器的轉移,稱為“翻轉”[3] 。DI是對IoC更形象的解釋,即由容器在運行期間動態地將依賴關係(如構造參數、構造對象或介面)注入到組件之中[3] 。 Spring採用設值注入(使用Setter方法實現依賴)和構造子注入(在構造方法中實現依賴)的機制,通過設定檔管理組建的協作對象,建立可以構造組件的IoC容器。這樣,不需要編寫原廠模式、單例模式或者其他構造的方法,就可以通過容器直接擷取所需的業務組件。Spring架構的結構2所示。

 

   Spring架構由七個定義明確的模組組成,且每個模組或組件都可以單獨存在,或者與其他一個或多個模組聯合實現。Spring Core Container是一個用來管理業務組件的IoC容器,是Spring應用的核心;Spring DAO和Spring ORM不僅提供資料訪問的抽象模組,還整合了對Hibernate、JDO和iBatis等流行的對象關係映射架構的支援模組,並且提供了緩衝串連池、交易處理等重要的服務功能,保證了系統的效能和資料的完整性;Sprnig Web模組提供了Web應用的一些抽象封裝,可以將Struts、Webwork等Web架構與Spring整合成為適用於自己的解決方案。
    Spring架構可以成為企業級應用程式一站式的解決方案,同時它也是模組化的架構,允許開發人員自由地挑選適合自己應用的模組進行開發。Spring架構式是一個松耦合的架構,架構的部分耦合度被設計為最小,在各個層次上具體選用哪個架構取決於開發人員的需要。
1.3 資料持久層架構Hibernate
    O/R mapping技術是為瞭解決關係型資料庫和物件導向的程式設計之間不匹配的矛盾而產生的。Hibernate是目前最為流行的O/R mapping架構,它在關係型資料庫和Java對象之間做了一個自動對應,使得程式員可以以非常簡單的方式實現對資料庫的操作。Hibernate工作原理3所示。

 

   Hibernate通過對JDBC的封裝,向程式員屏蔽了底層的資料庫操作,使程式員專註於OO程式的開發,有助於提高開發效率。程式員訪問資料庫所需要做的就是為持久化對象編製xml對應檔[4] 。
    底層資料庫的改變只需要簡單地更改初始化設定檔(hibernate.cfg.xml或者hibernate.properties)即可,不會對應用程式產生影響。
     Hibernate有自己的物件導向的查詢語言HQL,HQL功能強大,支援目前大部分主流的資料庫,如Oracle、DB2、MySQL、 Microsoft SQL Server等,是目前應用最廣泛的O/R映射工具。Hibernate為快速開發應用程式提供了底層的支援。
2 基於SSH組合架構的Web應用程式模型設計與實現
2.1 整合SSH的新型J2EE架構
  前面分析了基於J2EE的三種架構技術,下面通過整合以上三種架構技術來對傳統的J2EE Web開發模型加以改進,以形成一種新的、輕量型的J2EE架構。
  整合SSH架構 的系統架構圖 4所示,系統從職責上分為四層:展示層、商務邏輯層、資料持久層和域模組層。其中使用Struts作為系統的整體基礎架構,負責MVC的分離,在 Struts架構的模型部分,利用Hibernate架構對持久層提供支援,業務層用Spring支援。具體做法是:用物件導向的分析方法根據需求提出一些模型,將這些模型實現為基本的Java對象,然後編寫基本的DAO介面,並給出Hibernate的DAO實現,採用Hibernate架構實現的
DAO類來實現Java類與資料庫之間的轉換和訪問,最後由Spring完成商務邏輯。

 

  系統的基本商務程序是:在展示層中,首先通過JSP頁面實現互動介面,負責傳送請求(Request)和接收響應(Response),然後Struts根據設定檔 (struts-config.xml)將ActionServlet接收到的Request委派給相應的Action處理。在業務層中,管理服務元件的 Spring IoC容器負責向Action提供業務模型(Model)組件和該組件的協作對象資料處理(DAO)組件完成商務邏輯,並提供交易處理、緩衝池等容器組件以提升系統效能和保證資料的完整性。而在持久層中,則依賴於Hibernate的對象化映射和資料庫互動,處理DAO組件請求的資料,並返回處理結果。
  採用上述開發模型,不僅實現了視圖、控制器與模型的徹底分離,而且還實現了商務邏輯層與持久層的分離。這樣無論前端如何變化,模型層只需很少的改動,並且資料庫的變化也不會對前端有所影響,大大提高了系統的可複用性。而且由於不同層之間耦合度小,有利於團隊成員並行工作,大大提高了開發效率。
2.2 基於SSH架構 的Web應用系統的實現
  下面將通過一個實際的系統來展示如何進行基於SSH架構 的Web應用開發。該系統是為某通訊公司運營部開發的一個問答式系統,功能類似於百度知道和新浪愛問。由於系統的模組較多,下面就以一個使用者管理模組為例來說明系統的開發實現過程,並將按照資料持久層、商務邏輯層、展示層的順序說明系統構建過程。
  (1)資料持久層
  資料持久層由Java對象持久化類和Data Access Objects(DAO)組成。每個資料庫表都對應著一個持久化對象,這樣就給予了開發人員使用OO思想設計和開發的便利,同時也屏蔽了具體的資料庫和具體的資料表、欄位,消除了對資料庫操作的寫入程式碼在重用性上的弊端。使用者資訊表的部分結構如表1所示。

  Hibernate通過映射(Mapping)檔案將對象(Object)與關係型資料(Relational)相關聯,因此需要編寫和資料庫表相對應的Java持久化類以及對應的對應檔。有了Java持久化類後就可以在此基礎上實現資料訪問類。在Spring架構中,資料訪問類可以從輔助類 HibernateDaoSupport繼承,這極大地方便了Hibernate架構在Spring中的使用,相應的部分代碼如下:
      public class UserDao 
          extends HibernateDaoSupport {
      public int add(User user) {
        return Integer.ParseInt(this.getHibernateTemplate().save(user).toString());
      }
      public List findAll() {
        return this.getHibernateTemplate().loadAll(User.class);
      }
      }
  具體的Hibernate資料來源、session工廠、交易管理、緩衝串連池等功能都由業務層的Spring容器提供。
  (2)商務邏輯層
  商務邏輯層由Spring架構支援,提供了處理商務邏輯的服務元件。開發人員需要對業務對象建模,抽象出業務模型並封裝在Model組件中。由於資料持久層實現了Java持久化類並且封裝了Data Access Objects(DAO),因此可以在Model組件中方便地調用DAO組件來存取資料。Spring的IoC容器負責統一管理Model組件和DAO組件以及Spring所提供的交易處理、緩衝串連池等服務元件。
  在使用者管理模組中,通過業務建模建立了使用者模型UserService類,封裝了對使用者的許可權管理以及積分管理等功能。UserService類通過調用資料訪問類UserDao實現對使用者資料的操作。這些組件的關係將通過配置Spring架構的applicationContext.xml聯絡起來,設定檔的主要內容如下:
      

   

      
     (3)展示層
     展示層結合JSP和Struts的TagLib庫處理顯示功能,利用ActionServlet將請求(*.do)映射到相應的Action,並由Action調用商務邏輯的服務元件,然後根據處理結果跳轉到Forword對象指定的響應頁面。
     商務程序的部署由struts-config.xml完成。下面以一個顯示所有使用者資訊的請求(ListUser.do)為例來說明設定檔的使用。
      
     
      
      
    
    基於J2EE的Web應用以其層次性、平台無關性的優勢已經逐漸成為了電子商務、電子政務主要的解決方案。本文針對傳統的J2EE Web應用開發的弊端,提出了一種利用輕量級架構來快速搭建Web應用的解決方案,並且通過其在實際項目中的應用,證明了採用此方案可以協助開發人員在短時間內建立結構清晰、可重用性好、維護擴充方便的Web應用程式。
參考文獻
[1]  GAMMA E, HELM R, JOHNSON R, et al. Design patterns:Elements of reusable object-oriented software[M]. Addison  Wesley, 1994.
[2]  孫衛琴.精通Struts:基於MVC的Java Web設計與開發[M]. 北京:電子工業出版社,2004.
[3]  JOHNSON R, HOELLER J, ARENDSEN A, et al. Java/J2EE application framework reference document. V1.1.

 2004.
[4]  徐長盛,戴超.一種快速開發Web應用程式方法的研究[J]. 電腦工程與設計,2004,(12):2237-2239.
[5]  夏昕,曹曉鋼,唐勇.深入淺出Hibernate[M]. 北京:電子工業出版社,2005.
[6]  JOHNSON R.Expert one-on-one J2EE design and development[M]. 魏海萍譯.北京:電子工業出版社,2003.

在用ssh 開發web應用時,需要對產生 各個類檔案進行組織,下面就對一個可行 目錄方案進行介紹:

 

譬如應用中有一個使用者管理模組,則在公用包下建立一個user包,如該公用包可以為com.simon.oa,

在user包下包括如下子包

1、controler包

該包放置各種struts action。

2、dao包

該包放置各類dao(data access object),也就是放置對資料庫訪問 實作類別,在用myeclipse中 “Hibernate Reverse Engineering”進行反向操作時在某一個目錄中就會產生對應某個表 DAO,產生後可將該DAO拖到dao包中。在某些應用中將DAO作為介面,在該介面中包括所有對資料庫 操作方法,然後在dao包建立一個hibernate包,在hibernate包中放置對DAO介面
實現,譬如:UserDAO介面有一個實作類別為UserDaoImpl,將該類放置到hibernate包中,實際 開發傾向於後一種方式,因為對這個DAO介面可以實現spring IoC操作。(不知道myeclipse對此是怎麼考慮 ,這個問題讓我糾纏了很久,誤將DAO理解成一個能夠進行實際操作 類,而不是一個介面,以後開發要注意 )

3、model包

該包中放置hibernate反向工程產生 bean和該bean對應 .hbm.xml檔案。

4、service包

該包放置業務操作類,譬如使用者服務類,一般情況將該使用者操作類提取一個介面,然後在service包下產生一個impl包,在impl包中才放置使用者操作介面 實作類別。該使用者介面實作類別中調用DAO介面對資料庫進行操作,而調用該實作類別 方法在struts action中。

5、vo包(value object)

vo包中 中包括struts中使用 POJO及actionform等資訊。

VO:  Value Object
DTO: Data Transfer Object
個人理解VO和DTO是類似 東西,原則上VO和DTO只有Public Fields,主要用於進程之間資料傳遞 問題,VO和DTO不會傳遞到展示層,在業務層就會被吸收。但看到很多人在建立VO和DTO時,也含有Setter,Getter屬性和一些其它 輔助方法,這也無可厚非,我自己也不能確定這對不對。

#技術交流

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.