1. 程式人生 > >java web 中持久層、業務層、表現層、域模型層理解

java web 中持久層、業務層、表現層、域模型層理解

許多設計良好的web應用,可以被按職責分為四層。這些層次是表現層、持久層、業務層、和域模型層。每一個層次都有其獨特的職責,不能把各自的功能與其它層次相混合。每一個應用層都應該和其它層隔離開來,但允許使用介面在層間進行通訊。我們開始來看看每個層,並討論一下它們各自都應該提供什麼和不應該提供什麼。 
這裡寫圖片描述 
對錶現層,我們使用 Struts ;業務層使用 Spring ;對於持久層我們使用的是 Hibernate 。你儘可以取代這裡的某個框架而使用你喜歡的框架已達到同樣的效果。上圖顯示了框架被整合起來時,從最高層次看到的檢視。 
ref:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html

1. 持久層(Persistence layer–DAO–hibernate)

所謂持久,就是把資料儲存到可以永久保持的儲存裝置當中。一般來說,持久更為直接的理解就是對資料庫的各種操作,如增加,刪除,修改,查詢,更新等操作。 
持久層,就是把持久的動作封裝成一個獨立的層,這是為了降低功能程式碼之間的關聯。建立一個更清晰的抽象,提高程式碼的內聚力,降低程式碼的耦合度,從而增強程式碼的要勞動局生和可重用性。 
持久層可以封裝資料訪問細節,為大部分業務邏輯提供面向物件的API。它是一種鬆散耦合,使持久化不依賴於義憤資料庫和上層業務邏輯來實現。我們在設計程式碼的時候,應該避免在業務邏輯程式碼中混雜資料訪問程式碼。 
DAO,即持久層資料訪問物件。利用來抽象和封裝所有對資料來源的訪問,由DAO來管理各種資料來源的連線以便於檢索和儲存資料。DAO一般由業務物件,資料訪問物件,資料來源和值物件組成。通過DAO實現了資料訪問邏輯的抽象與實現細節的封裝,只對外提供一個抽象化的資料訪問API。我們通過呼叫API的方法就能實現對資料庫的操作。而不必再去理解具體是怎麼對資料庫進行操作的。這樣由於業務操作和資料訪問實現分離,也使得開發人員的專業劃分成為可能。 
在DAO中業務物件僅僅包含與本領域相關的邏輯物件和演算法就可以了。針對不同的資料庫提供各自的資料訪問程式碼,可以通過定義一個呼叫介面,針對該介面實現不同資料的資料訪問。這樣就可以避免對具體實現的依賴,在以後資料庫變更時,不用改實現的程式碼。 
Dao層是可以使用Hibernate連線資料庫、操作資料庫(簡單的增刪改查)。其和DAO設計模式還不完全是一個概念,我們此處的Dao層中不包含實體類的描述,這部分寫在域模型層: 
DAO設計模式一般分為幾個類: 
1.VO(Value Object):一個用於存放網頁的一行資料即一條記錄的類,比如網頁要顯示一個使用者的資訊,則這個類就是使用者的類。 
2.DatabaseConnection:用於開啟和關閉資料庫。 
3.DAO介面:用於宣告對於資料庫的操作。 
4.DAOImpl:必須實現DAO介面,真實實現DAO介面的函式,但是不包括資料庫的開啟和關閉。 
5.DAOProxy:也是實現DAO介面,但是隻需要藉助DAOImpl即可,但是包括資料庫的開啟和關閉。 
6.DAOFactory:工廠類,含有getInstance()建立一個Proxy類。 
ref:

http://blog.csdn.net/xiazdong/article/details/6895465/

2. 表現層(UI Layer –Presentation Layer–struts-action層 )

