我的Blog我做主^_^
走向一條通往JAVA的不歸路...
BlogJava
::
首頁
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
::
64 隨筆 :: 68 文章 :: 77 評(píng)論 :: 0 Trackbacks
<
2025年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(10)
給我留言
查看公開留言
查看私人留言
隨筆分類
ibatis
(rss)
JAVA基礎(chǔ)
(rss)
設(shè)計(jì)模式(1)
(rss)
隨筆檔案
2011年5月 (4)
2010年12月 (1)
2010年10月 (1)
2010年6月 (1)
2009年3月 (1)
2009年1月 (1)
2008年12月 (1)
2008年10月 (2)
2008年9月 (1)
2008年7月 (1)
2008年6月 (2)
2008年5月 (2)
2008年4月 (1)
2008年3月 (1)
2007年11月 (5)
2007年9月 (1)
2007年6月 (1)
2007年5月 (5)
2007年4月 (5)
2007年3月 (8)
2007年2月 (7)
2007年1月 (11)
2006年12月 (1)
文章分類
Android(2)
(rss)
HIBERNATE(6)
(rss)
ibatis(1)
(rss)
JAVA(8)
(rss)
JAVASCRIPT(11)
(rss)
LINUX(4)
(rss)
OPEN SOURCE(11)
(rss)
SPRING(2)
(rss)
STRUTS(9)
(rss)
心情驛站(1)
(rss)
數(shù)據(jù)庫(6)
(rss)
服務(wù)器(2)
(rss)
設(shè)計(jì)模式(3)
(rss)
新聞分類
News
(rss)
收藏夾
經(jīng)典URL(21)
(rss)
友情
beansoft
freebird
oksonic博客
SteelHand
Struts2----max
wolfsquare
刑紅瑞的BLOG
張利海的BLOG
張立軍博客
江南白衣博客
鐵手劍譜
韓再芬
最新隨筆
1.?org.apache.taglibs.standard.tlv.JstlCoreTLV
2.?String.format 格式化
3.?SDL_app:emulator.exe應(yīng)用程序錯(cuò)誤
4.?Tomcat部署時(shí)報(bào)錯(cuò)Deployment failure on Tomcat 6.x. Could not copy all resources to
5.?Eclipse插件 Subclipse 去掉或者修改 記住的用戶名密碼
6.?struts2 標(biāo)簽
7.?分隔數(shù)據(jù)庫表
8.?Spring的JDBCTemplate
9.?JProfiler的配置問題
10.?js判斷瀏覽器是否關(guān)閉
搜索
積分與排名
積分 - 216449
排名 - 262
最新評(píng)論
1.?re: 純JS長文章分頁代碼
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--suchso.com
2.?re: js判斷瀏覽器是否關(guān)閉
op;
--op
3.?re: Spring的JDBCTemplate
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--zuidaima
4.?re: Spring的JDBCTemplate
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--zuidaima
5.?re: 程序員是有前途的。。。
程序員的未來之路還可以做講師。
--趙利文
閱讀排行榜
1.?Spring的JDBCTemplate(58126)
2.?Spring學(xué)習(xí)筆記----MultiActionController (8913)
3.?js判斷瀏覽器是否關(guān)閉(7872)
4.?數(shù)據(jù)庫置疑解決方案(7767)
5.?動(dòng)態(tài)JSP頁生成靜態(tài)HTML(5933)
評(píng)論排行榜
1.?動(dòng)態(tài)JSP頁生成靜態(tài)HTML(23)
2.?Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記(9)
3.?SDL_app:emulator.exe應(yīng)用程序錯(cuò)誤(4)
4.?IP地址段的過濾(4)
5.?強(qiáng)行關(guān)閉8080端口(3)
結(jié)合struts和hibernate談J2EE架構(gòu)的數(shù)據(jù)表示[轉(zhuǎn)載]
在 struts+ hibernate 這種結(jié)構(gòu)中,是不應(yīng)該把Hibernate產(chǎn)生的PO直接傳遞給JSP的,不管他是Iterator,還是List,這是一個(gè)設(shè)計(jì)錯(cuò)誤。
我來談?wù)勗贘2EE架構(gòu)中各層的數(shù)據(jù)表示方法:
Web層的數(shù)據(jù)表示是FormBean,數(shù)據(jù)來源于HTML Form POST
業(yè)務(wù)層的數(shù)據(jù)表示是VO
持久層的數(shù)據(jù)表示是PO,其數(shù)據(jù)來源于數(shù)據(jù)庫,持久層的數(shù)據(jù)表示例如CMP
在一個(gè)規(guī)范的J2EE架構(gòu)中,不同層的數(shù)據(jù)表示應(yīng)該被限制在層內(nèi),而不應(yīng)該擴(kuò)散到其它層,這樣可以降低層間的耦合性,提高J2EE架構(gòu)整體的可維護(hù)性和可擴(kuò)展性。比如說Web層的邏輯進(jìn)行了修改,那么只需要修改FormBean的結(jié)構(gòu),而不需要觸動(dòng)業(yè)務(wù)層和持久層的代碼修改。同樣滴,當(dāng)數(shù)據(jù)庫表進(jìn)行了小的調(diào)整,那么也只需要修改持久層數(shù)據(jù)表示,而不需要觸動(dòng)業(yè)務(wù)層代碼和Web層代碼。
不過由于Hibernate的強(qiáng)大功能,例如動(dòng)態(tài)生成PO,PO的狀態(tài)管理可以脫離Session,使得在應(yīng)用了Hibernate的J2EE框架中,PO完全可以充當(dāng)VO,因此我們下面把PO和VO合并,統(tǒng)稱為PO。
先來談?wù)凙ctionFormBean和持久層的PO之間的重大區(qū)別。
在簡單的應(yīng)用中,ActionFormBean和PO幾乎是沒有區(qū)別,所以很多人干脆就是用ActionFormBean來充當(dāng)PO,于是ActionFormBean從JSP頁面到Servlet控制層再到業(yè)務(wù)層,然后穿過持久層,最后一直映射到數(shù)據(jù)庫表。真是一竿子捅到了底!
但是在復(fù)雜的應(yīng)用中,ActionFormBean和PO是分離的,他們也不可能一樣。ActionFormBean是和網(wǎng)頁里面的Form表單一一對(duì)應(yīng)的,F(xiàn)orm里面有什么元素,Bean里面就有什么屬性。而PO和數(shù)據(jù)庫表對(duì)應(yīng),因此如果數(shù)據(jù)庫表不修改,那么PO也不會(huì)修改,如果頁面的流程和數(shù)據(jù)庫表字段對(duì)應(yīng)關(guān)系不一致,那么你又如何能夠使用ActionFormBean來取代PO呢?
比如說吧,用戶注冊(cè)頁面要求注冊(cè)用戶的基本信息,因此HTML Form里面包含了基本信息屬性,于是你需要一個(gè)ActionFormBean來一一對(duì)應(yīng)(注意:是一一對(duì)應(yīng)),每個(gè)Bean屬性對(duì)應(yīng)一個(gè)文本框或者選擇框什么的。
而用戶這個(gè)持久對(duì)象呢?他的屬性和ActionFormBean有什么明顯不同呢?他會(huì)有一些ActionFormBean所沒有的集合屬性,比如說用戶的權(quán)限屬性,用戶的組屬性,用戶的帖子等等。另外還有可能的是在ActionFormBean里面有3個(gè)屬性,分別是用戶的First Name, Middle Name, Last Name,而在我的User這個(gè)持久對(duì)象中就是一個(gè) Name 對(duì)象屬性。
假設(shè)我的注冊(cè)頁面原來只要你提供First Name,那么ActionFormBean就這一個(gè)屬性,后來我要你提供全名,你要改ActionFormBean,加兩個(gè)屬性。但是這個(gè)時(shí)候PO是不應(yīng)該修改滴,因?yàn)閿?shù)據(jù)庫沒有改。
那么在一個(gè)完整的J2EE系統(tǒng)中應(yīng)該如何進(jìn)行合理的設(shè)計(jì)呢?
JSP(View) - ActionFormBean(Module) - Action(Control)
ActionFormBean是Web層的數(shù)據(jù)表示,它和HTML頁面Form對(duì)應(yīng),只要Web頁面的操作流程發(fā)生改變,它就要相應(yīng)的進(jìn)行修改,它不應(yīng)該也不能被傳遞到業(yè)務(wù)層和持久層,否則一旦頁面修改,會(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就是他的邊界,到此為止!
然后來看一看整個(gè)架構(gòu)的流程:
當(dāng)用戶通過瀏覽器訪問網(wǎng)頁,提交了一個(gè)頁面。于是Action拿到了這個(gè)FormBean,他會(huì)把FormBean屬性讀出來,然后構(gòu)造一個(gè)PO對(duì)象,再調(diào)用業(yè)務(wù)層的Bean類,完成了注冊(cè)操作,重定向到成功頁面。而業(yè)務(wù)層Bean收到這個(gè)PO對(duì)象之后,調(diào)用DAO接口方法,進(jìn)行持久對(duì)象的持久化操作。
當(dāng)用戶查詢某個(gè)會(huì)員的信息的時(shí)候,他用全名進(jìn)行查詢,于是Action得到一個(gè)UserNameFormBean包括了3個(gè)屬性,分別是first name, middle name, last name,然后Action把UserNameFormBean的3個(gè)屬性讀出來,構(gòu)造Name對(duì)象,再調(diào)用業(yè)務(wù)Bean,把Name對(duì)象傳遞給業(yè)務(wù)Bean,進(jì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(...),然后重定向到查詢結(jié)果頁面。
查詢頁面拿到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來說,編程比較煩瑣。
當(dāng)然咯,理論是一回事,實(shí)際操作也不一定非要這樣干,你可以自行取舍,在實(shí)際項(xiàng)目中靈活一點(diǎn),增加一點(diǎn)bad smell,提高開發(fā)效率。只不過在大型項(xiàng)目中最好還是嚴(yán)絲合縫,不然的話,改版的時(shí)候會(huì)痛苦的很滴。
posted on 2007-01-06 10:06
java_蟈蟈
閱讀(245)
評(píng)論(0)
編輯
收藏
所屬分類:
STRUTS
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
jstl與struts結(jié)合
用Struts的Token機(jī)制解決表單重復(fù)提交
Struts-Bean 標(biāo)簽庫 [轉(zhuǎn)載]
用Validator檢查你的表單
JSTL與Struts的結(jié)合(十)[轉(zhuǎn)載]
第9章 Struts與表現(xiàn)層技術(shù)的結(jié)合[轉(zhuǎn)載]
Struts-Logic 標(biāo)簽庫[轉(zhuǎn)載]
結(jié)合struts和hibernate談J2EE架構(gòu)的數(shù)據(jù)表示[轉(zhuǎn)載]
struts-Html 標(biāo)簽庫[轉(zhuǎn)載]
Powered by:
BlogJava
Copyright © java_蟈蟈
主站蜘蛛池模板:
廊坊市
|
青神县
|
依兰县
|
新建县
|
卓尼县
|
镇巴县
|
宣恩县
|
英超
|
丰顺县
|
泸西县
|
丰城市
|
南皮县
|
同江市
|
商丘市
|
涿鹿县
|
宁德市
|
衡山县
|
资中县
|
彰化市
|
邓州市
|
新晃
|
崇礼县
|
庆阳市
|
佛教
|
蒙自县
|
齐河县
|
新营市
|
永福县
|
岳阳市
|
南和县
|
阿克
|
德令哈市
|
泰安市
|
房产
|
资源县
|
温泉县
|
武义县
|
丹寨县
|
克东县
|
海林市
|
灵宝市
|