在 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,提高開發效率。只不過在大型項目中最好還是嚴絲合縫,不然的話,改版的時候會痛苦的很滴。
開幕了,全場黑燈瞎伙,音樂想起,氣氛有些陰森恐怖
在跑道四周的演員個個穿得象OTMAN(奧特曼),手里牽著類似豬肝的巨大物體然后這些牽著豬肝的OTMAN聚集在舞臺中央,像個至尊PIZZA,
突然,紅光崩現~~
PIZZA又分裂成若干豬肝、上升~~宛如一朵蘑菇云,讓我想起了今年是抗戰60周年紀念
令人受不了的是煙霧,從沒想到干冰會如此的令人窒息~~
小丹寧吐了,許多14排以前的人都跑了,敢于留下來的都用手帕捂著嘴,慘不忍睹,配合五顏六色的激光,殷曼婷說,“媽的,就像黑山老妖!”
表現江蘇科技一章,除了OTMAN舉著螺母、三角板亂跑,實在看不出有啥工業成份可言
孫老大發話:“想起了學好數理化,走遍天下”的古老格言
唉~導演的創意實在令江蘇人蒙羞,表現科技用三角板,依此類推,表現表現江蘇經濟大省是不是該舉著鈔票滿場跑?
最夸張的是800個古代的三陪女手抱著琵琶,
孫老大說,呵呵,有史以來最多的琵琶集會
我覺得這個糟糕的場景明顯剽竊了張藝謀在雅典奧運會結尾那個最臭名昭著的大腿舞
在張藝謀眼里,
陜北風俗+大紅棉襖+大腿+二胡+扭屁股+大紅燈籠=中國
在我們導演眼里,
蘇南小調+綠色長裙+露半個后脊背+琵琶+轉圈+雨傘=江蘇
攝像也很濫,根本抓不住演員,特寫鏡頭也沒幾個(后評:哎)
但我還是喜歡這個開幕式(除了干冰令我作嘔外),特別是第一章,倒不是因為它好,實在是因為它夠爛。不過,雖然爛、恐怖、陰森,不知所云、不著邊際、不以為恥反以為榮,但總比讓我去看那些弘揚正氣的,光明的,正氣凜然的、充滿正面說教的開幕式好。
因此開幕式還是值得一看的,當然要抱著幸災樂禍的心態,抱著吃飽了撐的沒事干的心態,就當是看百年不遇的猴兒打架!
且說孫悟空大鬧天宮,觀世音菩薩舉薦二郎真君降妖,帶天兵天將在花果山大戰。正斗間,大圣忽見本營中妖猴驚散,自覺心慌,抽身就走,眾天將慌慌張張,前后尋覓不見,一齊吆喝道:“走了這猴精也!走了這猴精也!”
二郎神圓睜鳳目觀看,卻見下界人煙繁華之處,那大圣變做一個老頭,推著一輛三輪車,抖抖索索地,正在街邊賣烤白薯。二郎心中冷笑,正待發標打他,忽然見一伙城管,手持錘剪棍棒,吆吆喝喝,不由分說,便將三輪車砸得稀爛。大圣一驚,以為是天兵到來,連忙轉過街角,又搖身一變,變做一個小姐,描眉畫眼,在那里裊裊婷婷走路。卻又被二郎看個真切,二度意欲發標,迎面卻又來了幾個公安,劈面揪住大圣道:“定是一個野雞,隨我局子里走一趟!”大圣心慌,忙道:“我不是野雞,我還是處女!”公安狂笑道:“處女怎地?處女便嫖不得娼么?”手銬一抖,便要拿人。大圣見事不諧,忙將腰一扭,騰空而去,眼見前方一個山凹,便滾下山崖,伏在那里又變,變一座小學,大張著口,似個校門,牙齒變做門扇,眼睛變做窗欞,抖幾個猴虱下來變做學生咿咿呀呀念書。只有尾巴不好收拾,豎在后面,變做一根旗竿,懸起一條大標語:“百年大計,教育為本;義務教育,免費入學。”二郎兩番被搶了先手,心中正在煩悶,眼看得這條標語,不由笑道:“是這猢猻了!他今又在那里哄我。殊不知中國號稱義務教育,那里有得免費?我也曾見過學校千萬,更不見一個不把學生做搖錢樹的,看我打殺這個猴子!”大圣聽得心驚,撲的一個虎跳,又冒在空中不見。
真君望不見大圣蹤影,急縱身駕云,起在半空。見那李天王高舉望遠鏡站在云端,呵呵笑道:“真君,快去!快去!那猴使了個隱身法,走出營圍,往你那灌江口去也。”二郎聽說,忙回灌江口來趕。
卻說灌江口正開大會,大圣搖身一變,變做一個XX代表,雜在會場之中,指東點西,做踴躍發言狀。正自以為得計,卻不料被真君一眼識破:“XX代表向來是泥塑土偶的神像,什么時候跑出一個活的來?”舉著三尖兩刃神鋒,劈臉就砍。那猴王急忙躲過,使金箍棒相對。兩個嚷嚷鬧鬧,打出會場,半霧半云,且行且戰。
半空中天庭婦聯主任觀音菩薩與煉丹部長太上老君正在觀戰。菩薩對老君道:“老君哥哥,貧僧所舉二郎神如何?果有神通,已經那大圣圍困,只是未得擒拿。我如今助他一功,拿下猴頭。”老君道:“觀音妹子?你將何兵器助他?”觀音回身喚過坐騎:“看我開寶馬撞他一下。”老君道:“你那寶馬價格甚為昂貴,若撞壞了多有不便。”觀音道:“橫豎也是公款,撞了就撞了吧。”老君又道:“那修理起來也甚為麻煩,還是讓我來替妹子助他吧。”觀音曰:“壞了就不要了,我正想換輛凱迪拉客。”正拉拉扯扯間,老君身后轉過一名仙娥,乃是有名的張惟英教授,獻與老君一件寶物,嘴里喃喃說著什么 “總不能讓所有人都來天庭吧……我至今都不認為我錯了……”轉身而去。老君定睛看時,那寶物卻是一件“天庭人口準入制度”,不由大喜:“此物一出,全中國人都發抖,正可用來對付山野村猴,等我丟下去打他一下。觀音妹子,這趟功勞要讓給我了。”觀音嬌嗔道:“討厭,人家不跟你玩了啦。”老君涎臉笑道:“妹子莫氣,這一擊若得手,定將此役拍做主旋律電影,妹子作為主角,由我家女丑女丑扮演,所有院線同時上映,何如?”觀音這才回嗔作喜。
只見老君將那法寶自天門上往下一摜,滴溜溜,可可的著猴王頭上一下,將大圣打翻在地,眾天庭公安一擁而上,將大圣捆個結實,再也不能變化。一公安怒道:“這廝令我等吃了不少苦頭,今日一發還了他罷!饒你個孫悟空,今日要將你變做孫志剛!”正待把出手段,卻有另一公安叫道:“且慢,我等老手段土得掉渣,如今時興與國際接軌,那駐伊美軍虐囚,手段千變萬化,何不學得一二,今日做個新鮮耍子?”眾公安一聽,齊聲稱妙,便將大圣押去斬妖臺,電擊火燒,刀砍斧剁,卻傷不得大圣分毫。
玉帝見狀,不由躊躇:“這廝這等,這等……如何處治?”老君奏道:“不若與老君領去,放在八卦爐中,煉出我的丹來,何如?”玉帝聞聽大喜,便將大圣賜與老君鍛煉。殊不知大圣神通廣大,拔下一根毫毛,變做美鈔,賄賂了扇火童子,得知那巽位下有風無火,前往躲避,未曾受得重傷。
七七四十九日滿,老君開爐取丹,卻見大圣飛身而出,使金箍棒大殺四方,打得天宮中九曜星閉門閉戶,四天王無影無蹤。直打到通明殿前,玉帝見狀大驚,忙叫道:“快,關門,放協警!”原來那協警之徒,比正規警察更兇惡十倍,只見一個個奮勇爭先,踴躍咆哮,將大圣圍在垓心,眼看就要拿下。
玉帝正在慶幸,忽見協警們全做了鳥獸散,原來此輩性貪,眼中只有金銀,大圣之黃金鎖子甲在爐子中烤得甲環松脫,被眾協警一口一撕,頃刻間個個嘴里有片黃金,紛紛跑回后院掩埋收藏不提。
正沒奈何間,忽見西方如來相助,要與大圣賭賽。如來曰:“我有一樣法寶,你若能飛出我這法寶管轄,便讓你做了玉帝之位;若飛不出,便繳械投降如何?”說罷自懷中掏出法寶,悟空定睛看時,卻是一個小小本子,上書三個大字:暫住證。便笑道:“一個小小本子,有何靈能,我去也!”一個跟頭飛出,自天空降落北京地界,腳步剛落,便見幾名警察前來:“那個誰,說你呢!暫住證拿出來看看!”悟空一驚,將腰一扭,又一個跟頭飛到廣州,正在觀望,忽見一群聯防沖來:“這個好像沒有暫住證,快抓住他!”七手八腳要拿下大圣,大圣忙分開眾手,復又飛起,急切間難辨方向,卻又飛回如來面前。如來微笑道:“我的寶貝何如?”大圣道:“不算!不算!聞聽西方有國,不設暫住證,待我去來!”正要縱身跳出,卻被如來手掌一翻,將暫住證變做一座五行山,將大圣牢牢壓住。
玉帝見擒了大圣,心中大喜,便邀請如來及有功群臣,備齊飯局麻將、贓款三陪,做了一個安天大會,盛世聯歡。正行樂間,忽有五行山居委會老太來報:“那大圣伸出頭來了,說他要掙脫出去趕招聘會,投簡歷發名片,謀個職位,以圖東山再起哩!”如來道:“不妨,不妨。”袖中只取出一張帖子,上有六個金字:“此人農村戶口。”遞與手下,讓貼在那五行山頂上。又向天再借五百年,使那帖子牢牢置頂不得脫落,那座山即生根合縫,大圣再也無法爬出,自此一壓就是五百年不得翻身也。