表現(xiàn)層、持久層、業(yè)務(wù)層

          為了實(shí)現(xiàn)web層(struts)和持久層(Hibernate)之間的松散耦合,我們采用業(yè)務(wù)代表(Business Delegate)和DAO(Data Access Object)兩種模式。DAO模式為了減少業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯之間的耦合,當(dāng)一個持久曾框架被應(yīng)用時,該模式將會減少業(yè)務(wù)對象和該框架之間的耦合,這樣我們可以不修改業(yè)務(wù)對象而選擇不同的持久層框架的實(shí)現(xiàn)。實(shí)際上在DAO模式中包含兩種結(jié)構(gòu)模式:橋(Bridge)模式和適配器(Adaptor)模式。?

          對表現(xiàn)層,我們使用 Struts ;業(yè)務(wù)層使用 Spring ;對于持久層我們使用的是 Hibernate 。你盡可以取代這里的某個框架而使用你喜歡的框架已達(dá)到同樣的效果。下圖顯示了框架被整合起來時,從最高層次看到的視圖。

          clip_image001_0007.gif

          應(yīng)用層

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

          表現(xiàn)層

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

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

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

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

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

          持久層

          ??? 一個典型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接口。下面列出了你需要在持久性框架中編寫的代碼類型:

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

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

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

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

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

          posted on 2007-04-08 03:17 金家寶 閱讀(24147) 評論(6)  編輯  收藏 所屬分類: 其他輔助基礎(chǔ)

          評論

          # re: 表現(xiàn)層、持久層、業(yè)務(wù)層 2007-04-25 09:00 henry

          哇塞,寫的不錯啊。  回復(fù)  更多評論   

          # re: 表現(xiàn)層、持久層、業(yè)務(wù)層 2007-12-13 16:22 yatata

          謝謝作者的文章  回復(fù)  更多評論   

          # re: 表現(xiàn)層、持久層、業(yè)務(wù)層 2009-10-21 14:12 kqogje

          能不能舉例說下啊,比如說用戶注冊模塊,哪些是業(yè)務(wù)層要做的工作,哪些是持久層要做的工作?  回復(fù)  更多評論   

          # re: 表現(xiàn)層、持久層、業(yè)務(wù)層 2012-11-09 11:30 dont

          小提示一下,第一段中“當(dāng)一個持久曾框架被應(yīng)用時,”錯別字“曾”...繼續(xù)學(xué)習(xí)中  回復(fù)  更多評論   

          # re: 表現(xiàn)層、持久層、業(yè)務(wù)層 2014-05-25 11:06 美惠寶999

          能舉例說明就更好了  回復(fù)  更多評論   

          # re: 表現(xiàn)層、持久層、業(yè)務(wù)層 2014-07-23 16:26 打了個

          搭搭撒撒  回復(fù)  更多評論   

          主站蜘蛛池模板: 囊谦县| 古田县| 琼结县| 长治市| 宁安市| 沿河| 银川市| 蚌埠市| 酒泉市| 西峡县| 乌审旗| 汉寿县| 和静县| 香港| 定安县| 腾冲县| 西林县| 开江县| 仪陇县| 兰考县| 望奎县| 北安市| 汉沽区| 开江县| 桃源县| 上饶市| 正镶白旗| 濉溪县| 商洛市| 汝城县| 河北区| 泸溪县| 阿合奇县| 富平县| 新干县| 德格县| 嘉义县| 集贤县| 宜宾市| 从江县| 永昌县|