action層負責選擇不同的展示UI,為了保證系統能夠在不同的UI介面做移植,action不要涉及業務邏輯。 
一個典型的web 應用的末端是表現層。許多Java 開發者都知道Struts提供了什麼東西。然而,太多時候,耦合程式碼比如業務邏輯被放進org.apache.struts.Action中。所以,我們先總結一下Struts之類的框架應該提供什麼。下面就是Struts 的職責所在: 
1.管理使用者的請求和響應 
2.提供一個控制起來將呼叫委託到業務邏輯和其他上游處理 
3.將來自於丟擲例外的其他層的例外處理到Struts Action 中 
4.組裝可以在檢視中表現的模型物件 
5.執行UI 校驗 
下面是一些經常可以使用Struts進行編碼但是不應該和表現層關聯

的事情: 
1.直接和資料庫互動,比如JDBC 呼叫 
2.與應用相關的業務邏輯和校驗 
3.事務管理 
在表現層中引入這些型別的程式碼將導致型別耦合和維護負擔。

3. 業務層(Bussiness Layer –service-spring-beanFactory)

Service層:引用對應的Dao資料庫操作,在這裡可以編寫自己需要的程式碼(比如簡單的判斷)。 
service層是呼叫各種dao的業務操作,比如你有一個業務是 新增,然後修改。 那麼你分別呼叫dao的新增和修改操作,包括裡面的一些資料轉換,邏輯判斷都放到service層,dao只是單純的增刪改查。 而且事務一般會放到service層。 
其中Service層和DAO層由於可能都會對資料庫進行操作,其具體區別為:

  1. dao和service對應

    一般情況下,Hibernate DAO只操作一個POJO物件,因此一個DAO對應一個POJO物件。 Service層是為了處理包含多個POJO物件(即對多個表的資料操作)時,進行事務管理(宣告式事務管理)。Service層(其介面的實現類)被注入多個DAO物件,以完成其資料操作。

  2. Service之有無 
    這一點我的看法未必正確,我的腦海現在有兩種構建業務層的模式: 
    模式1是Service + DAO,即DAO中只做CRUD及類似的簡單操作(稱之為功能點,不包含業務邏輯),Service中通過呼叫一個或多個DAO中的功能點來組合成為業務邏輯.Service的數量應該由功能模組來決定。 
    在這種模型中業務邏輯是放在Service中的,事務的邊界也應該在Service中控制. 當然,直接在Service中控制事務會引入非業務邏輯的程式碼,幸好Spring的AOP可以解決這個問題,這也是引入Spring的原因之一. 
    如果說到缺點,就在於對某些物件的操作就是簡單的CRUD,Service層顯得累贅. 模式2是Service + BO, 而BO = DAO + 業務方法, 在原先DAO的基礎上新增業務方法,形成BO物件。需要注意的是BO中的業務方法往往是針對一個實體物件的,如果需要跨越多個實體物件,則方法應該放在Service中。 
    舉例來說,一個簡單的銀行帳戶管理系統,建立帳戶這個BO物件,裡面可以有修改密碼,取錢等業務方法(不難看出,這些方法都只對單個帳戶物件進行操作)。現在需要新增一個轉賬方法,就應該放在Service中。 
    這裡Service和BO的關係是什麼樣的呢?再舉一例:以國家行政機關為例:糧食局負責收糧,賣種子等,建設部負責審批土地買賣,建設公路等,這都是行政部分份內的事兒。突然某地發了水災,救災時需要糧食局開倉放糧,建設部修建臨時房屋,如何協調兩個部門?就需要成立專門的救災委員會,由救災委員會出面對兩個部分的資源進行調撥。這裡兩個部分就是BO,而救災委員會就是Service。不知我的意思是否表達準確了,呵呵。 模式1的在劃分Service和DAO時界限清晰,但會帶來一些無必要的程式碼。 
    模式2的劃分相對複雜,然而可以提高編碼效率。 
    當然小規模的應用中,沒有Service,完全是DAO或BO也是可以接受的。

  3. Service和DAO的介面之有無

