溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

J2EE架構(gòu)數(shù)據(jù)表示的方法是什么

發(fā)布時間:2021-12-06 09:29:50 來源:億速云 閱讀:163 作者:iii 欄目:編程語言

這篇文章主要講解了“J2EE架構(gòu)數(shù)據(jù)表示的方法是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“J2EE架構(gòu)數(shù)據(jù)表示的方法是什么”吧!

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

我來談談在J2EE架構(gòu)中各層的數(shù)據(jù)表示方法:

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

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

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

先來談談ActionFormBean和持久層的PO之間的重大區(qū)別。

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

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

比如說吧,用戶注冊頁面要求注冊用戶的基本信息,因此HTML Form里面包含了基本信息屬性,于是你需要一個ActionFormBean來一一對應(注意:是一一對應),每個Bean屬性對應一個文本框或者選擇框什么的。

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

假設(shè)我的注冊頁面原來只要你提供First Name,那么ActionFormBean就這一個屬性,后來我要你提供全名,你要改ActionFormBean,加兩個屬性。但是這個時候PO是不應該修改滴,因為數(shù)據(jù)庫沒有改。

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

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

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

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

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

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

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

當用戶查詢某個會員的信息的時候,他用全名進行查詢,于是Action得到一個UserNameFormBean包括了3個屬性,分別是first name, middle name, last name,然后Action把UserNameFormBean的3個屬性讀出來,構(gòu)造Name對象,再調(diào)用業(yè)務Bean,把Name對象傳遞給業(yè)務Bean,進行查詢。

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

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

查詢頁面拿到request對象里面的ActionFormBean,自動調(diào)用tag顯示之。

總結(jié):

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

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

BTW:

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

當然咯,理論是一回事,實際操作也不一定非要這樣干,你可以自行取舍,在實際項目中靈活一點,增加一點bad smell,提高開發(fā)效率。只不過在大型項目中***還是嚴絲合縫,不然的話,改版的時候會痛苦的很滴。

感謝各位的閱讀,以上就是“J2EE架構(gòu)數(shù)據(jù)表示的方法是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對J2EE架構(gòu)數(shù)據(jù)表示的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI