Java Web 三層架構詳解

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  Hibernatejava

    大型企業級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所示。web

 


   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所示。spring

 


   Hibernate經過對JDBC的封裝,向程序員屏蔽了底層的數據庫操做,使程序員專一於OO程序的開發,有助於提升開發效率。程序員訪問數據庫所須要作的就是爲持久化對象編制xml映射文件[4] 。
    底層數據庫的改變只須要簡單地更改初始化配置文件(hibernate.cfg.xml或者hibernate.properties)便可,不會對應用程序產生影響。
     Hibernate有本身的面向對象的查詢語言HQL,HQL功能強大,支持目前大部分主流的數據庫,如Oracle、DB二、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對象持久化類和數據訪問對象(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持久化類而且封裝了數據訪問對象(DAO),所以能夠在Model組件中方便地調用DAO組件來存取數據。Spring的IoC容器負責統一管理Model組件和DAO組件以及Spring所提供的事務處理、緩衝鏈接池等服務組件。
  在用戶管理模塊中,經過業務建模建立了用戶模型UserService類,封裝了對用戶的權限管理以及積分管理等功能。UserService類經過調用數據訪問類UserDao實現對用戶數據的操做。這些組件的關係將經過配置Spring框架的applicationContext.xml聯繫起來,配置文件的主要內容以下:
       
session

    
      
     (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應用時,須要對生成 各個類文件進行組織,下面就對一個可行 目錄方案進行介紹:app


 

譬如應用中有一個用戶管理模塊,則在公共包下創建一個user包,如該公共包能夠爲com.simon.oa,

在user包下包括以下子包

一、controler包

該包放置各類struts action。

二、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理解成一個可以進行實際操做 類,而不是一個接口,之後開發要注意 )

三、model包

該包中放置hibernate反向工程生成 bean和該bean對應 .hbm.xml文件。

四、service包

該包放置業務操做類,譬如用戶服務類,通常狀況將該用戶操做類提取一個接口,而後在service包下生成一個impl包,在impl包中才放置用戶操做接口 實現類。該用戶接口實現類中調用DAO接口對數據庫進行操做,而調用該實現類 方法在struts action中。

五、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屬性和一些其它 輔助方法,這也無可厚非,我本身也不能肯定這對不對。

相關文章
相關標籤/搜索