介面是一種契約,它可以有多種實現。所以介面之有無取決於具體實現是否需要多樣化。如果鐵定一種DAO或一種Service只有一種實現,那麼抽象出介面的意義不大。然而一些大型應用或許需要DAO和Service的多種實現(比如上面例子中的帳戶DAO,可能需要一種Hibernate實現、一種CMP實現和一種JDO實現),為了向上一層隱藏具體實現類,需要採用介面。

隱藏具體實現類的建立過程,這有兩種方法:一是實用工廠方法,代價是程式碼量大(每個DAO和Service一個工廠)。二是使用Spring的IoC,實現依賴注入,不需要寫額外的程式碼,這也是引入Spring的理由之二。 
ref:http://blog.csdn.net/njujmj/article/details/5202915

4. 域模型層(Domain model)

軟體開發要幹什麼: 
反映真實世界要自動化的業務流程 
解決現實問題 
領域Domain 
Domain特指軟體關注的領域 
在不能充分了解業務領域的情況下是不可能做出一個好的軟體 
Domain層是整個系統的核心層,該層維護一個使用面向物件技術實現的領域模型,幾乎全部的業務邏輯會在該層實現。 
Domain層包含: 
1.Entity(實體): 
有一類物件擁有唯一識別符號能夠跨越系統的生命週期甚至能超越軟體系統的一系列的延續性和識別符號這樣的物件稱為實體。 
2.ValueObject(值物件) 
對某個物件是什麼不感興趣,只關心它擁有的屬性用來描述領域的特殊方面、且沒有識別符號的一個物件,叫做值物件,能被簡單的建立和丟棄,生命週期中不會被持久化值物件可以被共享,值物件應該不可變 
3.Domain Event(領域事件) 
4.Repository(倉儲)等 
ref:http://blog.csdn.net/johnstrive/article/details/16805121

轉載自:http://blog.csdn.net/zcf396720/article/details/51372580

相關推薦

java web 持久業務表現模型理解

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

java-web分層2-Bean和業務

上次我們說的是Dao層,那麼這次我們來看javaBean層和業務層要實現怎樣的功能,之前說的是dao層的任務是和資料庫進行交換,可以在某個具體的實體類的DaoImpl對資料進行操作,比如說我們某一個數據表裡面取到資料了,那麼現在我們是之間傳送到前臺,還是還要經過其他的層,我

Java Web的ActionDaoServiceModel學習筆記-----阿冬專欄

SSH 框架學習之初識Java中的Action、Dao、Service、Model-----------------------------學到就要查,自己動手動腦!!! 首先這是現在最基本的分層方式,結合了SSH架構。modle層就是對應的資料庫表的實體類。Da

Java Web的servletjspsession等的用法。

