版權所有:(xiaodaoxiaodao)藍小刀
??
xiaodaoxiaodao@gmail.com
http://m.tkk7.com/xiaodaoxiaodao/archive/2007/03/26/106522.html
???
??
轉載請注明來源/作者
?
struts
學習筆記之MVC模式
?
struts
中的MVC架構如下:
?
?
View
:由JSP、Struts自定義標記庫、資源文件(MessageResources.properties)共同組成,通過ActionForm實現JSP表單的封裝,并映射到Model部分中JavaBean的相應屬性中,完成用戶數據的封裝。
?
注意:關于ActionForm,有些人認為它屬于Model層(仁者見仁,智者見智)。
事實上它不是Model,真正的Model應該是一個封裝了業務邏輯的的對象。
而ActionForm僅僅是一個form-bean,封裝了用戶提交的表單數據(物理View),可以在其中進行一些非業務邏輯的驗證,并沒有真正的映射到模型數據,因為與層的關系比較密切,所以實際上它應該算是View層(邏輯View)。
?
Action
處理器對象可以直接對ActionForm進行讀寫,而不再需要和request、response對象進行數據交互。通過ActionForm組件對象實現了對View和Model之間交互的支持。M模型層,原則上來說和業務邏輯有關的東西都在這里處理。
?
Controller
:接收客戶端的request,進行業務邏輯處理,response到客戶端。在Struts中Controller功能由圖中ActionServlet和ActionMapping對象構成:核心是一個Servlet類型的對象ActionServlet(在struts-config.xml中配置),實際上是一個前端控制器(Front Controller)。ActionServlet根據ActionMapping對象的定義跳轉到不同的Action,每個ActionMapping對象實現了一個request到Action對象之間的映射。
?
注
:Controller層負責流程的控制,在處理Model層與View層之間的交互的同時,又將兩者分離開來,從而實現了MVC模式。Model層包含了應用的核心部分,業務邏輯和數據存取。View層負責應用的界面。
?
在上面的圖中看到Action位于Controller層,但也有很多人把它歸于Model層,實際上
Action
僅僅描述"做什么",與"如何做"(Model)關系不大,把它歸于
Controller
層比較合適。
?
Model
:一般Model層可以劃分為三部分:公共入口,業務邏輯(Bussiness Logic),數據持久化(DAO+JavaBean)。
在Spring+Hibernate的架構中,M可以用
Spring
(Bussiness Interface + Bussiness Implement)表示業務邏輯,Hibernate實現數據持久化。
?
?
附
:PO/POJO/BO/DTO/VO的區別
---------------------------------------------------------
PO
:persistent object持久對象
1
.有時也被稱為Data對象,對應數據庫中的entity,可以簡單認為一個PO對應數據庫中的一條記錄。
2
.在hibernate持久化框架中與insert/delet操作密切相關。
3
.PO中不應該包含任何對數據庫的操作。
?
---------------------------------------------------------
POJO
:plain ordinary java object 無規則簡單java對象
一個中間對象,可以轉化為PO、DTO、VO。
?
1
.POJO持久化之后==〉PO
(在運行期,由Hibernate中的cglib動態把POJO轉換為PO,PO相對于POJO會增加一些用來管理數據庫entity狀態的屬性和方法。PO對于programmer來說完全透明,由于是運行期生成PO,所以可以支持增量編譯,增量調試。)
2
.POJO傳輸過程中==〉DTO
3
.POJO用作表示層==〉VO
?
PO
和VO都應該屬于它。
?
----------------------------------------------------------
BO
:business object 業務對象
封裝業務邏輯為一個對象(可以包括多個PO,通常需要將BO轉化成PO,才能進行數據的持久化,反之,從DB中得到的PO,需要轉化成BO才能在業務層使用)。
關于BO主要有三種概念
1
、只包含業務對象的屬性;
2
、只包含業務方法;
3
、兩者都包含。
在實際使用中,認為哪一種概念正確并不重要,關鍵是實際應用中適合自己項目的需要。
?
----------------------------------------------------------
VO
:value object值對象 / view object表現層對象
1
.主要對應頁面顯示(web頁面/swt、swing界面)的數據對象。
2
.可以和表對應,也可以不,這根據業務的需要。
?
注
:在struts中,用ActionForm做VO,需要做一個轉換,因為PO是面向對象的,而ActionForm是和view對應的,要將幾個PO要顯示的屬性合成一個ActionForm,可以使用BeanUtils的copy方法。
?
----------------------------------------------------------
DTO
(TO)
:Data Transfer Object數據傳輸對象
1
.用在需要跨進程或遠程傳輸時,它不應該包含業務邏輯。
2
.比如一張表有100個字段,那么對應的PO就有100個屬性(大多數情況下,DTO 內的數據來自多個表)。但view層只需顯示10個字段,沒有必要把整個PO對象傳遞到client,這時我們就可以用只有這10個屬性的DTO來傳輸數據到client,這樣也不會暴露server端表結構。到達客戶端以后,如果用這個對象來對應界面顯示,那此時它的身份就轉為VO。
?
----------------------------------------------------------
DAO
:data access object數據訪問對象
1
.主要用來封裝對DB的訪問(CRUD操作)。
2
.通過接收Business層的數據,把POJO持久化為PO。
?
?