gbk

          2009年8月10日 #

          oracle是如何工作的--非常形象

          一個(gè)名叫Sid的男人,狂熱地愛(ài)好拍攝、保存和整理照片。Sid的妻子名叫Debbie,他們有三個(gè)兒子Logan、Archie和Chuck。他有一所很大的房子,同住的有男管家Simon和女仆Pam。我將介紹他的家庭、他的房子和他的愛(ài)好:拍攝、收集和炫耀他的照片。
          現(xiàn)在,Sid快樂(lè)地生活著—家庭、朋友和假期。他不時(shí)地拍照。事實(shí)上,他總是隨身帶著相機(jī)。他不想錯(cuò)過(guò)任何東西。每一個(gè)早餐、午餐和晚宴,都會(huì)被拍下來(lái)。當(dāng)孩子們從學(xué)校回家,鏡頭攝入他們對(duì)父親的問(wèn)候。當(dāng)孩子們做家庭作業(yè)的時(shí)候,“卡嚓、卡嚓、卡嚓”,照相機(jī)的快門響個(gè)不停。棒球賽上,兒子Archie的每一個(gè)投擲都被拍攝下來(lái)。學(xué)校的舞會(huì)上,Chuck的父親拍下了每一個(gè)緩慢的舞步以及在蘇打水機(jī)器旁的交談。而他的狗——Sadie則是這個(gè)世界上被拍攝次數(shù)最多的狗。
          他和他的家庭收藏了數(shù)以百萬(wàn)計(jì)的照片。一些照片被銷毀掉了,一些則經(jīng)歷了改變。Sid有一套神奇的系統(tǒng)來(lái)處理這些照片。讓我來(lái)告訴你一些關(guān)于他的家庭、他的房子的事,以及關(guān)于他和他的家人如何致力于發(fā)展、組織和保護(hù)所有這些照片。
          Sid用一架特殊的相機(jī)拍攝。他的相機(jī)每拍攝一次,就同時(shí)產(chǎn)生一張照片和一張底片。他從來(lái)不用換膠卷(這是一種科幻技術(shù))。照片被貼在房間的墻壁上,而底片則被保存在一個(gè)安全的地方。
          1.1.1 Sid的家
          我介紹過(guò)Sid的家了嗎?嗯。那里非常的大而且到處都是照片。因?yàn)檎掌瑢?shí)在是太多了,所以Sid必須尋找地方來(lái)放置它們。一些照片被掛在墻上,一些被藏在照相簿內(nèi),一些被插入剪貼簿里,一些被放在儲(chǔ)藏室的一個(gè)盒子里再也不會(huì)被撇上一眼。所有這些照片都被放在他家中的某處。他稱呼這些放置照片的地方為“相片空間”。一個(gè)相片空間可能是一個(gè)有著很多墻壁的房間,或者是有著很多頁(yè)的剪貼簿。一個(gè)房間是照片的邏輯存儲(chǔ)單元。房間內(nèi)的墻壁則是相片空間中保存照片的物理結(jié)構(gòu)。
          1.1. 2 Debbie的家務(wù)事
          因?yàn)镾id忙于拍攝和處理照片,他沒(méi)有足夠的精力來(lái)放置和儲(chǔ)存它們—那是她妻子的工作。Debbie的全名是Debra Wrider。她的T恤衫上印著DBWR—這是一種家庭傳統(tǒng)—為所有的東西做標(biāo)簽。
          把所有這些照片放置得井井有條是一件巨大的工作,不過(guò)Sid和Debbie已經(jīng)建立了一個(gè)系統(tǒng)。當(dāng)Sid拍攝結(jié)束后,他把照片都放在廚房里一個(gè)特定的架子上。那個(gè)特定的架子被稱為“DB_BUFFER_CACHE”。Debbie時(shí)常檢查那個(gè)架子,看看上面是否有新拍攝的照片。在白天,她把從架子上取回的照片分別放置到對(duì)應(yīng)的相片空間。事實(shí)上,在一場(chǎng)棒球賽或者學(xué)校的舞會(huì)上,Sid制作照片的速度太快了。以至于Debbie幾乎跟不上。這是一個(gè)特別的情景,Sid拍攝照片,然后放置在那個(gè)特定的架子上,Debbie把這些照片放在剪貼簿里,掛在墻上或者插入照相簿內(nèi)。
          當(dāng)Sid帶著照片和底片進(jìn)入廚房時(shí),他和他妻子之間可能會(huì)有這樣的一段對(duì)話:
          Sid:“親愛(ài)的,猜猜我給你帶回來(lái)了什么?”
          Debbie:“你又拍了很多照片,是嗎?你知道我是多么喜歡整理照片啊。”
          Sid:“當(dāng)然了,Archie的棒球隊(duì)贏得了最后一局。他在第九局以兩個(gè)二壘打獲勝,我全部都拍攝下來(lái)了。”
          Debbie:“太好了,那些照片放在相片空間9號(hào)墻壁的運(yùn)動(dòng)類里,看上去一定棒極了。我已經(jīng)等不及去放置它們了,我將邀請(qǐng)所有的鄰居來(lái)觀賞。”
          Sid:“Archie也非常高興。OK,我再去拍一些照片,我將在23毫秒后回來(lái)。哦,順便說(shuō)一下,我剛才將那些照片放在DB_BUFFER_CACHE架子上。現(xiàn)在Sid的目錄號(hào)為1332935。”Debbie:“知道了,再見(jiàn)。”
          為了易于管理照片、框架和日志,他使用一種特殊的數(shù)字來(lái)建立目錄,稱之為Sid的目錄編號(hào)。他用這些獨(dú)特的、不斷遞增的數(shù)字來(lái)追蹤對(duì)這所房子內(nèi)所有照片的操作。Sid和Debbie已經(jīng)對(duì)查閱Sid的目錄編號(hào)感到厭倦。Sid在所有的照片、錄像帶和底片上都寫上“Sid的目錄編號(hào)”,累得手要抽筋。最后,他們將“Sid的目錄編號(hào)”縮略為SCN。記住SCN,Sid的生活都圍繞著它展開(kāi)。
          現(xiàn)在,全家人都知道這個(gè)數(shù)字被簡(jiǎn)稱為SCN。你可以在每一個(gè)地方都看到SCN。Sid把它們寫在底片上,然后他把低位和高位的SCN寫在每一包底片外面。Debbie把它們寫在她放置照片的地方。這些數(shù)字在Sid的復(fù)雜家庭生活中顯得尤為重要。
          Debbie把照片放在框架里,房子里的每一個(gè)框架都是一樣大小。一些框架只保存了一張照片,一些框架則保存了幾張照片。一些特別大的照片則要占據(jù)多個(gè)框架。Sid有一張和原物同樣大小的照片,拍攝的是他在跳傘后在空中做造型動(dòng)作,這張照片占據(jù)了兩個(gè)框架。當(dāng)照片跨越框架時(shí),Sid稱之為照片鏈。
          任何時(shí)候,只要Debbie改變框架內(nèi)的照片,她就把照片的SCN寫在框架上。房子內(nèi)的每張照片都有一個(gè)惟一的數(shù)字。他們稱照片的這個(gè)數(shù)字為照片ID。這些照片ID幫助Sid管理家中所有墻上的照片。如果他需要盡快找到一張照片,他通過(guò)照片ID來(lái)實(shí)現(xiàn)。通過(guò)照片ID,Sid能夠迅速找到墻壁和保存照片的框架。
          有時(shí)候,Sid會(huì)對(duì)照片進(jìn)行一些改變。如果他要編輯一張照片,那么他讓Debbie通過(guò)照片ID找到他的照片。Debbie給他一份包括所需照片的整個(gè)框架的拷貝。為防止Sid可能改變主意,不喜歡他已經(jīng)做的一些改變,他把那份拷貝放在一個(gè)儲(chǔ)藏室內(nèi),稱之為“回退”儲(chǔ)藏室。當(dāng)Sid完成了更改并且確定了以后,Debbie把更改后的照片放回到墻壁上原先的地方,并且把新的SCN寫在框架上。如果Sid不喜歡他的更改,他們就從“回退”儲(chǔ)藏室里取出框架并且把它放回墻上。這樣一來(lái),照片就和Sid沒(méi)有改動(dòng)以前一樣。
          1.1.3 Logan的家務(wù)事
          Debbie為了處理Sid的照片已經(jīng)忙得焦頭爛額,所以她沒(méi)有足夠的時(shí)間和精力來(lái)處理Sid的底片。Sid認(rèn)為他的兒子們?cè)谕骐娮佑螒蚝统酝炼蛊侠速M(fèi)了太多的時(shí)間,他決定給他們安排任務(wù)。
          Sid的大兒子叫做Logan William Randolph。Logan的襯衫上都印著LGWR。Logan有一個(gè)非常簡(jiǎn)單但是非常重要的任務(wù)。Sid的相機(jī)產(chǎn)生照片的同時(shí)產(chǎn)生了底片,Logan的任務(wù)是將底片放入筆記本里。家中的廚房里豎著另一個(gè)架子,架子上Sid貼了一個(gè)標(biāo)簽,用來(lái)標(biāo)記那些發(fā)送給大兒子的底片。標(biāo)簽被稱為“LOG_BUFFER”,Logan坐在廚房的桌子旁,觀察這個(gè)特殊的LOG_BUFFER架子。當(dāng)有底片被放到這個(gè)架子上時(shí),他立即把底片放在筆記本里。Sid稱這些筆記本為“重做筆記本”。他使用這個(gè)名稱是因?yàn)橐院笏梢杂美锩娴牡灼匦轮谱饕粡堈掌ogan檢查他的架子的頻率要比Debbie的高得多。Sid表示,只要有底片,他就可以隨時(shí)重新制作一份照片。Logan和他父親的對(duì)話簡(jiǎn)短而溫馨:
          Sid:“Logan,底片在架子上了!”
          Logan:“知道了,我會(huì)立即處理的。”
          Logan按照他得到底片的順序?qū)⑦@些底片放入“重做筆記本”。一旦當(dāng)前的筆記本裝滿了底片,他就換另一個(gè)新的筆記本。每一次他更換“重做筆記本”后,都在“告警筆記本”上做一個(gè)記錄,然后通知他的兄弟來(lái)進(jìn)行他們的家務(wù)活。
          悲哀,是不是?老爸和他的大兒子太專注于底片了!
          順便提到,不是所有的照片都有對(duì)應(yīng)的底片保存。Sid指定某些照片不必被做日志,這些照片就沒(méi)有對(duì)應(yīng)的底片保存在“重做筆記本”里。Sid稱其為“無(wú)日志”。
          1.1.4 Archie的家務(wù)事
          Sid的第二個(gè)兒子Archibald則另有任務(wù)。他的襯衫上寫著ARCH。Archie從重做筆記本里提取底片后,把它們放置在一個(gè)安全的地方。
          當(dāng)Archie發(fā)現(xiàn)Logan更換到另一個(gè)重做筆記本的時(shí)候,他就開(kāi)始行動(dòng)。他拿起重做筆記本中的那些底片,把它們放在房子外面的一個(gè)安全地方。Sid在后院建造了一個(gè)控制好溫濕的地下室。那是他保存底片的安全地點(diǎn)。如果暴風(fēng)來(lái)到,破壞了房子,他可以使用保存在地下室的底片來(lái)替換那些被損壞的照片。每一份Logan的“重做筆記本”拷貝,被稱為“歸檔的重做筆記本”。
          可能某一天,你可以聽(tīng)到Sid和他次子之間的笑談:
          Sid::“Archie?你在哪里?”
          Archie:“老爸,我在自己房間里,Logan現(xiàn)在切換筆記本了嗎?”
          Sid:“是的,他剛剛干完。”
          Archie:“知道了,老爸。我會(huì)復(fù)制這些底片并且制作一個(gè)新的筆記本放在地下室里。然后,我會(huì)更新‘控制筆記本’,并且在‘告警筆記本’里寫一個(gè)記錄。”
          Sid:“你是一個(gè)好孩子,我知道可以相信你。”
          1.1.5 Chuck的家務(wù)事
          Sid最小的兒子Chuck確保每一件事情都是同步的。他的全名是Charles Kenneth Patrick Thomas。他襯衫上的字母是CKPT,Chuck的任務(wù)是將每一面墻壁、相片冊(cè)和剪貼簿上的相片數(shù)字和控制筆記本中的數(shù)字協(xié)調(diào)起來(lái)。當(dāng)他得到信號(hào),他就開(kāi)始在房子里奔跑起來(lái),在每一面墻壁上寫下數(shù)字,同時(shí)將同樣的數(shù)字也記錄在控制筆記本里。這使得每一件事情都協(xié)調(diào)起來(lái)。以下是一段Sid和Chuck的對(duì)話:
          Sid:“hi,Chuck。”
          Chuck:“老爸,Logan又開(kāi)始更換筆記本了嗎?”
          Sid:“是的,兒子,你知道規(guī)矩。帶著目錄編號(hào)1332935跑遍房間,把這個(gè)數(shù)字寫到每一面墻壁的開(kāi)頭,每一個(gè)剪貼簿的封面和照片盒子的頂部。”
          Chuck:“沒(méi)問(wèn)題,給我?guī)孜⒚霑r(shí)間搞定”。
          Sid:“別忘記把1332935寫在控制筆記本上!”
          Chuck:“老爸,我知道了,同樣的事我一天內(nèi)已經(jīng)做過(guò)幾百次了。”
          我敢打賭,你已經(jīng)對(duì)閱讀這個(gè)瘋狂的Sid之家感到厭倦,是不是?到現(xiàn)在為止,你可能已經(jīng)看出Sid有一個(gè)功能失常的家庭。功能失常?是的!不過(guò)卻有效而可靠。Sid喜歡這樣。
          1.1.6控制筆記本
          這個(gè)家庭怎樣維持所有這些活動(dòng)?Sid、Debbie、Logan、Archie和Chuck斷定,要想把這項(xiàng)照片收集和整理工作處理的井井有條,必須要制作很多詳細(xì)的筆記。他們每個(gè)人都把自己的東西寫入一個(gè)日志,稱之為“控制筆記本”。
          控制筆記本有一個(gè)記錄整個(gè)房子中每一堵墻壁、剪貼簿和照片盒子的家庭財(cái)產(chǎn)清單條目。如果Sid增加了一個(gè)房間,來(lái)放置更多的照片,他在控制筆記本里做一個(gè)記錄。當(dāng)Logan更換重做筆記本時(shí),他在控制筆記本里做摘要記錄。每次Archie制作一個(gè)歸檔的重做筆記本放入地下室時(shí),他把名字和SCN的范圍寫在控制筆記本里。每次Chuck在房子里跑完一圈,他把細(xì)節(jié)也記錄在控制筆記本里。這特殊的筆記本動(dòng)態(tài)保存了所有地方的資產(chǎn)情況,和房子里以數(shù)字表示的進(jìn)程。
          1.1.7告警日志
          時(shí)不時(shí)的總會(huì)有些意外發(fā)生,也可能出現(xiàn)錯(cuò)誤。Debbie可能在把照片放進(jìn)框架的時(shí)候發(fā)生問(wèn)題,因?yàn)槟敲鎵ι弦呀?jīng)沒(méi)有多余的空間了。Archie可能無(wú)法折疊起底片條,因?yàn)橛腥税烟K打水噴在上面。Sid考慮到了所有的可能,他買了一個(gè)螺旋軸的筆記本,放在廚房的抽屜里。在筆記本的面子上寫上“告警日志”。每一個(gè)家庭成員將遇到的問(wèn)題寫在這個(gè)日志里。他們不僅要記下發(fā)生的錯(cuò)誤,還要記下正常的活動(dòng)過(guò)程。這個(gè)告警日志是一個(gè)用來(lái)保存在Sid家里已經(jīng)和即將發(fā)生的事情的便利場(chǎng)所。如果他們要解釋某個(gè)情形下額外的細(xì)節(jié),他們制作一個(gè)新的“追蹤筆記本”,把信息記錄在里面。這樣一來(lái),這個(gè)告警筆記本不會(huì)變得比它原先的樣子更雜亂。
          1.1.8清晨程序
          全家早晨一起醒來(lái),也總是同時(shí)上床睡覺(jué)。他們稱這些時(shí)間為一天的“啟動(dòng)”和“關(guān)閉”。下面是早晨的啟動(dòng)程序:
          Sid從床上起來(lái),端上一杯咖啡開(kāi)始他的一天。在咖啡壺邊上,他將一系列指令保存在筆記本里,稱之為初始化參數(shù)文件。閱讀這列指令幫助他開(kāi)始新的一天。啜著咖啡,他走過(guò)去確認(rèn)控制筆記本是否放在老地方。他在房子里打轉(zhuǎn)叫醒Debbie、Chuck、Logan、Archie、Simon和Pamela(你很快就會(huì)遇到他們)。
          當(dāng)每一個(gè)人都醒來(lái)后,就打開(kāi)控制筆記本。確認(rèn)根據(jù)控制筆記本的內(nèi)容,所有的照片墻壁都沒(méi)有問(wèn)題,當(dāng)所有的東西都被檢查過(guò)以后,他打開(kāi)房子迎接賓客,并開(kāi)始拍攝照片。Sid雇傭了一個(gè)男管家,Simon,在早晨幫助他,Simon的燕尾服上寫著字母SMON(省掉名字里的一個(gè)字母)。有些早晨房子里特別凌亂,因?yàn)樵谇耙粋€(gè)就寢時(shí)間,家庭的每一個(gè)成員都沒(méi)有及時(shí)清理好各自的事物。當(dāng)Simon就位后,Sid打開(kāi)窗簾,掛好電話,打開(kāi)門鎖,他的家庭開(kāi)放,準(zhǔn)備好了迎接客人。Sid和Simon可能這樣開(kāi)始一天:
          Simon:“早上好,先生。我今天能幫你做什么嗎?”
          Sid:“是的Simon,早上好。看來(lái)我們這里很凌亂啊。我們昨天晚上突然中斷了。你能否處理一下所有這些沒(méi)有完成的照片和‘回退’。”
          Simon:“當(dāng)然了,所有這些底片在重做筆記本里的都要被重新制作,然后以簡(jiǎn)單的順序放置在正確的框架里。”
          Sid:“你處理完這些后,接著處理‘回退’,是嗎?”
          Simon:“當(dāng)然了,先生。我從回退儲(chǔ)藏室里取出照片框架,然后把舊的版本放回它們?cè)瓉?lái)的地方。”
          Sid:“太棒了,你完成后,我就打開(kāi)房子。”
          1.1.9夜間程序
          Sid家的夜間程序也很有趣。當(dāng)Sid躺下準(zhǔn)備休息的時(shí)候,他要求家里所有的東西都放好、關(guān)掉和停下。就寢時(shí)間的第一個(gè)行動(dòng)是要求房子里所有的客人回家去。Sid晚上的情緒有四種情況。第一種,有時(shí)他很有耐性,等待所有的男女客人自行離去后,再就寢;第二種,Sid沒(méi)有耐性,他親自來(lái)監(jiān)督每一個(gè)客人,當(dāng)客人干完各自的事情(看照片等等)后,他給客人指示出門的方向;第三種,Sid非常沒(méi)有耐性,他揪著客人陪他們出門,不讓他們干完正在干的事;第四種,Sid拉下房子的電閘,大叫“時(shí)間到”,房子里一片狼藉。Simon不得不在第二天早晨來(lái)清理混亂的場(chǎng)面。
          當(dāng)一個(gè)客人走后留下一團(tuán)糟時(shí),Sid叫來(lái)他的女傭PamelaMonica。她監(jiān)控客人的活動(dòng),并且在客人走后處理善后。她的清潔設(shè)備上貼著標(biāo)簽PMON。
          如果Sid沒(méi)有突然拉閘,每個(gè)人都打開(kāi)燈,進(jìn)行清理。同步處理筆記本來(lái)完成各自的任務(wù)。Debbie從DB_BUFFER_CACHE架子上取走所有的照片,放到合適的墻壁上。Logan確
          保LOG_BUFFER架子是空的,所有的底片都在當(dāng)前的重做筆記本里。Chuck在房子里兜一圈,用最高和最低的目錄編號(hào)(SCN)來(lái)更新墻壁和筆記本。Archie把最后的那張底片放入歸檔的重做筆記本,放到后院的地下室。然后更新控制和告警筆記本。當(dāng)每個(gè)人都干完后,Sid關(guān)燈,大伙兒睡覺(jué)。
          1.1.10 Sid的問(wèn)題
          有時(shí)候,Sid家會(huì)出現(xiàn)問(wèn)題。當(dāng)以下這些事件中任何一件發(fā)生時(shí),房子里的活動(dòng)就會(huì)停止。
          •當(dāng)Sid醒來(lái),而他無(wú)法找到初始化文件,則無(wú)法開(kāi)始一天的工作。
          •有時(shí),Sid需要用Archie保存在后院地下室的底片來(lái)恢復(fù)丟失的照片,如果他丟失了一張底片,或者在恢復(fù)過(guò)程中底片遭到破壞。他無(wú)法恢復(fù)任何在那張無(wú)效底片以后拍攝
          的所有照片。
          •Sid一次丟失了幾張底片。他不小心打開(kāi)相機(jī),曝光了膠卷。這使得他情緒極壞,他的世界好像走到了盡頭。他聯(lián)系了照相機(jī)廠家,他們提供了一個(gè)特殊的照相機(jī),帶有兩個(gè)膠卷艙。如此一來(lái),萬(wàn)一膠卷破壞了,他還可以指望另一個(gè)艙內(nèi)的膠卷。Sid稱之為鏡像。
          •如果后院的地下室滿了,Archie沒(méi)有空間來(lái)放置新的底片。Archie只是在地下室里等著新的空間。這使得Sid和Debbie也跟著等待,整個(gè)Sid的家庭活動(dòng)陷于停頓狀態(tài)。
          •如果Debbie得了流感,臥病在床。你猜猜看會(huì)怎么樣:Sid瘋狂地關(guān)上了門。盡管有這些問(wèn)題和其他一些家庭挫折及功能失常,但Sid的家庭仍然可以處理百萬(wàn)計(jì)的照片和數(shù)以千計(jì)的同時(shí)到訪的客人。
          和我一樣,你可能會(huì)想知道,Sid怎么會(huì)有那么多的時(shí)間和精力來(lái)進(jìn)行照片收集活動(dòng)。他沒(méi)有工作嗎?事實(shí)上,沒(méi)有。錢不是Sid的目標(biāo)。他不必工作。他在幾年以前完成了一個(gè)聰明的投資。他在1984年以后買入了大量的電腦公司的股票,那時(shí)它們剛開(kāi)始向公眾發(fā)行。他所投資的公司總部在加利福尼亞州的紅樹(shù)海岸。
          在介紹了Sid的家庭后,你會(huì)發(fā)現(xiàn)他為家庭的所有活動(dòng)設(shè)計(jì)了結(jié)構(gòu)。就像這個(gè)家庭的活動(dòng)一樣,Oracle數(shù)據(jù)庫(kù)也有空間、過(guò)程和程序。在腦中與這個(gè)家庭類比,我現(xiàn)在簡(jiǎn)短地描述Oracle數(shù)據(jù)庫(kù)體系結(jié)構(gòu)、過(guò)程和操作中屬于Oracle數(shù)據(jù)備份和恢復(fù)的部分。可能你會(huì)發(fā)現(xiàn)和Sid家的相似之處。

          posted @ 2009-08-10 15:08 百科 閱讀(316) | 評(píng)論 (0)編輯 收藏

          2008年10月28日 #

          adobe flex

          posted @ 2008-10-28 17:27 百科 閱讀(227) | 評(píng)論 (0)編輯 收藏

          2008年10月7日 #

          JBoss Seam--Java最優(yōu)秀的快速開(kāi)發(fā)框架之一

          JBoss Seam,算得上是Java開(kāi)源框架里面最優(yōu)秀的快速開(kāi)發(fā)框架之一

          一、Seam適應(yīng)快速開(kāi)發(fā)、簡(jiǎn)化框架的趨勢(shì)

          在RoR 流行之前,Java社區(qū)的主流還是非常講究分層、架構(gòu)、復(fù)用和模式,而比較忽視快速開(kāi)發(fā)和簡(jiǎn)化架構(gòu)的,其結(jié)果就是代碼量大、開(kāi)發(fā)周期長(zhǎng)、架構(gòu)相當(dāng)煩瑣。以比較常見(jiàn)的Struts/Spring/Hibernate為例,從大的分層來(lái)說(shuō)就有Web層、業(yè)務(wù)層和持久層,從細(xì)的分層就從前到后有:View(JSP) -> Struts Action -> Spring Business Object Bean -> Spring DAO Bean -> Hibernate Persistent Object。如果有Remoting調(diào)用,那么還需要相應(yīng)的Service Facade層。每層都是用不同的技術(shù)框架或者模式、各層之間整合的方式也是五花八門。把整個(gè)項(xiàng)目的架構(gòu)搭建起來(lái),已經(jīng)是非常麻煩的事情了。

          Seam 給我的感覺(jué)像是一個(gè)異常簡(jiǎn)單的MVC框架,他實(shí)際上只有兩層:JSF View和 Seam Component。而Seam Component有兩類:一類是Entity Bean,另一類就是Session Bean。Entity Bean映射數(shù)據(jù)庫(kù)表,Session Bean完成所有的業(yè)務(wù)邏輯,包括可能的持久化,事務(wù),響應(yīng)頁(yè)面請(qǐng)求、商業(yè)邏輯,頁(yè)面流控制等等。配置文件也不多,除了一堆基礎(chǔ)的配置文件,唯一一個(gè)需要不斷修改的就是pages.xml了,即配置JSF的view映射。



          所以Seam開(kāi)發(fā)項(xiàng)目看起來(lái)很簡(jiǎn)單、很直接,無(wú)分層之苦惱。相應(yīng)的也會(huì)讓程序員把精力主要放在業(yè)務(wù)邏輯組件的實(shí)現(xiàn)上,而不是把精力浪費(fèi)在架構(gòu)、分層、模式和基礎(chǔ)設(shè)施搭建的工作上面。

          二、Seam的數(shù)據(jù)綁定做的很出色

          由于是一個(gè)簡(jiǎn)單的兩層結(jié)構(gòu),View和Component之
          間的數(shù)據(jù)綁定做的很出色,看起來(lái)比我欣賞的Webwork的數(shù)據(jù)綁定方式更勝一籌。官 方的說(shuō)法叫做雙向依賴注入,在component里面可以直接取到頁(yè)面提交的數(shù)據(jù),在頁(yè)面也可以直接訪問(wèn)component數(shù)據(jù)。

          另外持久化數(shù)據(jù)的校驗(yàn)也直接集成好了,在EntityBean里面聲明數(shù)據(jù)的約束,在頁(yè)面就可以直接校驗(yàn)了,和RoR的數(shù)據(jù)校驗(yàn)方式是一樣的,當(dāng)然這也得益于Gavin King是Seam和Hibernate兩個(gè)項(xiàng)目的作者的緣故。

          三、Seam的組件機(jī)制看起來(lái)相當(dāng)好用

          既然Seam簡(jiǎn)化了分層,實(shí)際上把主要的工作都推到組件層去完成了。但是Seam的組件層看起來(lái)很簡(jiǎn)單,這得益于Seam的組件機(jī)制設(shè)計(jì)了很多的組件狀態(tài),根據(jù)不同的組件狀態(tài),天然的劃分了不同組件的功能和邏輯。

          Seam 的組件有點(diǎn)類似于把傳統(tǒng)MVC的Action和Spring的Bean合二為一了,但還是不同于傳統(tǒng)的MVC框架下面的Action:傳 統(tǒng)的MVC Action是基于頁(yè)面請(qǐng)求的,無(wú)法復(fù)用,而Seam的組件是事件驅(qū)動(dòng)方式,它只需要捕獲和實(shí)現(xiàn)事件代碼就可以了,至于怎么觸發(fā)它并不需要知道,他和 Web層可以不綁定,因此理論上面來(lái)說(shuō)是可以實(shí)現(xiàn)組件復(fù)用的。我個(gè)人認(rèn)為Seam的這個(gè)組件機(jī)制非常巧妙,既可以用來(lái)實(shí)現(xiàn)響應(yīng)頁(yè)面事件,綁定頁(yè)面數(shù)據(jù)的所謂Web Bean,也可以用來(lái)實(shí)現(xiàn)和Web沒(méi)有任何關(guān)系的純業(yè)務(wù)邏輯組件,一個(gè)很漂亮的實(shí)現(xiàn)。

          另外Seam的組件注入機(jī)制看起來(lái)也很簡(jiǎn)單,不像Spring那樣麻煩,而且內(nèi)置了很多現(xiàn)成的組件進(jìn)來(lái),直接用Annotation聲明一下就可以用了,感覺(jué)寫組件真的很方便、很靈活、很強(qiáng)大。

          四、Seam把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝完全隱藏起來(lái)了

          Spring 的數(shù)據(jù)庫(kù)資源管理和事務(wù)封裝是通過(guò)提供了一系列的代理類以及配置文件來(lái)實(shí)現(xiàn)的,程序員還是要通過(guò)配置文件的方式來(lái)手工管理事務(wù),訪問(wèn)數(shù)據(jù)庫(kù)也必須通過(guò)Template編寫匿名內(nèi)部類來(lái)實(shí)現(xiàn),而且在Spring/Hibernate框架下面,OpenSessionInView是一個(gè)很討厭的問(wèn)題。

          但是Seam已經(jīng)把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝全部都隱藏起來(lái)了,程序員完全不需要知道,也不需要操心這些事情,這真是個(gè)大大的解放。當(dāng)然 Seam可以做到這一點(diǎn),也無(wú)非是因?yàn)镾eam提供了一套上至View層,下至持久層完整的框架,因此可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在框架內(nèi)部,不暴露給程序員。 Spring之所以做不到這一點(diǎn),也因?yàn)樗怀洚?dāng)了一個(gè)黏合劑,不能夠直接修改View層和持久層帶來(lái)的限制。

          五、Seam對(duì)第三方框架的整合看起來(lái)比Spring更深入

          原來(lái)印象當(dāng)中只有Spring才提供了一站式的解決方案,這次一看Seam文檔,呵!發(fā)現(xiàn)Seam也都齊全了,什么郵件啦、工作流啦、頁(yè)面流啦、規(guī)則引擎啦、異步任務(wù)調(diào)度啦、消息系統(tǒng)啦、Web服務(wù)啦、遠(yuǎn)程調(diào)用啦、甚至全文檢索啦全部都集成了。而且集成的比Spring更深入一些,例如Java EE本身的JMS,MDB自然是Seam的強(qiáng)項(xiàng),而JBoss自家的JBPM,JPDL,Rules集成的更加沒(méi)得說(shuō)。


          從整合角度來(lái)說(shuō),感覺(jué)Spring和Seam的出發(fā)點(diǎn)不同:Spring更像一個(gè)平臺(tái),我提供整合的可能性,然后程序員你自家去整合,我提供一些寫好的整合bean,對(duì)于這些你通過(guò)XML配置一下就整合進(jìn)來(lái)了,如果我沒(méi)有提供bean的,那么你也可以自己寫bean來(lái)整合。而Seam更像一個(gè)完整的框架而不是平臺(tái),我這個(gè)框架想提供的功能,框架自身就已經(jīng)整合好了,你直接用就是了,你也可以自己寫擴(kuò)展來(lái)整合,但是這個(gè)不是Seam希望程序員做的事情。

          因此對(duì)于程序員的感覺(jué)來(lái)說(shuō),Spring給你提供了一切的零件和半成品,但你要自己動(dòng)手來(lái)組裝,而Seam已經(jīng)給你裝好了一個(gè)成品,你就別自己改裝了,直接拿去用吧。

          六、Seam提供了方便的代碼生成器

          和appfuse 類似,可以直接用ant task來(lái)生成一個(gè)完整項(xiàng)目的骨架,以及相應(yīng)的組件代碼生成器,利用seam-gen可以快速生成一個(gè)完整的、帶有AJAX功能的CRUD項(xiàng)目,而且還是一個(gè)eclipse或者netbeans工程,你可以直接用IDE打開(kāi)編輯了。這功能雖然不太難做,但是對(duì)于程序員來(lái)說(shuō),幫助是很大的。Seam做的相當(dāng)不錯(cuò)。


          以上是我對(duì)Seam的一點(diǎn)小小的贊許,當(dāng)然我也有一點(diǎn)疑問(wèn):

          一、Seam的View實(shí)現(xiàn)是JSF,看頁(yè)面代碼還是密密麻麻的Tag

          我是非常反感JSP Tag的,看看頁(yè)面密密麻麻的Tag就頭皮發(fā)麻,能不能弄一個(gè)Template呀,例如freemarker啥的?這些Tag既不直觀,也不方便擴(kuò)展。需要擴(kuò)展頁(yè)面組件,總不能讓我自定義Tag去干活吧?不清楚這個(gè)問(wèn)題怎么辦?像freeamarker還可以方便的自定義頁(yè)面宏呢。

          二、每次修改都要重新打包發(fā)布,太麻煩了吧

          就算修改一個(gè)頁(yè)面,也要整個(gè)打包deploy成為一個(gè)ear去拷貝到j(luò)boss的應(yīng)用目錄下面,這個(gè)要是改頁(yè)面,不是得煩死? 我以前都是在項(xiàng)目里面直接內(nèi)嵌Jetty,作為一個(gè)application啟動(dòng),修改頁(yè)面根本無(wú)需重起呀,更不要說(shuō)deploy了。

          總體來(lái)說(shuō),我覺(jué)得Seam框架非常出色,尤其是他的組件機(jī)制設(shè)計(jì)的很有匠心,真不愧是Gavin King精心打造的框架了,雖然看起來(lái)還是有些缺陷,但是做企業(yè)應(yīng)用項(xiàng)目的話,Seam是一個(gè)很棒的選擇,作為程序員來(lái)說(shuō),要比用 Spring/Hibernate/Struts省心的多,更能夠把精力放在業(yè)務(wù)邏輯的編寫上面,開(kāi)發(fā)效率也很不錯(cuò),可能是Java開(kāi)源框架里面最優(yōu)秀的快速開(kāi)發(fā)框架之一了

          posted @ 2008-10-07 16:38 百科 閱讀(546) | 評(píng)論 (0)編輯 收藏

          JBoss Seam--Java最優(yōu)秀的快速開(kāi)發(fā)框架之一

          JBoss Seam,算得上是Java開(kāi)源框架里面最優(yōu)秀的快速開(kāi)發(fā)框架之一

          一、Seam適應(yīng)快速開(kāi)發(fā)、簡(jiǎn)化框架的趨勢(shì)

          在RoR 流行之前,Java社區(qū)的主流還是非常講究分層、架構(gòu)、復(fù)用和模式,而比較忽視快速開(kāi)發(fā)和簡(jiǎn)化架構(gòu)的,其結(jié)果就是代碼量大、開(kāi)發(fā)周期長(zhǎng)、架構(gòu)相當(dāng)煩瑣。以比較常見(jiàn)的Struts/Spring/Hibernate為例,從大的分層來(lái)說(shuō)就有Web層、業(yè)務(wù)層和持久層,從細(xì)的分層就從前到后有:View(JSP) -> Struts Action -> Spring Business Object Bean -> Spring DAO Bean -> Hibernate Persistent Object。如果有Remoting調(diào)用,那么還需要相應(yīng)的Service Facade層。每層都是用不同的技術(shù)框架或者模式、各層之間整合的方式也是五花八門。把整個(gè)項(xiàng)目的架構(gòu)搭建起來(lái),已經(jīng)是非常麻煩的事情了。

          Seam 給我的感覺(jué)像是一個(gè)異常簡(jiǎn)單的MVC框架,他實(shí)際上只有兩層:JSF View和 Seam Component。而Seam Component有兩類:一類是Entity Bean,另一類就是Session Bean。Entity Bean映射數(shù)據(jù)庫(kù)表,Session Bean完成所有的業(yè)務(wù)邏輯,包括可能的持久化,事務(wù),響應(yīng)頁(yè)面請(qǐng)求、商業(yè)邏輯,頁(yè)面流控制等等。配置文件也不多,除了一堆基礎(chǔ)的配置文件,唯一一個(gè)需要不斷修改的就是pages.xml了,即配置JSF的view映射。



          所以Seam開(kāi)發(fā)項(xiàng)目看起來(lái)很簡(jiǎn)單、很直接,無(wú)分層之苦惱。相應(yīng)的也會(huì)讓程序員把精力主要放在業(yè)務(wù)邏輯組件的實(shí)現(xiàn)上,而不是把精力浪費(fèi)在架構(gòu)、分層、模式和基礎(chǔ)設(shè)施搭建的工作上面。

          二、Seam的數(shù)據(jù)綁定做的很出色

          由于是一個(gè)簡(jiǎn)單的兩層結(jié)構(gòu),View和Component之
          間的數(shù)據(jù)綁定做的很出色,看起來(lái)比我欣賞的Webwork的數(shù)據(jù)綁定方式更勝一籌。官 方的說(shuō)法叫做雙向依賴注入,在component里面可以直接取到頁(yè)面提交的數(shù)據(jù),在頁(yè)面也可以直接訪問(wèn)component數(shù)據(jù)。

          另外持久化數(shù)據(jù)的校驗(yàn)也直接集成好了,在EntityBean里面聲明數(shù)據(jù)的約束,在頁(yè)面就可以直接校驗(yàn)了,和RoR的數(shù)據(jù)校驗(yàn)方式是一樣的,當(dāng)然這也得益于Gavin King是Seam和Hibernate兩個(gè)項(xiàng)目的作者的緣故。

          三、Seam的組件機(jī)制看起來(lái)相當(dāng)好用

          既然Seam簡(jiǎn)化了分層,實(shí)際上把主要的工作都推到組件層去完成了。但是Seam的組件層看起來(lái)很簡(jiǎn)單,這得益于Seam的組件機(jī)制設(shè)計(jì)了很多的組件狀態(tài),根據(jù)不同的組件狀態(tài),天然的劃分了不同組件的功能和邏輯。

          Seam 的組件有點(diǎn)類似于把傳統(tǒng)MVC的Action和Spring的Bean合二為一了,但還是不同于傳統(tǒng)的MVC框架下面的Action:傳 統(tǒng)的MVC Action是基于頁(yè)面請(qǐng)求的,無(wú)法復(fù)用,而Seam的組件是事件驅(qū)動(dòng)方式,它只需要捕獲和實(shí)現(xiàn)事件代碼就可以了,至于怎么觸發(fā)它并不需要知道,他和 Web層可以不綁定,因此理論上面來(lái)說(shuō)是可以實(shí)現(xiàn)組件復(fù)用的。我個(gè)人認(rèn)為Seam的這個(gè)組件機(jī)制非常巧妙,既可以用來(lái)實(shí)現(xiàn)響應(yīng)頁(yè)面事件,綁定頁(yè)面數(shù)據(jù)的所謂Web Bean,也可以用來(lái)實(shí)現(xiàn)和Web沒(méi)有任何關(guān)系的純業(yè)務(wù)邏輯組件,一個(gè)很漂亮的實(shí)現(xiàn)。

          另外Seam的組件注入機(jī)制看起來(lái)也很簡(jiǎn)單,不像Spring那樣麻煩,而且內(nèi)置了很多現(xiàn)成的組件進(jìn)來(lái),直接用Annotation聲明一下就可以用了,感覺(jué)寫組件真的很方便、很靈活、很強(qiáng)大。

          四、Seam把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝完全隱藏起來(lái)了

          Spring 的數(shù)據(jù)庫(kù)資源管理和事務(wù)封裝是通過(guò)提供了一系列的代理類以及配置文件來(lái)實(shí)現(xiàn)的,程序員還是要通過(guò)配置文件的方式來(lái)手工管理事務(wù),訪問(wèn)數(shù)據(jù)庫(kù)也必須通過(guò)Template編寫匿名內(nèi)部類來(lái)實(shí)現(xiàn),而且在Spring/Hibernate框架下面,OpenSessionInView是一個(gè)很討厭的問(wèn)題。

          但是Seam已經(jīng)把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝全部都隱藏起來(lái)了,程序員完全不需要知道,也不需要操心這些事情,這真是個(gè)大大的解放。當(dāng)然 Seam可以做到這一點(diǎn),也無(wú)非是因?yàn)镾eam提供了一套上至View層,下至持久層完整的框架,因此可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在框架內(nèi)部,不暴露給程序員。 Spring之所以做不到這一點(diǎn),也因?yàn)樗怀洚?dāng)了一個(gè)黏合劑,不能夠直接修改View層和持久層帶來(lái)的限制。

          五、Seam對(duì)第三方框架的整合看起來(lái)比Spring更深入

          原來(lái)印象當(dāng)中只有Spring才提供了一站式的解決方案,這次一看Seam文檔,呵!發(fā)現(xiàn)Seam也都齊全了,什么郵件啦、工作流啦、頁(yè)面流啦、規(guī)則引擎啦、異步任務(wù)調(diào)度啦、消息系統(tǒng)啦、Web服務(wù)啦、遠(yuǎn)程調(diào)用啦、甚至全文檢索啦全部都集成了。而且集成的比Spring更深入一些,例如Java EE本身的JMS,MDB自然是Seam的強(qiáng)項(xiàng),而JBoss自家的JBPM,JPDL,Rules集成的更加沒(méi)得說(shuō)。


          從整合角度來(lái)說(shuō),感覺(jué)Spring和Seam的出發(fā)點(diǎn)不同:Spring更像一個(gè)平臺(tái),我提供整合的可能性,然后程序員你自家去整合,我提供一些寫好的整合bean,對(duì)于這些你通過(guò)XML配置一下就整合進(jìn)來(lái)了,如果我沒(méi)有提供bean的,那么你也可以自己寫bean來(lái)整合。而Seam更像一個(gè)完整的框架而不是平臺(tái),我這個(gè)框架想提供的功能,框架自身就已經(jīng)整合好了,你直接用就是了,你也可以自己寫擴(kuò)展來(lái)整合,但是這個(gè)不是Seam希望程序員做的事情。

          因此對(duì)于程序員的感覺(jué)來(lái)說(shuō),Spring給你提供了一切的零件和半成品,但你要自己動(dòng)手來(lái)組裝,而Seam已經(jīng)給你裝好了一個(gè)成品,你就別自己改裝了,直接拿去用吧。

          六、Seam提供了方便的代碼生成器

          和appfuse 類似,可以直接用ant task來(lái)生成一個(gè)完整項(xiàng)目的骨架,以及相應(yīng)的組件代碼生成器,利用seam-gen可以快速生成一個(gè)完整的、帶有AJAX功能的CRUD項(xiàng)目,而且還是一個(gè)eclipse或者netbeans工程,你可以直接用IDE打開(kāi)編輯了。這功能雖然不太難做,但是對(duì)于程序員來(lái)說(shuō),幫助是很大的。Seam做的相當(dāng)不錯(cuò)。


          以上是我對(duì)Seam的一點(diǎn)小小的贊許,當(dāng)然我也有一點(diǎn)疑問(wèn):

          一、Seam的View實(shí)現(xiàn)是JSF,看頁(yè)面代碼還是密密麻麻的Tag

          我是非常反感JSP Tag的,看看頁(yè)面密密麻麻的Tag就頭皮發(fā)麻,能不能弄一個(gè)Template呀,例如freemarker啥的?這些Tag既不直觀,也不方便擴(kuò)展。需要擴(kuò)展頁(yè)面組件,總不能讓我自定義Tag去干活吧?不清楚這個(gè)問(wèn)題怎么辦?像freeamarker還可以方便的自定義頁(yè)面宏呢。

          二、每次修改都要重新打包發(fā)布,太麻煩了吧

          就算修改一個(gè)頁(yè)面,也要整個(gè)打包deploy成為一個(gè)ear去拷貝到j(luò)boss的應(yīng)用目錄下面,這個(gè)要是改頁(yè)面,不是得煩死? 我以前都是在項(xiàng)目里面直接內(nèi)嵌Jetty,作為一個(gè)application啟動(dòng),修改頁(yè)面根本無(wú)需重起呀,更不要說(shuō)deploy了。

          總體來(lái)說(shuō),我覺(jué)得Seam框架非常出色,尤其是他的組件機(jī)制設(shè)計(jì)的很有匠心,真不愧是Gavin King精心打造的框架了,雖然看起來(lái)還是有些缺陷,但是做企業(yè)應(yīng)用項(xiàng)目的話,Seam是一個(gè)很棒的選擇,作為程序員來(lái)說(shuō),要比用 Spring/Hibernate/Struts省心的多,更能夠把精力放在業(yè)務(wù)邏輯的編寫上面,開(kāi)發(fā)效率也很不錯(cuò),可能是Java開(kāi)源框架里面最優(yōu)秀的快速開(kāi)發(fā)框架之一了

          posted @ 2008-10-07 16:38 百科 閱讀(288) | 評(píng)論 (0)編輯 收藏

          2008年6月10日 #

          jsp request get的對(duì)象

          request.getScheme() —— http
          request.getServerName() —— localhost
          request.getServerPort() —— 8080
          request.getContextPath() —— /vote
          request.getProtocol() —— HTTP/1.1
          request.getRemoteAddr() —— 127.0.0.1
          request.getRemoteHost() —— 127.0.0.1
          request.getRemotePort() —— 1316
          request.getRequestURI() —— /vote/test.jsp
          request.getRequestURL() —— http://localhost:8080/vote/test.jsp
          request.getServletPath() —— /test.jsp  

          posted @ 2008-06-10 14:34 百科 閱讀(714) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題  

          My Links

          Blog Stats

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 白朗县| 洛隆县| 响水县| 塔河县| 佛山市| 晋州市| 宁德市| 宁都县| 扶风县| 胶南市| 永仁县| 珲春市| 清镇市| 大洼县| 金山区| 宁波市| 鸡东县| 顺平县| 高邑县| 花莲县| 越西县| 玉门市| 黎平县| 鄂州市| 乌兰察布市| 娄底市| 通榆县| 日喀则市| 彭泽县| 大厂| 宁德市| 曲松县| 卓资县| 营山县| 左权县| 镶黄旗| 福安市| 汤原县| 原阳县| 临澧县| 巴塘县|