[转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
首先這是現在最基本的分層方式,結合了SSH架構。modle層就是對應的數據庫表的實體類。Dao層是使用了Hibernate連接數據庫、操作數據庫(增刪改查)。Service層:引用對應的Dao數據庫操作,在這里可以編寫自己需要的代碼(比如簡單的判斷)。Action層:引用對應的Service層,在這里結合Struts的配置文件,跳轉到指定的頁面,當然也能接受頁面傳遞的請求數據,也可以做些計算處理。以上的Hibernate,Struts,都需要注入到Spring的配置文件中,Spring把這些聯系起來,成為一個整體。
?
一般java都是三層架構 數據訪問層(dao) 業務邏輯層(biz 或者services) 界面層(ui) action 是業務層的一部分,是一個管理器(總開關)(作用是取掉轉)(取出前臺界面的數據,調用biz方法,轉發到下一個action或者頁面)? 模型成(model)一般是實體對象(把現實的的事物變成java中的對象)作用是一暫時存儲數據方便持久化(存入數據庫或者寫入文件)而是作為一個包裹封裝一些數據來在不同的層以及各種java對象中使用?
dao是數據訪問層 就是用來訪問數據庫實現數據的持久化(把內存中的數據永久保存到硬盤中)
?
Dao主要做數據庫的交互工作 Modle 是模型 存放你的實體類 Service 做相應的業務邏輯處理 Action是一個控制器
?
簡單的說:
struts 控制用的
hibernate 操作數據庫的
spring 用解耦的
詳細的說:
STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Controller, 即 ActionServlet, 而 ActionServlet 的核心就是 Struts-confi g.xml. 主要控制邏輯關系的處理 .
hibernate 是數據持久化層 , 是一種新的對象、關系的映射工具 , 提供了從 Java 類到數據表的映射,也提供了數據查詢和恢復等機制 , 大大減少數據訪問的復雜度。把對數據庫的直接操作 , 轉換為對持久對象的操作 .
SPRING 是一個輕量級的控制反轉 (IoC) 和面向切面 (AOP) 的容器框架 , 面向接口的編程 , 由容器控制程序之間的(依賴)關系,而非傳統實現中,由程序代碼直接操控。這也就是所謂 “ 控制反轉 ” 的概念所在:(依賴)控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。依賴注入,即組件之間的依賴關系由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關系注入到組件之中
起到的主要作用是解耦
Struts 、 spring 、 Hibernate 在各層的作用
1 ) struts 負責 web 層 .
ActionFormBean 接收網頁中表單提交的數據,然后通過 Action 進行處理,再 Forward 到對應的網頁。
在 struts-config.xml 中定義 , ActionServlet 會加載。
2 ) spring 負責業務層管理,即 Service (或 Manager).
1 . service 為 action 提供統計的調用接口,封裝持久層的 DAO.
2 .可以寫一些自己的業務方法。
3 .統一的 javabean 管理方法
4 .聲明式事務管理
5. 集成 Hiberante
3 ) Hiberante ,負責持久化層,完成數據庫的 crud 操作
hibernate 為持久層,提供 OR/Mapping 。
它有一組 .hbm.xml 文件和 POJO, 是跟數據庫中的表相對應的。然后定義 DAO ,這些是跟數據庫打交道的類,它們會使用 PO 。
在 struts+spring+hibernate 的系統中,
對象的調用流程是: jsp-> Action - > Service ->DAO ->Hibernate 。
數據的流向是 ActionFormBean 接受用戶的數據, Action 將數據從 ActionFromBean 中取出,封裝成 VO 或 PO,
再調用業務層的 Bean 類,完成各種業務處理后再 forward 。而業務層 Bean 收到這個 PO 對象之后,會調用 DAO 接口方法,進行持久化操作。
簡單的流程
SSH框架都是取其優點的,
個人理解:
Hibernian 的最大好處就是根據數據庫的表反向生成實體類,并且還有關系在里面,還有就是它的對數據的操作也很方便。
Spring 我理解的就是程序員的春天,省去了在類里面new 對象的過程,把這個調用與被調用的關系直接展示到了配置文件里,做任何操作都變簡單了。
我就這么跟你說吧,
程序框架搭好,各種jar包導好后,開工了
就拿注冊功能來說 頁面只有兩個文本框 一個用戶名(uname) 一個密碼(pwd)
首先是action層:
它是負責在頁面和程序之間傳輸數據的,還有作用是做頁面跳轉。頁面由用戶填寫表單數據,點擊提交按鈕,頁面的表單數據由Hibernian自動封裝到該頁面表單所對應的ActionFrom(ActionFrom跟實體類不是一個東西,ActionFrom是頁面有什么值,我類里就寫什么屬性,是封裝表單數據用的。而實體類是完全按照數據庫的字段生成的,實體類可以當做ActionFrom用,但ActionFrom絕對不可以當做實體類用),這樣表單數據就以ActionFrom對象的形式在Action的點擊提交按鈕執行的那個方法里存在了,這個時候你需要的就是把表單數據存入數據庫中,但如果數據庫里并非只有頁面上的uname和pwd兩個字段,還有其他字段比如用戶狀態,那你就需要另行在程序里給該屬性賦值了,否則會報非空錯誤,這里的例子,頁面只有兩個文本框,數據庫也只有這兩個字段,就不必考慮那么多了,到這一步,action的功能告一段落了,接著是把數據傳入BIZ層。
Biz層(業務邏輯層):
它負責的是對數據的處理,比如網站功能是點卡銷售,你就需要在這個層里對點卡的打折啊其他的數學問題做操作了,在這個例子里,此層只做單純的數據傳遞作用,而后又到了DAO層。
Dao層(數據庫操作層):
它負責對數據向數據庫增刪改查的操作,不多解釋了。
以上例子,不使用spring的話,每個層之間的數據傳遞你都需要new一個調用該層數據的類的實例,而使用了spring的話,你需要做的就是把Dao 層和Biz層的每個類都寫一個接口類,接口類里寫實現類的方法,在調用的時候不new 對象,直接用對象點(.)方法就可以,別忘了對每個對象加上set/get方法。
Biz層例子
private saveMyScheduleDaoImpl smsDI; //類里定義寫接口(saveMyScheduleDaoImpl ),不要寫實現類,并且不new
set/get方法略·········
public List saveMySchedule(Schedule s)
{
return smsDI.saveMySchedule(s); //因為是接口的實例,所以要求該接口里必須寫上實現類的所有方法,這樣才能點(.)
}
這里只簡單寫了一個BIZ層的。
以上流程只是從頁面獲取值存入數據庫,是單向的Action層->Bzi層->Dao層的數據傳遞,Dao層->Biz層->Action層的數據傳遞和我剛剛將的一樣,就是反過來了。
到這一步的總結:
Dao層寫接口并且接口里寫實現類的所有方法。
Biz層寫接口并且接口里寫實現類的所有方法。調用Dao層方法只定義Dao層需要調用方法所屬的類的接口,而后添加get/set方法,再用該接口的沒有new的實例點(.)方法。
Action層同Biz層。
下面就是強大的spring的工作了-------依賴注入
所有改寫的死東西都寫完了,我們就差在配置文件里依賴注入了
找到spring的配置文件,先注Dao層,這個時候一定要注意一點,就是依賴注入的時候注的必須是實體類!! 而不是接口!!這是一種良好的變成習慣。
Dao層的依賴注入里綁定的是你在往工程加Spring的時候讓你填寫SessionFactory的那個值,配置文件上面應該會有這個bean的。
然后是Biz層的依賴注入,同樣也是注實體類,根據我這個例子里面會有smsDI需要綁定,這個時候填寫你注的Dao層的相對應的類的名字就行。
然后是Action層的依賴注入,大體同Biz層一樣。
依賴注入完畢后,你就可以盡情的去嗨配了。
轉載于:https://www.cnblogs.com/tiantangwater/p/5342106.html
總結
以上是生活随笔為你收集整理的[转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《冬至夜怀湘灵》第一句是什么
- 下一篇: uva 401.Palindromes