<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數據加載中……

    剖析MVC中的各種Object

    ??? 作者: Flyingis

    ??? 在Web應用和J2EE框架中經常可以碰到各種Object相關的名詞,在網上搜索了一下,討論各種Object術語的帖子一大筐,大的討論整個框架,小的描述各個層次之間的細微差別,甚至有鉆牛角尖之嫌。 BlogJava 上也有討論VO和PO的貼子,例如 非飛 《各層共享使用PO的代價》 等。其實無論怎么討論,這些術語、分層結構、應用框架無非都是為我們的應用而服務的,因此,我們需要的是理解這些術語提出的意義,是理解我們的項目需求,是理解我們采用的框架結構能否最大限度的滿足項目的需要。

    ??? 在剛剛學習MVC/Model2之前,我是不了解VO/TO/PO/DTO/BO等等這些術語的含義的,至少理解上只是停留在淺層面,現在多看了一些,做了一點項目,多了些想法,但肯定還是存在理解上的偏差或誤解,歡迎大家討論指出!

    ??? VO: 通常指ValueObject或ViewObject。ViewObject指的是UI需要的對象,Struts的FormBean就是其中的一種,它是Value Object和Transfer Object的總稱。

    ??? TO: Transfer Object,它和Value Object的區別可以參考Patterns of Enterprise Application Architecture。

    ??? PO: Persistent Object,即可以被持久化的實體對象。

    ???
    POJO : Plain Ordinary Java Object。

    ??? DTO: Data Transfer Object,J2EE 中常用的一種設計模式,現在一般可以將使用Value Object的模式稱為DTO模式,在
    Jdon 上一篇《ValueObject和DTO模式的一些疑問》 闡述了兩者的關系。

    ??? BO: Business Object,可以分為三種情況,只包含業務對象的屬性,或只包含業務方法,或兩者都包含。對于BO的詳細討論,可以
    參見這里

    ??? 這些概念經常交錯在一起提出,給初學者造成了一些理解上的困難,其實只需要理順下面幾點,基本上就能弄清楚層次之前的前后關系和如何合理使用這些對象。

    ??? 1.?VO能否和PO相同。首先回答是肯定的,VO是概念模型的一種抽象反映,當一個業務實體可以用一個物理實體表示的時候,VO和PO屬性相同,那么它們是相等的。例如學生成績管理系統中,成績表單業務實體中包含學生信息、課程信息、成績等,此時它已經不能用一個物理實體所能描述,而其中的學生信息,其VO和PO在屬性上是一樣的,此時的VO和PO相同。

    ??? 2.?PO能否代替VO。僅僅從功能實現上來說,當VO和PO相同的時候,PO可以代替VO,這樣可以減少一些代碼量,但需要注意的是,這樣會帶來一些問題:當一個業務實體需要多個物理實體來表達的時候,在客戶端顯示一個業務實體就會多次訪問數據庫,即進行多次單表訪問,非視圖;當一個業務實體屬性遠少于一個物理實體的時候,可能會因裝載過多不必要的數據而影響網絡傳輸;對物理實體進行改動的時候會直接影響到表現層。簡單的說,這樣做增加了代碼的耦合性,也增加了代碼維護的難度,項目的可擴展性也大大降低,如果僅僅是為了減少代碼量而付出這些代將顯然是不值的,當然極為簡單的應用可以考慮,一切從項目實際出發。

    ??? 3.?VO包含的屬性可以多于PO、少于PO、或等于PO中的屬性。

    ??? 4.?一個基于Struts應用的簡單數據提交流程(VO和PO單獨存在):HTML 頁面中包含了基本的信息,例如文本框、下拉框、單選等,構建一個ActionForm Bean與之一一對應,它是Web層數據的表示,當Web頁面的操作流程發生改變的時候,需要對它進行修改,但不能將修改傳遞到業務層和持久層。然后Action讀取ActionForm Bean的屬性,構造PO對象,調用BO ,當BO收到這個PO之后,調用DAO接口方法,對PO進行持久化操作,完成數據的提交。這里,PO在業務層和持久層之間,沒有被傳遞到Web層的View中去。

    ??? 5.?一個基于Struts應用的簡單數據查詢流程(VO和PO單獨存在):Action讀取ActionForm Bean中的查詢屬性信息,然后調用BO,BO獲取ActionForm Bean之后調用DAO接口進行查詢,返回所要查詢的PO對象,交給Action,Action通過該PO構建 ActionForm Bean,通過request.setAttribute()或session.setAttribute(),重定向到查詢結果頁面輸出需要的信息。

    ??? 6.?表現層中的字段一般定義為String或boolean類型,因此VO中的屬性在傳到Action并構建PO對象時需要進行數據類型的轉換,或由ActionForm的helper方法來進行轉換。

    ??? 參考文章和貼子:
    ???
    http://www.jdon.com/jive/article.jsp?forum=91&thread=23672
    ??? http://www.jdon.com/jive/article.jsp?forum=91&thread=21571
    ??? http://www.hibernate.org.cn/viewtopic.php?t=627&postdays=0&postorder=asc&start=0
    ???
    http://bbs.hidotnet.com/704/ShowPost.aspx
    ??? http://lifework.cnblogs.com/archive/2005/09/03/229596.html
    ??? http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesDTO.mspx ?

    posted on 2006-03-17 00:28 Flyingis 閱讀(2604) 評論(0)  編輯  收藏 所屬分類: Web 框架與開發架構與設計

    主站蜘蛛池模板: 久久青青草原亚洲av无码app| 亚洲日产韩国一二三四区| 亚洲欧洲国产综合| MM131亚洲国产美女久久| 色偷偷噜噜噜亚洲男人| 成全影视免费观看大全二| 久久亚洲精品国产精品婷婷 | 国产偷国产偷亚洲清高动态图| 黄人成a动漫片免费网站| yy6080久久亚洲精品| 一区二区三区亚洲| 亚洲一级毛片免费看| 亚洲国产系列一区二区三区| 欧洲黑大粗无码免费| 国产成人亚洲精品无码AV大片| 免费欧洲毛片A级视频无风险| 黄色免费网址在线观看| 国产精品亚洲产品一区二区三区| 中文毛片无遮挡高清免费| 亚洲AV无码不卡在线播放| 男女污污污超污视频免费在线看| 精品亚洲一区二区三区在线观看| 亚洲色偷偷色噜噜狠狠99| 免费很黄很色裸乳在线观看| 国产在线观看xxxx免费| 久久国产精品亚洲一区二区| 亚洲免费电影网站| MM1313亚洲国产精品| 国产亚洲精久久久久久无码77777| 99在线免费观看视频| 久久精品国产亚洲沈樵| 亚洲免费电影网站| 国产天堂亚洲国产碰碰| 亚洲精品亚洲人成人网| 免费99精品国产自在现线| 国产成人亚洲精品播放器下载| 久久亚洲国产欧洲精品一| 久久不见久久见中文字幕免费 | 亚洲日本久久久午夜精品| 亚洲AV中文无码乱人伦| 毛片无码免费无码播放|