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

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

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


    posts - 10,comments - 4,trackbacks - 0
    摘選自:javaeye
    作者?? ?:robbin


    在 struts+ hibernate 這種結(jié)構(gòu)中,是不應(yīng)該把Hibernate產(chǎn)生的PO直接傳遞給JSP的,不管他是Iterator,還是List,這是一個(gè)設(shè)計(jì)錯(cuò)誤。

    我來(lái)談?wù)勗贘2EE架構(gòu)中各層的數(shù)據(jù)表示方法:

    Web層的數(shù)據(jù)表示是FormBean,數(shù)據(jù)來(lái)源于HTML Form POST
    業(yè)務(wù)層的數(shù)據(jù)表示是VO
    持久層的數(shù)據(jù)表示是PO,其數(shù)據(jù)來(lái)源于數(shù)據(jù)庫(kù),持久層的數(shù)據(jù)表示例如CMP

    在一個(gè)規(guī)范的J2EE架構(gòu)中,不同層的數(shù)據(jù)表示應(yīng)該被限制在層內(nèi),而不應(yīng)該擴(kuò)散到其它層,這樣可以降低層間的耦合性,提高J2EE架構(gòu)整體的可維護(hù)性和可擴(kuò)展性。比如說(shuō)Web層的邏輯進(jìn)行了修改,那么只需要修改FormBean的結(jié)構(gòu),而不需要觸動(dòng)業(yè)務(wù)層和持久層的代碼修改。同樣滴,當(dāng)數(shù)據(jù)庫(kù)表進(jìn)行了小的調(diào)整,那么也只需要修改持久層數(shù)據(jù)表示,而不需要觸動(dòng)業(yè)務(wù)層代碼和Web層代碼。

    不過(guò)由于Hibernate的強(qiáng)大功能,例如動(dòng)態(tài)生成PO,PO的狀態(tài)管理可以脫離Session,使得在應(yīng)用了Hibernate的J2EE框架中,PO完全可以充當(dāng)VO,因此我們下面把PO和VO合并,統(tǒng)稱(chēng)為PO。

    先來(lái)談?wù)凙ctionFormBean和持久層的PO之間的重大區(qū)別。

    在簡(jiǎn)單的應(yīng)用中,ActionFormBean和PO幾乎是沒(méi)有區(qū)別,所以很多人干脆就是用ActionFormBean來(lái)充當(dāng)PO,于是ActionFormBean從JSP頁(yè)面到Servlet控制層再到業(yè)務(wù)層,然后穿過(guò)持久層,最后一直映射到數(shù)據(jù)庫(kù)表。真是一竿子捅到了底!

    但是在復(fù)雜的應(yīng)用中,ActionFormBean和PO是分離的,他們也不可能一樣。ActionFormBean是和網(wǎng)頁(yè)里面的Form表單一一對(duì)應(yīng)的,F(xiàn)orm里面有什么元素,Bean里面就有什么屬性。而PO和數(shù)據(jù)庫(kù)表對(duì)應(yīng),因此如果數(shù)據(jù)庫(kù)表不修改,那么PO也不會(huì)修改,如果頁(yè)面的流程和數(shù)據(jù)庫(kù)表字段對(duì)應(yīng)關(guān)系不一致,那么你又如何能夠使用ActionFormBean來(lái)取代PO呢?

    比如說(shuō)吧,用戶(hù)注冊(cè)頁(yè)面要求注冊(cè)用戶(hù)的基本信息,因此HTML Form里面包含了基本信息屬性,于是你需要一個(gè)ActionFormBean來(lái)一一對(duì)應(yīng)(注意:是一一對(duì)應(yīng)),每個(gè)Bean屬性對(duì)應(yīng)一個(gè)文本框或者選擇框什么的。

    而用戶(hù)這個(gè)持久對(duì)象呢?他的屬性和ActionFormBean有什么明顯不同呢?他會(huì)有一些ActionFormBean所沒(méi)有的集合屬性,比如說(shuō)用戶(hù)的權(quán)限屬性,用戶(hù)的組屬性,用戶(hù)的帖子等等。另外還有可能的是在ActionFormBean里面有3個(gè)屬性,分別是用戶(hù)的First Name, Middle Name, Last Name,而在我的User這個(gè)持久對(duì)象中就是一個(gè) Name 對(duì)象屬性。

    假設(shè)我的注冊(cè)頁(yè)面原來(lái)只要你提供First Name,那么ActionFormBean就這一個(gè)屬性,后來(lái)我要你提供全名,你要改ActionFormBean,加兩個(gè)屬性。但是這個(gè)時(shí)候PO是不應(yīng)該修改滴,因?yàn)閿?shù)據(jù)庫(kù)沒(méi)有改。

    那么在一個(gè)完整的J2EE系統(tǒng)中應(yīng)該如何進(jìn)行合理的設(shè)計(jì)呢?

    JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

    ActionFormBean是Web層的數(shù)據(jù)表示,它和HTML頁(yè)面Form對(duì)應(yīng),只要Web頁(yè)面的操作流程發(fā)生改變,它就要相應(yīng)的進(jìn)行修改,它不應(yīng)該也不能被傳遞到業(yè)務(wù)層和持久層,否則一旦頁(yè)面修改,會(huì)一直牽連到業(yè)務(wù)層和持久層的大面積的代碼進(jìn)行修改,對(duì)于軟件的可維護(hù)性和可擴(kuò)展性而言,是一個(gè)災(zāi)難,Actiont就是他的邊界,到此為止!

    Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

    而PO則是業(yè)務(wù)層和持久層的數(shù)據(jù)表示,它在業(yè)務(wù)層和持久層之間進(jìn)行流動(dòng),他不應(yīng)該也不能被傳遞到Web層的View中去,而ActionServlet就是他的邊界,到此為止!

    然后來(lái)看一看整個(gè)架構(gòu)的流程:

    當(dāng)用戶(hù)通過(guò)瀏覽器訪問(wèn)網(wǎng)頁(yè),提交了一個(gè)頁(yè)面。于是Action拿到了這個(gè)FormBean,他會(huì)把FormBean屬性讀出來(lái),然后構(gòu)造一個(gè)PO對(duì)象,再調(diào)用業(yè)務(wù)層的Bean類(lèi),完成了注冊(cè)操作,重定向到成功頁(yè)面。而業(yè)務(wù)層Bean收到這個(gè)PO對(duì)象之后,調(diào)用DAO接口方法,進(jìn)行持久對(duì)象的持久化操作。

    當(dāng)用戶(hù)查詢(xún)某個(gè)會(huì)員的信息的時(shí)候,他用全名進(jìn)行查詢(xún),于是Action得到一個(gè)UserNameFormBean包括了3個(gè)屬性,分別是first name, middle name, last name,然后Action把UserNameFormBean的3個(gè)屬性讀出來(lái),構(gòu)造Name對(duì)象,再調(diào)用業(yè)務(wù)Bean,把Name對(duì)象傳遞給業(yè)務(wù)Bean,進(jìn)行查詢(xún)。

    業(yè)務(wù)Bean取得Name(注意: Name對(duì)象只是User的一個(gè)屬性)對(duì)象之后調(diào)用DAO接口,返回一個(gè)User的PO對(duì)象,注意這個(gè)User不同于在Web層使用的UserFormBean,他有很多集合屬性滴。然后業(yè)務(wù)Bean把User對(duì)象返回給Action。

    Action拿到User之后,把User的基本屬性取出(集合屬性如果不需要就免了),構(gòu)造UserFormBean,然后把UserFormBean request.setAttribute(...),然后重定向到查詢(xún)結(jié)果頁(yè)面。

    查詢(xún)頁(yè)面拿到request對(duì)象里面的ActionFormBean,自動(dòng)調(diào)用tag顯示之。

    總結(jié):

    FormBean是Web層的數(shù)據(jù)表示,他不能被傳遞到業(yè)務(wù)層;PO是持久層的數(shù)據(jù)表示,在特定情況下,例如Hibernate中,他可以取代VO出現(xiàn)在業(yè)務(wù)層,但是不管PO還是VO都必須限制在業(yè)務(wù)層內(nèi)使用,最多到達(dá)Web層的Control,絕不能被擴(kuò)散到View去。

    FormBean和PO之間的數(shù)據(jù)轉(zhuǎn)化是在Action中進(jìn)行滴。

    BTW:

    JDO1.x還不能像Hibernate功能這樣強(qiáng)大,PO不能脫離持久層,所以必須在業(yè)務(wù)層使用VO,因此必須在業(yè)務(wù)層進(jìn)行大量的VO和PO的轉(zhuǎn)化操作,相對(duì)于Hibernate來(lái)說(shuō),編程比較煩瑣。

    當(dāng)然咯,理論是一回事,實(shí)際操作也不一定非要這樣干,你可以自行取舍,在實(shí)際項(xiàng)目中靈活一點(diǎn),增加一點(diǎn)bad smell,提高開(kāi)發(fā)效率。只不過(guò)在大型項(xiàng)目中最好還是嚴(yán)絲合縫,不然的話(huà),改版的時(shí)候會(huì)痛苦的很滴。
    posted on 2006-04-08 18:19 dodoma 閱讀(92) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 架構(gòu)設(shè)計(jì)

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 美女羞羞免费视频网站| 亚洲第一成年免费网站| 久久精品国产亚洲麻豆| 亚洲成人精品久久| 亚洲人成网站在线观看播放动漫 | 国产乱辈通伦影片在线播放亚洲 | 666精品国产精品亚洲| 久久精品国产亚洲av麻豆蜜芽 | 一级免费黄色毛片| 18禁美女裸体免费网站| 成人免费无遮挡无码黄漫视频| 国产91精品一区二区麻豆亚洲| 四虎影在线永久免费观看| 国产免费一区二区三区VR| 亚洲AV无码一区二区三区久久精品 | 91免费福利精品国产| 亚洲伊人成无码综合网| fc2成年免费共享视频18| 大地资源二在线观看免费高清| 亚洲人成色77777| 精品国产亚洲第一区二区三区| 亚洲精品在线免费看| 亚洲三级高清免费| 午夜精品免费在线观看| 亚洲国产成人久久综合野外| 亚洲人成在线精品| 日韩成人免费视频播放| 亚洲最大在线观看| 久久青草精品38国产免费| 国产L精品国产亚洲区久久 | 亚洲av无码无在线观看红杏| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 在线免费观看中文字幕| 亚洲综合免费视频| 香港a毛片免费观看| 亚洲卡一卡二卡乱码新区| 亚洲AV无码成H人在线观看| 久久99精品视免费看| 亚洲精品无码久久久久久| 最近中文字幕免费mv视频8| 成人一级免费视频|