<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鐵手劍譜

    上善若水
    數(shù)據(jù)加載中……
    一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1)

    用java來建立一個很有價值的web 應(yīng)用不是一個簡單的任務(wù)。在架構(gòu)這個應(yīng)用時要考慮很多的因素和問題。從更高的層次來看,開發(fā)人員面臨著關(guān)于如何構(gòu)建用戶接口,何處駐留業(yè)務(wù)邏輯,以及如何實現(xiàn)數(shù)據(jù)持久性這些問題。這3層都有各自的問題需要回答。而每一層又需要實現(xiàn)那些技術(shù)?應(yīng)用如何設(shè)計來進行松散耦合并能進行靈活變更?應(yīng)用架構(gòu)是否允許某一層變更而不影響到其它的層次?應(yīng)用應(yīng)該如何處理容器一級的服務(wù)比如事務(wù)?

    在為你的應(yīng)用創(chuàng)建一個架構(gòu)之前有許多問題需要澄清。幸運的是,有很多開發(fā)者都意識到這個問題,并建立了很多框架來解決這些問題。一個良好的框架可以讓開發(fā)人員減輕重新建立解決復(fù)雜問題方案的負擔和精力;它可以被擴展以進行內(nèi)部的定制化;并且有強大的用戶社區(qū)來支持它。框架通常能很好的解決一個問題。然而,你的應(yīng)用是分層的,可能每一個層都需要各自的框架。僅僅解決UI問題并不意味著你能夠很好的將業(yè)務(wù)邏輯和持久性邏輯和UI 組件很好的耦合。例如,你不應(yīng)該使具有JDBC代碼的業(yè)務(wù)邏輯放入控制器之中,這不是控制器應(yīng)該提供的功能。一個UI 控制器應(yīng)該是輕量化的組件,由它代表對UI范圍之外的其它應(yīng)用層的服務(wù)調(diào)用。良好的框架自然地形成代碼分離的原則。更為重要的是,框架減輕了開發(fā)人員從頭構(gòu)建持久層代碼的精力,從而集中精力來應(yīng)用邏輯上,這對客戶端來說更為重要。

    本文討論了如何結(jié)合幾個著名的框架來達到松散耦合,如何設(shè)計你的架構(gòu),以及如何達到各個層次的一致性設(shè)計。面臨的挑戰(zhàn)是,將框架整合起來,以使每一層都向另外的層次以一種松散的方式來暴露接口,而不管底層功能使用的是什么技術(shù)。本文還討論整合3種著名開源框架的一種策略。對表現(xiàn)層,我們使用Struts;業(yè)務(wù)層使用Spring;對于持久層我們使用的是Hibernate。你盡可以取代這里的某個框架而使用你喜歡的框架已達到同樣的效果。圖1顯示了框架被整合起來時,從最高層次看到的視圖。

    clip_image001_0007.gif


     

    應(yīng)用層

    許多設(shè)計良好的web 應(yīng)用,可以被按職責分為四層。這些層次是表現(xiàn)層、持久層、業(yè)務(wù)層、和領(lǐng)域模型層。每一個層次都有其獨特的職責,不能把各自的功能與其它層次相混合。每一個應(yīng)用層都應(yīng)該和其它層隔離開來,但允許使用接口在層間進行通信。我們開始來看看每個層,并討論一下它們各自都應(yīng)該提供什么和不應(yīng)該提供什么。

    表現(xiàn)層

    一個典型的web 應(yīng)用的末端是表現(xiàn)層。許多Java 開發(fā)者都知道Struts 提供了什么東西。然而,太多時候,耦合代碼比如業(yè)務(wù)邏輯被放進org.apache.struts.Action中。所以,我們先總結(jié)一下Struts 之類的框架應(yīng)該提供什么。下面就是Struts 的職責所在:

    • 管理用戶的請求和響應(yīng)
    • 提供一個控制起來將調(diào)用委托到業(yè)務(wù)邏輯和其他上游處理
    • 將來自于拋出例外的其他層的例外處理到Struts Action 中
    • 組裝可以在視圖中表現(xiàn)的模型對象
    • 執(zhí)行UI 校驗

    下面是一些經(jīng)常可以使用Struts進行編碼但是不應(yīng)該和表現(xiàn)層關(guān)聯(lián)的事情:

    • 直接和數(shù)據(jù)庫交互,比如JDBC 調(diào)用
    • 與應(yīng)用相關(guān)的業(yè)務(wù)邏輯和校驗
    • 事務(wù)管理

    在表現(xiàn)層中引入這些類型的代碼將導(dǎo)致類型耦合和維護負擔。

    持久層

    一個典型Web應(yīng)用的另一端是持久層。這也是應(yīng)用中最容易很快失控的地方。開發(fā)者通常低估了自己構(gòu)建自己的持久層框架的挑戰(zhàn)。一個定制的,內(nèi)部開發(fā)的持久層不僅需要大量的開發(fā)時間,并且通常缺乏功能和難以管理。目前有許多解決這些問題的開源對象關(guān)系映射 (ORM) 框架。特別地, Hibernate 框架就允許Java中的對象-關(guān)系的持久性和查詢服務(wù)。Hibernate 對已經(jīng)熟悉了SQL 和JDBC API 的Java開發(fā)者來或具有中度的學(xué)習(xí)曲線。Hibernate 的持久對象基于POJO和Java 群集(collections)。此外,使用Hibernate 不和你的IDE接口。下面列出了你需要在持久性框架中編寫的代碼類型:

    • 查詢關(guān)系信息到對象中。Hibernate 是通過稱為HQL的OO查詢語言,或者使用更有表現(xiàn)能力的規(guī)則API,來完成這個工作的。除了使用對象而不是表,使用字段而不是列的方式,HQL非常類似于 SQL。也有一些新的特定的HQL 語言特征需要學(xué)習(xí);但是,它們是很容易理解和良好編寫的。HQL 是一種用于查詢對象的自然語言,而對象,只需要很少的學(xué)習(xí)曲線吧。.
    • 存儲、更新和刪除存儲在數(shù)據(jù)庫中的信息
    • 高級的對象關(guān)系映射框架比如Hibernate支持大部分主流SQL數(shù)據(jù)庫,它們支持父/子關(guān)系,事務(wù),繼承和多態(tài)。

    下面是應(yīng)該在持久層避免的一些事情:

    • 業(yè)務(wù)邏輯應(yīng)該置于應(yīng)用的更高層中。這里只允許數(shù)據(jù)訪問方法。
    • 不應(yīng)該使持久邏輯和表現(xiàn)邏輯耦合。避免表現(xiàn)組件如JSP或者基于servlet的類中的邏輯直接和數(shù)據(jù)訪問進行通信。通過將持久性邏輯隔離在其自己的層中,應(yīng)用將具有更加靈活的修改性而不影響到其他層的代碼。例如, Hibernate 可以使用其他持久框架和API代替,而不需要修改其它層中的代碼。

    業(yè)務(wù)層

    典型的Web應(yīng)用的中間組件一般是業(yè)務(wù)層和服務(wù)層。從編程的角度來說,service layer經(jīng)常被忽略。這種類型的代碼散布于UI表現(xiàn)層和持久層并不是不多見。這些都不是正確的地方因為它導(dǎo)致了緊密耦合的應(yīng)用和難以維護的代碼。幸運的是,大多數(shù)框架都解決了這個問題。這個空間內(nèi)最流行的兩個框架是Spring 和PicoContainer。它們都被視為是具有非常小的足跡(footprint)并且決定如何將你的對象整合在一起的微容器(microcontainer)。這些框架都建立在一種叫做依賴性注入(dependency injection) (也稱控制反轉(zhuǎn)(inversion of control:IOC))的簡單概念之上。我們將關(guān)注Spring中通過針對命名配置參數(shù)的bean屬性的setter 注入的使用。Spring 也允許一種更加高級的構(gòu)造器注入(constructor injection)形式作為setter injection 的可選替代。對象通過簡單的XML 文件進行連接,該配置文件包含對各種對象的引用,比如事務(wù)管理處理器(transaction management handler),對象工廠,包含業(yè)務(wù)邏輯的服務(wù)對象,以及數(shù)據(jù)訪問對象(DAO)。

    我們隨后會用一些例子來澄清Spring中使用這些改變的方式。

    業(yè)務(wù)層應(yīng)該負責下面的問題:

    • 處理應(yīng)用的業(yè)務(wù)邏輯和業(yè)務(wù)校驗
    • 管理事務(wù)
    • 允許與其他層進行交互的接口
    • 管理業(yè)務(wù)級對象之間的依賴性
    • 加入了表現(xiàn)和持久層之間的靈活性,以便它們不需要彼此進行直接通信
    • 從表現(xiàn)層暴露上下文給業(yè)務(wù)層以獲得業(yè)務(wù)服務(wù)
    • 管理從業(yè)務(wù)層到表現(xiàn)層的實現(xiàn)

    領(lǐng)域模型層

    最后,因為我們要解決實際的問題的web應(yīng)用,我們需要一套在不同的層間移動的對象。領(lǐng)域模型層包含的是表達實際業(yè)務(wù)對象的對象,比如Order, OrderLineItem, Product 等等。這一層允許能讓開發(fā)者不再構(gòu)建和維護不必要的數(shù)據(jù)傳輸對象DTO來匹配其領(lǐng)域?qū)ο蟆@纾?Hibernate允許你讀取數(shù)據(jù)庫信息到一個領(lǐng)域?qū)ο蟮膶ο髨D中,以便你可以在離線的情況下將其表現(xiàn)在UI層中。這些對象可以被更新并跨過表現(xiàn)層發(fā)送回去,然后進行數(shù)據(jù)庫更新。另外,你不再需要將對象轉(zhuǎn)變成DTO,因為它們在不同的層間移動時可能會丟失事務(wù)。這種模型允許Java 開發(fā)者能夠以O(shè)O風格的方式很自然的處理對象,而不用編寫額外的代碼。

    整合一個簡單的例子

    到此,應(yīng)該對各種層次和組件有一個高層的理解了罷。可以開始一些實踐了。再次說明。我們的例子整合了Struts, Spring, 和Hibernate 框架。每個框架都包含大量的內(nèi)容細節(jié),我們不會多述。我們的目的使用一個例子向你說明如何將它們整合在一起構(gòu)建一個優(yōu)雅的Web應(yīng)用架構(gòu)。實例將演示一個請求是如何得到各層的服務(wù)的。此應(yīng)用的用戶可以將一個訂單保存在數(shù)據(jù)庫中并且察看數(shù)據(jù)中的已有訂單。進一步的增強允許將用戶更新和刪除現(xiàn)有訂單。

    首先,我們將常見我們的領(lǐng)域?qū)ο螅驗樗鼈兪且透鲗訙贤ǖ摹_@些對象將允許我們能夠定義那些對象需要持久化,那些業(yè)務(wù)邏輯需要提供,以及應(yīng)該設(shè)計那些表現(xiàn)接口。接下來,我們將使用Hibernate 來為領(lǐng)域?qū)ο笈渲贸志脤雍投x對象關(guān)系映射。然后,我們將定義和配置我們的業(yè)務(wù)層。在完成這些組件后,我們將討論如何使用Spring將這些層關(guān)聯(lián)起來。最后,我們將提供一個表現(xiàn)層,它知道如何與業(yè)務(wù)服務(wù)層通信以及如何處理來自于其他層的例外。

    posted on 2005-04-29 11:42 鐵手 閱讀(16393) 評論(21)  編輯  收藏 所屬分類: Java企業(yè)架構(gòu)

    評論

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2005-04-30 10:20 Samuel

    并不一定需要struts,Spring的MVC就足夠用了,而且很好用
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2005-05-16 17:11 jony

    看了您的文章,對struts+spring+hibernate的概念有了一定的了解,但是還不知道怎么整合起來使用。
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2005-07-19 15:02 

    翻譯老外的文章,應(yīng)該注明啊
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2005-07-19 15:12 鐵手

    yes,from Oreiley
      回復(fù)  更多評論    

    # 有沒有學(xué)習(xí)這三者的一個完整例子 2005-07-28 17:49 liuliu

    有沒有學(xué)習(xí)這三者的一個完整例子,小的項目,我想通過實例來學(xué)習(xí)這些東西,希望能給指點一下,
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2005-07-29 09:27 鐵手

    You can learn it from APPFUSE,it can be found at Java.net
      回復(fù)  更多評論    

    # l 2005-11-15 14:49 f

    ddd
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2005-12-23 21:05 kingbit

    appfuse 中文網(wǎng)站
    http://www.kingbit.com/appfuse/index.php
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-01-23 11:07 小豬

    鐵手大哥:

    你的文章不錯,但是就是缺少個例子,你個例子
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-03-11 13:18 scorpional

    感覺比較生硬和抽象!
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-07-05 19:40 agou

    我還是有一點不明白Spring+struts 是否有必要。意義是什么
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-08-27 09:20 sp

    @jony
    能否有一個完整的例子,讓我們看看
    請問那里能看到一完事的例子
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-09-10 11:04 zj

    能否有一個完整的例子,讓我們看看
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-10-09 23:48 rainy21cn

    Struts較springMVC容易掌握,所以還是有其可取之處,開發(fā)成本相對更低一些,夏昕的spring開發(fā)向?qū)б灿腥吲浜鲜褂玫男畔ⅲ⑶抑v的很透徹,大家可以借鑒一下
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-11-09 14:14 野草[匿名]

    我以前做了一個很簡單的例子,不是很好,給大家參考.
    http://www.15913.com/download/file/10061017/15913.com-withlib.rar
    等做出更好的例子再貼出來.
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2006-11-16 17:08 maomao[匿名]

    很不錯,謝謝!
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2007-02-10 17:38 幻想~@@~

    不錯 辛苦了
    能給個事例嗎???
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2007-02-10 17:39 幻想~@@~

    看到了謝謝
    學(xué)習(xí)一下。。。
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2007-06-29 09:47 lwie

    很不錯的,我要學(xué)習(xí)了地方多呢
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1) 2007-06-30 00:18 blett

    很不錯的一篇文章......
    但還是有些地方不太明白,現(xiàn)在的spring框架功能越來越強大,從MVC到hibernate都包括了,而且封裝的比較完美,那么在在某種程度上來說SSH(STRUTS+SPRING+HIBERNATE)是否可以被spring一個框架可以替代呢?

    但在實際的項目中,這樣做的幾率好象很少;我們在一個web項目中如何最大限度的利用各種流行框架的優(yōu)點呢?

    鐵手能否指點一下?

    thx
      回復(fù)  更多評論    

    # re: 一種優(yōu)雅的流行架構(gòu):Struts+Spring+Hibernate (1)[未登錄] 2008-05-06 23:03 kk

    講得不錯,淺顯易懂,謝謝了!
      回復(fù)  更多評論    
    主站蜘蛛池模板: 国产免费久久精品99re丫y| 亚洲av专区无码观看精品天堂| 无码视频免费一区二三区| 91在线视频免费观看| 亚洲a∨无码一区二区| 亚洲成人高清在线观看| 国产亚洲综合一区柠檬导航| 国产精品极品美女免费观看| www.999精品视频观看免费| 免费国产叼嘿视频大全网站| 一级女人18片毛片免费视频| 亚洲精品精华液一区二区| 亚洲无人区视频大全| 亚洲AV日韩AV天堂一区二区三区| 亚洲国产精品日韩| 国产又黄又爽又猛的免费视频播放 | 亚洲中文字幕久久无码| 久久av无码专区亚洲av桃花岛| 综合亚洲伊人午夜网| avtt亚洲天堂| 啊v在线免费观看| 波多野结衣久久高清免费 | 国产精品亚洲不卡一区二区三区| 国产成人涩涩涩视频在线观看免费| 一个人免费观看视频www| 91黑丝国产线观看免费| 99re热精品视频国产免费| 国产精品白浆在线观看免费| 嫩草在线视频www免费看| 任你躁在线精品免费| 国产精品99精品久久免费| 国产午夜不卡AV免费| 久久国产精品国产自线拍免费| 在线观看免费视频网站色| 免费人成在线观看视频高潮| 天黑黑影院在线观看视频高清免费| 中国一级特黄的片子免费 | 在线观看免费精品国产| 国产成人高清精品免费鸭子 | 亚洲人成网站色7799| 亚洲国产欧洲综合997久久|