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