Java Web基礎(chǔ)——Action+Service +Dao三層的功能劃分

1. Action/Service/DAO簡(jiǎn)介:
Action是管理業(yè)務(wù)(Service)調(diào)度和管理跳轉(zhuǎn)的。
Service是管理具體的功能的。
Action只負(fù)責(zé)管理,而Service負(fù)責(zé)實(shí)施。
DAO只完成增刪改查,雖然可以1-n,n-n,1-1關(guān)聯(lián),模糊、動(dòng)態(tài)、子查詢(xún)都可以。但是無(wú)論多么復(fù)雜的查詢(xún),dao只是封裝增刪改查。至于增刪查改如何去實(shí)現(xiàn)一個(gè)功能,dao是不管的。
總結(jié)這三者,通過(guò)例子來(lái)解釋?zhuān)?br> Action像是服務(wù)員,顧客點(diǎn)什么菜,菜上給幾號(hào)桌,都是ta的職責(zé);
Service是廚師,action送來(lái)的菜單上的菜全是ta做的;
Dao是廚房的小工,和原材料打交道的事情全是ta管。
相互關(guān)系是,小工(dao)的工作是要滿(mǎn)足廚師(service)的要求,廚師要滿(mǎn)足服務(wù)員(action)轉(zhuǎn)達(dá)的客戶(hù)(頁(yè)面用戶(hù))的要求,服務(wù)員自然就是為客戶(hù)服務(wù)嘍。
現(xiàn)在最基本的分層方式,結(jié)合了SSH架構(gòu)。Model層就是對(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ù)操作。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è)整體。


2. 三大框架Struts/Hibernate/Spring
簡(jiǎn)單地說(shuō):
** Struts——控制用的;**
** Hibernate——操作數(shù)據(jù)庫(kù)的;**
** Spring——解耦用的。**
詳細(xì)地說(shuō):
Struts在SSH框架中起控制的作用,其核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,主要控制邏輯關(guān)系的處理。
Hibernate是數(shù)據(jù)持久化層,是一種新的對(duì)象、關(guān)系的映射工具,提供了從Java類(lèi)到數(shù)據(jù)表的映射,也提供了數(shù)據(jù)查詢(xún)和恢復(fù)等機(jī)制,大大減少數(shù)據(jù)訪問(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)行期決定,形象地說(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中定義<action-mapping>,ActionServlet會(huì)加載。
(2) Spring負(fù)責(zé)業(yè)務(wù)層管理,即Service(或Manager)。
Service為action提供統(tǒng)計(jì)的調(diào)用接口,封裝持久層的DAO;
可以寫(xiě)一些自己的業(yè)務(wù)方法;
統(tǒng)一的Javabean管理方法;
聲明式事務(wù)管理;
集成Hibernate。

(3)Hibernate,負(fù)責(zé)持久化層,完成對(duì)數(shù)據(jù)庫(kù)的crud操作。提供OR/Mapping。它由一組.hbm.xml文件和POJO,是跟數(shù)據(jù)庫(kù)中的表相對(duì)應(yīng)的。然后定義DAO,這些是跟數(shù)據(jù)庫(kù)打交道的類(lèi),它們會(huì)使用PO。

3. 框架業(yè)務(wù)邏輯分析:
在Struts + Spring + Hibernate的系統(tǒng)中,
對(duì)象的調(diào)用流程是:JSP—Action—Service—DAO—Hibernate
數(shù)據(jù)的流向是:ActionFormBean接受用戶(hù)的數(shù)據(jù),Action將數(shù)據(jù)從ActionFormBean中取出,封裝成VO或PO,再調(diào)用業(yè)務(wù)層的Bean類(lèi),完成各種業(yè)務(wù)處理后再Forward。而業(yè)務(wù)層Bean收到這個(gè)PO對(duì)象之后,會(huì)調(diào)用DAO接口方法,進(jìn)行持久化操作。
SSH框架的優(yōu)點(diǎn):
Hibernate的最大好處就是根據(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)單了。
簡(jiǎn)單流程舉例說(shuō)明:
程序框架搭建好,并且把各種jar包導(dǎo)入后,就開(kāi)始進(jìn)行業(yè)務(wù)邏輯分析——
假設(shè)一個(gè)最基本的注冊(cè)功能:頁(yè)面有兩個(gè)文本框,一個(gè)用戶(hù)名(username)和一個(gè)密碼(password)。以QQ注冊(cè)網(wǎng)頁(yè)說(shuō)明,這里以昵稱(chēng)和密碼為代表進(jìn)行舉例。


** 首先是action層:它是負(fù)責(zé)在頁(yè)面和程序之間傳輸數(shù)據(jù)的,還有作用是做頁(yè)面跳轉(zhuǎn)。頁(yè)面由用戶(hù)填寫(xiě)表單數(shù)據(jù),點(diǎn)擊提交按鈕,頁(yè)面的表單數(shù)據(jù)由Hibernate自動(dòng)封裝到該頁(yè)面表單所對(duì)應(yīng)的ActionFrom(ActionFrom跟實(shí)體類(lèi)不是一個(gè)東西,ActionFrom是頁(yè)面有什么值,類(lèi)里就寫(xiě)什么屬性,是用來(lái)封裝表單數(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í),Action的功能告一段落,接著是把數(shù)據(jù)傳入BIZ層。
** BIZE層(業(yè)務(wù)邏輯層):
負(fù)責(zé)的是對(duì)數(shù)據(jù)的處理。如果沒(méi)有數(shù)據(jù)處理任務(wù)的話(huà),此層只做單純的數(shù)據(jù)傳遞作用,而后又到了DAO層。
** DAO層(數(shù)據(jù)庫(kù)操作層):**負(fù)責(zé)對(duì)數(shù)據(jù)向數(shù)據(jù)庫(kù)增刪改查的操作。
在該注冊(cè)的框架中,如果不使用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方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (一)Struts、Spring、Hibernate、Mybatis框技術(shù) 1.Struts2.0有幾種標(biāo)簽庫(kù) 【...
    獨(dú)云閱讀 3,379評(píng)論 0 62
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,706評(píng)論 18 399
  • spring mvc 工作機(jī)制(原理): DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制...
    java大濕兄閱讀 1,983評(píng)論 5 24
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,012評(píng)論 0 11
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139

友情鏈接更多精彩內(nèi)容