Web應用分層及其各層職責

應用層

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

表現層

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

1. 管理用戶的請求和響應
2. 提供一個控制起來將調用委託到業務邏輯和其他上游處理
3. 將來自於拋出例外的其他層的例外處理到Struts Action 中
4. 組裝可以在視圖中表現的模型對象
5. 執行UI 校驗

下面是一些經常可以使用Struts進行編碼但是不應該和表現層關聯的事情:

1. 直接和數據庫交互,比如JDBC 調用
2. 與應用相關的業務邏輯和校驗
3. 事務管理

在表現層中引入這些類型的代碼將導致類型耦合和維護負擔。

持久層

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

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

下面是應該在持久層避免的一些事情:

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

業務層

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

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

業務層應該負責下面的問題:

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

領域模型層

最後,因爲我們要解決實際的問題的web應用,我們需要一套在不同的層間移動的對象。領域模型層包含的是表達實際業務對象的對象,比如Order, OrderLineItem, Product等等。這一層允許能讓開發者不再構建和維護不必要的數據傳輸對象DTO來匹配其領域對象。例如,Hibernate允許你讀取數據庫信息到一個領域對象的對象圖中,以便你可以在離線的情況下將其表現在UI層中。這些對象可以被更新並跨過表現層發送回去,然後進行數據庫更新。另外,你不再需要將對象轉變成DTO,因爲它們在不同的層間移動時可能會丟失事務。這種模型允許Java開發者能夠以OO風格的方式很自然的處理對象,而不用編寫額外的代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章