亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

結合struts和hibernate談J2EE架構的數據表示[轉載]

2019-11-18 11:19:43
字體:
來源:轉載
供稿:網友

在 struts+ hibernate 這種結構中,是不應該把Hibernate產生的PO直接傳遞給jsp的,不管他是Iterator,還是List,這是一個設計錯誤。

我來談談在J2EE架構中各層的數據表示方法:

Web層的數據表示是FormBean,數據來源于Html Form POST
業務層的數據表示是VO
持久層的數據表示是PO,其數據來源于數據庫,持久層的數據表示例如CMP

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

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

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

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

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

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

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

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

那么在一個完整的J2EE系統中應該如何進行合理的設計呢?

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

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

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

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

然后來看一看整個架構的流程:

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

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

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

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

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

總結:

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

FormBean和PO之間的數據轉化是在Action中進行滴。

BTW:

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

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日日狠狠久久偷偷四色综合免费| 亚洲小视频在线观看| 国产视频观看一区| 久久影院免费观看| 中文字幕久热精品在线视频| 欧美日韩激情美女| 亚洲国产91精品在线观看| 国产精品久久久久久久av大片| 中文字幕9999| 国产成人亚洲综合91精品| 欧美精品一区在线播放| 精品av在线播放| 亚洲欧美激情另类校园| 美女av一区二区| 精品久久国产精品| 国产日产亚洲精品| 欧美另类99xxxxx| 久久久久久久一区二区| 国内精品久久久久久中文字幕| 91精品在线影院| 久久久久国色av免费观看性色| 777午夜精品福利在线观看| 奇米影视亚洲狠狠色| 国产精品视频久久| 热re99久久精品国产66热| 亚洲电影成人av99爱色| 国产日韩亚洲欧美| 九色91av视频| 欧美成人中文字幕在线| 欧美性xxxxx极品| 欧美性xxxx18| 亚洲18私人小影院| 亚洲精品美女久久久久| 国产欧美精品va在线观看| 欧美午夜视频在线观看| 亚洲品质视频自拍网| 亚洲精品日韩激情在线电影| 欧美一级黄色网| 国产成人精品亚洲精品| 国产精品欧美亚洲777777| 亚洲天堂网在线观看| 欧美野外wwwxxx| 中国日韩欧美久久久久久久久| 欧美孕妇孕交黑巨大网站| 黄网站色欧美视频| 性欧美视频videos6一9| 久久久久久久网站| 亚洲精品美女久久久久| 日韩最新中文字幕电影免费看| 欧美国产日韩一区| 精品香蕉在线观看视频一| 国产精品日本精品| 狠狠色噜噜狠狠狠狠97| 国产丝袜一区二区| www.日韩视频| 欧美在线一级视频| 欧美一区第一页| 国产精品丝袜一区二区三区| 欧美极品少妇全裸体| 欧美电影电视剧在线观看| 亚洲综合日韩中文字幕v在线| 欧美激情va永久在线播放| 国产在线999| 色婷婷成人综合| 欧美大片网站在线观看| 亚洲无av在线中文字幕| 国产精品福利无圣光在线一区| 欧美肥臀大乳一区二区免费视频| 国产精品久久久久久久久久尿| 中文字幕日本精品| 亚洲国产成人爱av在线播放| 亚洲一区亚洲二区亚洲三区| 日日狠狠久久偷偷四色综合免费| 国产成人精品亚洲精品| 欧美视频在线观看免费| 亚洲精品不卡在线| 8x海外华人永久免费日韩内陆视频| 中文字幕欧美精品在线| 亚洲一区二区三区成人在线视频精品| 国产成人精品a视频一区www| 国产精品爽黄69天堂a| 国产激情久久久久| 中文字幕综合一区| 亚洲精品日产aⅴ| 亚洲free性xxxx护士hd| 91在线观看免费高清完整版在线观看| 一区二区三区亚洲| 久久亚洲欧美日韩精品专区| 国产精品你懂得| 中文字幕欧美日韩精品| 日韩中文字幕在线观看| 日韩电影中文字幕一区| 亚洲变态欧美另类捆绑| 欧美性xxxx| 国产99久久精品一区二区永久免费| 一区二区欧美久久| 精品亚洲男同gayvideo网站| 久久人人看视频| 日韩亚洲精品电影| 国产精品成久久久久三级| 久久99视频精品| 97在线日本国产| 日韩免费在线电影| 美女久久久久久久| 丝袜亚洲另类欧美重口| 欧美精品日韩三级| 欧美激情一级欧美精品| 久久久久久久久久久成人| 欧美有码在线观看| 国产成+人+综合+亚洲欧洲| 久久影视电视剧免费网站清宫辞电视| 亚洲电影av在线| 久久99视频免费| 中文一区二区视频| 黄色精品在线看| 国产精品91久久久| 亚洲欧美国产视频| 国产精品日日做人人爱| 欧美二区在线播放| 日韩免费观看av| 正在播放亚洲1区| 国产精品电影观看| 国产在线拍偷自揄拍精品| 国产在线999| 欧美性感美女h网站在线观看免费| 91在线观看免费高清完整版在线观看| 久久精品亚洲94久久精品| 91亚洲精品久久久久久久久久久久| 91精品国产色综合久久不卡98| 成人免费视频xnxx.com| 欧美日韩亚洲视频| 国产精品福利在线观看网址| 欧洲永久精品大片ww免费漫画| 国产精品丝袜一区二区三区| 日本道色综合久久影院| 日韩高清人体午夜| 亚洲精品中文字幕有码专区| 亚洲女人被黑人巨大进入al| 欧美一级高清免费播放| 国产精品私拍pans大尺度在线| 午夜精品蜜臀一区二区三区免费| 欧美精品在线网站| 日韩精品极品毛片系列视频| 国产成人精品午夜| 91精品国产成人www| 国产97色在线|日韩| 国产一区二区三区在线| 国产精品电影一区| 色哟哟亚洲精品一区二区| 日韩av成人在线观看| 成人精品久久av网站| 日韩电影视频免费| 日韩av在线导航| 欧美国产第二页| 国模精品视频一区二区| 欧美区二区三区| 日韩电影在线观看永久视频免费网站| 九九九久久国产免费| 国产精自产拍久久久久久| 福利一区福利二区微拍刺激| 欧美一级大胆视频| 26uuu另类亚洲欧美日本老年| 国产成人精品久久二区二区| 日韩中文字幕网站|