1、當伺服器響應客戶端之後,request和response會立即銷燬,在客戶端去訪問伺服器的時候就開啟Servlet,當Servlet開啟之後就會產生request和response。 2、訪問Servlet的6種方式:通過位址列輸入網址提交訪問(直接在瀏覽器上寫網址訪問

tomcat 與 java weburl路徑的配置以及使用規則詳情(長期更新)

root 每一個 ava 目錄 clip ima 文件夾 logs 需要 首先我們看一下在myeclipse中建立的java web項目的結構 在這裏我們需要註意這個webroot也就是我們在tomcat裏的webapp裏面的應用 之所以每一個項目都有這個webroot

java-web生成文檔(一)

all 檢查 download com ftl 緩沖 getc cor tps 基於Java的解決方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各種方式,其實在從Office 2003開始,就可以將Office文檔轉換成XML文件

Java web常見編碼亂碼問題(二)

catalina 轉換 alt str 檢測 內容 tom 拼搏 image 根據上篇記錄Java web中常見編碼亂碼問題(一), 接著記錄亂碼案例:   案例分析:   2、輸出流寫入內容或者輸入流讀取內容時亂碼(內容中有中文)   原因分析:     a、 如果是

MySQL 查詢語句自己定義的中文內容在Java Web 顯示為問號

variable select 關閉 程序 自己 bsp from sel 技術   Java Web 端做查詢時,性別字段存的是數字,1代表男,2代表女,取數據時將性別轉為漢字顯示在頁面,sql語句如下,結果發生了問題 select a.emp_id,a.emp_n

java web編碼亂碼問題

查詢 頁面 問題 調試過程 都是 clas image 進行 web項目   b/s 模式的java web項目中,不管是前端與後端。開發過程中,調試過程中,運行過程都經常遇到亂碼問題。再從現象出發,分析一下問題:    1,項目導進來,頁面中的註釋等非西歐文字都是亂碼。先

Java Web的mapper,service,controller,model

目錄 一、SSM(Spring+SpringMVC+MyBatis)架構 1、 SSM的工作原理 (1) SSM系統架構 (2) SSM程式執行流程 2、 MSCM是什麼及其作用 (1) controller (2) model  (3) service

Java Web提交表單之後跳轉到WebContent目錄下的子目錄裡的jsp檔案

最近在做一個系統,需要完成登入動能進行跳轉到另一個頁面。在這個專案裡面,我把 jsp,css,js檔案都統一放在 WebContent 目錄下的一個 WebPage 裡面。 按照以前的習慣,寫好了 servlet 之後在 web.xml 裡面完成配置,但由於平時 jsp 檔案都是直接

Java web 的中文亂碼問題總結

一、亂碼由來:        大家都知道一句話:“亂碼是因為編碼和解碼方式不一致造成的”。 那麼,我們為什麼要編碼呢?        那就要從計算機底層是如何表示人類語言(

Java Web使用Spark MLlib訓練的模型

PMML是一種通用的配置檔案,只要遵循標準的配置檔案,就可以在Spark中訓練機器學習模型,然後再web介面端去使用。目前應用最廣的就是基於Jpmml來載入模型在javaweb中應用,這樣就可以實現跨平臺的機器學習應用了。 訓練模型 首先在spark MLlib中使用mllib包下的邏輯迴歸

Java Web的jsp技術

     在動態網頁開發中,經常需要動態生成html內容,如果使用servlet來實現html頁面資料的改變會導致程式十分臃腫。為了克服這些缺點,Oracle(Sun)公司推出了jsp技術。     JSP全名是Java Server Page,它是建立在S

Java WebgetAttribute和getParameter的區別

1.getAttribute是取得jsp中 用setAttribute設定的attribute  2.parameter得到的是string;attribute得到的是object  3.request.getParameter()方法傳遞的資料,會從Web客戶端傳到Web伺服器

RabbitMQ在java-web的簡單應用

RabbitMQ的使用場景 MQ,是Message Queue(訊息佇列)的簡寫。簡而言之,RabbitMQ就是將訊息儲存在佇列中。 在專案的實際開發過程中,可以將一些無需即時返回結果且耗時的操作提取出來,進行非同步處理。這種處理方式能夠大大節省伺服器的請求響應

Java Web application(應用級) session(會話級) request(請求級)

  在JavaWeb 中實現資料共享往往通過定義屬性的方法來實現,而什麼是屬性呢?它類似於Hashmap中的鍵值對,有屬性名和屬性值作為設定屬性方法的引數,而在其他的地方通過屬性名去獲取屬性的值。   而定義定義不同級別的值,資料共享的範圍是有區別的,接下來我就詳細的介紹下

java web傳遞get方式與post方式下中文亂碼問題

首先確定編譯器建立網頁的中文編碼: windows-preference-web-css/jsp/html,將其中的 encoding設定為ISO10646/Unicode (UTF-8) post

Java Web Servlet 中文亂碼解決方法

Servlet中文亂碼問題解決方法 import java.io.*; import java.net.URLEncoder; import javax.servlet.*; import javax

Java Web 使用 js 的ajax

很多時候大家多喜歡使用jquery的ajax從資料庫後端獲取動態資料,如 $.ajax({ url:'想要的路徑', data:{'想要上傳的資料':'需要鍵值對形式'}, dataType:'json', success:function(result){