版權(quán)所有:(xiaodaoxiaodao)藍(lán)小刀 ?? xiaodaoxiaodao@gmail.com

http://www.aygfsteel.com/xiaodaoxiaodao/archive/2007/03/26/106522.html ??? ??

轉(zhuǎn)載請(qǐng)注明來源/作者

?

struts 學(xué)習(xí)筆記之MVC模式

?

struts 中的MVC架構(gòu)如下:

?

struts_mvc.JPG?

View :由JSPStruts自定義標(biāo)記庫、資源文件(MessageResources.properties)共同組成,通過ActionForm實(shí)現(xiàn)JSP表單的封裝,并映射到Model部分中JavaBean的相應(yīng)屬性中,完成用戶數(shù)據(jù)的封裝。

?

注意:關(guān)于ActionForm,有些人認(rèn)為它屬于Model層(仁者見仁,智者見智)。

事實(shí)上它不是Model,真正的Model應(yīng)該是一個(gè)封裝了業(yè)務(wù)邏輯的的對(duì)象。

ActionForm僅僅是一個(gè)form-bean,封裝了用戶提交的表單數(shù)據(jù)(物理View),可以在其中進(jìn)行一些非業(yè)務(wù)邏輯的驗(yàn)證,并沒有真正的映射到模型數(shù)據(jù),因?yàn)榕c層的關(guān)系比較密切,所以實(shí)際上它應(yīng)該算是View層(邏輯View)。

?

Action 處理器對(duì)象可以直接對(duì)ActionForm進(jìn)行讀寫,而不再需要和requestresponse對(duì)象進(jìn)行數(shù)據(jù)交互。通過ActionForm組件對(duì)象實(shí)現(xiàn)了對(duì)ViewModel之間交互的支持。M模型層,原則上來說和業(yè)務(wù)邏輯有關(guān)的東西都在這里處理。

?

Controller :接收客戶端的request,進(jìn)行業(yè)務(wù)邏輯處理,response到客戶端。在StrutsController功能由圖中ActionServletActionMapping對(duì)象構(gòu)成:核心是一個(gè)Servlet類型的對(duì)象ActionServlet(在struts-config.xml中配置),實(shí)際上是一個(gè)前端控制器(Front Controller)。ActionServlet根據(jù)ActionMapping對(duì)象的定義跳轉(zhuǎn)到不同的Action,每個(gè)ActionMapping對(duì)象實(shí)現(xiàn)了一個(gè)requestAction對(duì)象之間的映射。

?

Controller層負(fù)責(zé)流程的控制,在處理Model層與View層之間的交互的同時(shí),又將兩者分離開來,從而實(shí)現(xiàn)了MVC模式。Model層包含了應(yīng)用的核心部分,業(yè)務(wù)邏輯數(shù)據(jù)存取View層負(fù)責(zé)應(yīng)用的界面。

?

在上面的圖中看到Action位于Controller層,但也有很多人把它歸于Model層,實(shí)際上 Action 僅僅描述"做什么",與"如何做"Model)關(guān)系不大,把它歸于 Controller 層比較合適。

?

Model :一般Model層可以劃分為三部分:公共入口業(yè)務(wù)邏輯Bussiness Logic),數(shù)據(jù)持久化DAO+JavaBean)。

Spring+Hibernate的架構(gòu)中,M可以用 Spring Bussiness Interface + Bussiness Implement)表示業(yè)務(wù)邏輯Hibernate實(shí)現(xiàn)數(shù)據(jù)持久化


?

?

PO/POJO/BO/DTO/VO的區(qū)別

---------------------------------------------------------

PO persistent object持久對(duì)象

1 .有時(shí)也被稱為Data對(duì)象,對(duì)應(yīng)數(shù)據(jù)庫中的entity,可以簡(jiǎn)單認(rèn)為一個(gè)PO對(duì)應(yīng)數(shù)據(jù)庫中的一條記錄。

2 .在hibernate持久化框架中與insert/delet操作密切相關(guān)。

3 PO中不應(yīng)該包含任何對(duì)數(shù)據(jù)庫的操作。

?

---------------------------------------------------------

POJO plain ordinary java object 無規(guī)則簡(jiǎn)單java對(duì)象

一個(gè)中間對(duì)象,可以轉(zhuǎn)化為PODTOVO

?

1 POJO持久化之后==PO

(在運(yùn)行期,由Hibernate中的cglib動(dòng)態(tài)把POJO轉(zhuǎn)換為POPO相對(duì)于POJO會(huì)增加一些用來管理數(shù)據(jù)庫entity狀態(tài)的屬性和方法。PO對(duì)于programmer來說完全透明,由于是運(yùn)行期生成PO,所以可以支持增量編譯,增量調(diào)試。)

2 POJO傳輸過程中==DTO

3 POJO用作表示層==VO

?

PO VO都應(yīng)該屬于它。

?

----------------------------------------------------------

BO business object 業(yè)務(wù)對(duì)象

封裝業(yè)務(wù)邏輯為一個(gè)對(duì)象(可以包括多個(gè)PO,通常需要將BO轉(zhuǎn)化成PO,才能進(jìn)行數(shù)據(jù)的持久化,反之,從DB中得到的PO,需要轉(zhuǎn)化成BO才能在業(yè)務(wù)層使用)。

關(guān)于BO主要有三種概念

1 、只包含業(yè)務(wù)對(duì)象的屬性;

2 、只包含業(yè)務(wù)方法;

3 、兩者都包含。

在實(shí)際使用中,認(rèn)為哪一種概念正確并不重要,關(guān)鍵是實(shí)際應(yīng)用中適合自己項(xiàng)目的需要。

?

----------------------------------------------------------

VO value object值對(duì)象 / view object表現(xiàn)層對(duì)象

1 .主要對(duì)應(yīng)頁面顯示(web頁面/swtswing界面)的數(shù)據(jù)對(duì)象。

2 .可以和表對(duì)應(yīng),也可以不,這根據(jù)業(yè)務(wù)的需要。

?

:在struts中,用ActionFormVO,需要做一個(gè)轉(zhuǎn)換,因?yàn)?span lang="EN-US">PO是面向?qū)ο蟮模?span lang="EN-US">ActionForm是和view對(duì)應(yīng)的,要將幾個(gè)PO要顯示的屬性合成一個(gè)ActionForm,可以使用BeanUtilscopy方法。

?

----------------------------------------------------------

DTO TO Data Transfer Object數(shù)據(jù)傳輸對(duì)象

1 .用在需要跨進(jìn)程或遠(yuǎn)程傳輸時(shí),它不應(yīng)該包含業(yè)務(wù)邏輯。

2 .比如一張表有100個(gè)字段,那么對(duì)應(yīng)的PO就有100個(gè)屬性(大多數(shù)情況下,DTO 內(nèi)的數(shù)據(jù)來自多個(gè)表)。但view層只需顯示10個(gè)字段,沒有必要把整個(gè)PO對(duì)象傳遞到client,這時(shí)我們就可以用只有這10個(gè)屬性的DTO來傳輸數(shù)據(jù)到client,這樣也不會(huì)暴露server端表結(jié)構(gòu)。到達(dá)客戶端以后,如果用這個(gè)對(duì)象來對(duì)應(yīng)界面顯示,那此時(shí)它的身份就轉(zhuǎn)為VO

?

----------------------------------------------------------

DAO data access object數(shù)據(jù)訪問對(duì)象

1 .主要用來封裝對(duì)DB的訪問(CRUD操作)。

2 .通過接收Business層的數(shù)據(jù),把POJO持久化為PO

?

?