<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Kimi's NutShell

    我荒廢的今日,正是昨日殞身之人祈求的明日

    BlogJava 新隨筆 管理
      141 Posts :: 0 Stories :: 75 Comments :: 0 Trackbacks

    表現(xiàn)層框架Struts/Tapestry/JSF比較



    Struts/Tapestry/JSF是目前J2EE表現(xiàn)層新老組合的框架技術(shù)。從誕生時(shí)間上看,Struts應(yīng)該比較早,使用得非常廣泛,Tapestry 3.0逐漸引起廣泛的重視,正當(dāng)Tapestry即將大顯身手時(shí)期,SUN推出JSF標(biāo)準(zhǔn)技術(shù),雖然JSF一開(kāi)始推出尚不成熟,留出了一段空白期,但是隨著JSF1.1標(biāo)準(zhǔn)推出,JSF開(kāi)始正面出擊,粉面隆重登場(chǎng)了。

      其實(shí),JSF和Tapestry也并不是那種頭碰頭的相同競(jìng)爭(zhēng)性技術(shù),兩者還是各有側(cè)重點(diǎn)的,不過(guò)比較細(xì)微,但是這種細(xì)微點(diǎn)在實(shí)現(xiàn)一個(gè)大工程時(shí)可能帶來(lái)不同的感受和變化。

      首先,我們從一個(gè)高度來(lái)抽象一下表現(xiàn)層框架應(yīng)有的技術(shù)架構(gòu),下圖可以說(shuō)所有表現(xiàn)層框架技術(shù)都必須實(shí)現(xiàn)的功能架構(gòu)圖:

      當(dāng)然,我們不必廢話羅嗦MVC模式,MVC模式是基準(zhǔn)模式,現(xiàn)在框架技術(shù)已經(jīng)不必再拼是否是MVC模式了。 在上圖MVC模式基礎(chǔ)上,一個(gè)表現(xiàn)層框架無(wú)外乎要實(shí)現(xiàn)圖中的三個(gè)功能:

      1.在當(dāng)前頁(yè)面能夠顯示一個(gè)組件對(duì)象的內(nèi)容;而不是象純JSP那樣,需要在Jsp頁(yè)面寫(xiě)入“調(diào)用對(duì)象方法”的Java代碼。

      2.當(dāng)用戶按下頁(yè)面的提交按扭或鏈接后,事件發(fā)生,這時(shí)應(yīng)該觸發(fā)服務(wù)器端并將當(dāng)前頁(yè)面的參數(shù)提交給服務(wù)器。這種機(jī)制表現(xiàn)在Form表單提交和有參數(shù)的鏈接<a href=""></a>

      3.從一個(gè)頁(yè)面視圖直接跳轉(zhuǎn)到另外一個(gè)頁(yè)面視圖,單純的導(dǎo)航作用。

      我們通過(guò)下表來(lái)比較這 三種框架在實(shí)現(xiàn)上圖各個(gè)功能時(shí)技術(shù)細(xì)節(jié),從而得出他們的異同點(diǎn)和偏重點(diǎn)。

    ? Struts Tapestry3.0 JSF
    在View顯示的組件要求

    組件必須繼承ActionForm

    分顯式調(diào)用和隱式調(diào)用
    組件必須繼承BaseComponent
    普通POJO
    無(wú)需繼承
    Managed Bean
    組件在View顯示粒度 View頁(yè)面只能顯示與表單對(duì)應(yīng)的ActionForm,配置中Action ActionForm 頁(yè)面一般只能1:1:1關(guān)系。 可將組件嵌入頁(yè)面任何一行,對(duì)使用組件數(shù)量無(wú)限制。 同Tapestry
    頁(yè)面分區(qū)tiles 使用Tiles標(biāo)簽庫(kù)實(shí)現(xiàn),需要另外tiles-def.xml配置文件 組件有自己的視圖頁(yè)面,通過(guò)調(diào)用組件即直接實(shí)現(xiàn)多個(gè)頁(yè)面組合。強(qiáng)大自然的頁(yè)面組合是其特點(diǎn)。 通過(guò)組件+標(biāo)簽庫(kù)實(shí)現(xiàn)Subview,但如需重用Layout,還要結(jié)合Tiles.
    頁(yè)面跳轉(zhuǎn) 使用標(biāo)簽庫(kù)html:link中寫(xiě)明目標(biāo)URL,URL名稱需要對(duì)照配置文件的path命名,與組件Action耦合。 URL名稱是目標(biāo)的組件名稱,不涉及URL和路徑等操作,方便穩(wěn)固。 類似Struts,也需要在配置文件中查找,與組件分離。
    參數(shù)傳遞 使用html:link時(shí)傳遞參數(shù)超過(guò)一個(gè)以上處理麻煩。 直接調(diào)用組件,直接賦予參數(shù),沒(méi)有參數(shù)個(gè)數(shù)限制 參數(shù)分離傳遞給組件
    事件觸發(fā) 通過(guò)表單提交submit激活,不能細(xì)化到表單里字段。 能夠給于表單每個(gè)字段貼一個(gè)事件,事件組件必須實(shí)現(xiàn)PageListener接口 同Tapestry,事件組件必須實(shí)習(xí)ActionListener 接口

      Struts組件編程模型

      Struts實(shí)現(xiàn)組件編程時(shí)有一些復(fù)雜:經(jīng)常為一個(gè)頁(yè)面中需要引入多個(gè)組件而頭疼,因?yàn)镾truts中無(wú)法直接引入多個(gè)組件,必須繞一些圈子:

      一般分兩種情況:如果同一個(gè)Action就可以對(duì)付這些組件,那么在這種情況下有兩個(gè)辦法:

      1.將這多個(gè)組件裝入一個(gè)ActionForm中,如使用MapForm等機(jī)制;

      2.手工將多個(gè)組件裝入request/session等scope中,然后根據(jù)其名稱在jsp中獲得。

      這兩個(gè)方法都有缺點(diǎn): 第一種辦法經(jīng)常一個(gè)ActionForm弄得面目全非,變成一個(gè)大雜燴,違反了OO分派封裝的原則;第2種辦法其實(shí)又回到j(luò)sp編程;

      第二種情況,如果這些組件必須有預(yù)先由不同的Action來(lái)處理,每個(gè)組件必須經(jīng)過(guò)Action -->ActionForm流程,在這種情況下有兩種辦法:

      1.使用Tiles, 不同流程輸出到同一個(gè)頁(yè)面的不同區(qū)域。是一種并行處理方式。

      2. 對(duì)多個(gè)流程首尾相連,第一Action forward結(jié)果是第二個(gè)Action,最后輸出一個(gè)Jsp,在這個(gè)jsp中就可以使用前面多個(gè)流程的多個(gè)ActionForm了,這屬于串行方式。

      Struts組件模型缺點(diǎn)

      Struts組件編程必須限定在Action/ActionForm/JSP這三個(gè)框框中做文章,難度相對(duì)比較大,而Tapestry/JSF則沒(méi)有太多這些技術(shù)框框限制,兩者在組件編程方面更讓編程者自由一些,方便一些,這也是組件型框架的優(yōu)勢(shì)吧。

      Struts標(biāo)簽庫(kù)

      在Struts中,經(jīng)常需要使用標(biāo)簽庫(kù)來(lái)顯示組件ActionForm中內(nèi)容,這就涉及到一個(gè)結(jié)合的問(wèn)題,標(biāo)簽庫(kù)是別人寫(xiě)的,參考Struts的標(biāo)簽庫(kù)用法,而組件是自己的,難度和麻煩就體現(xiàn)在這個(gè)結(jié)合點(diǎn)上。

      JSF基本思路和Struts差不多,只不過(guò)換了不同標(biāo)簽庫(kù),也需要標(biāo)簽庫(kù)+組件的結(jié)合思考,不過(guò)因?yàn)榻M件這里是通用組件,沒(méi)有什么限制,所以這樣比Struts要輕松一些。

      Tapestry使用了組件庫(kù)概念替代了標(biāo)簽庫(kù),沒(méi)有標(biāo)簽庫(kù)概念,這樣就沒(méi)有標(biāo)簽庫(kù)和自己的組件需要結(jié)合的問(wèn)題,都是組件的使用,組件中分Tapestry標(biāo)準(zhǔn)組件和自己定義的組件,這也是接觸了Jsp體系的人學(xué)習(xí)Tapestry面臨的一個(gè)思路轉(zhuǎn)換。

      具體以頁(yè)面跳轉(zhuǎn)為例子,頁(yè)面跳轉(zhuǎn)是靠鏈接<a href="目標(biāo)"></a> 實(shí)現(xiàn),鏈接是頁(yè)面經(jīng)常使用的元素。

      Struts提供的html:link在頻繁使用就特別不方便,尤其在傳遞多個(gè)參數(shù)時(shí):其中html:link的page值,是跳轉(zhuǎn)對(duì)方頁(yè)面或Action的path,這個(gè)path一般需要到struts-config.xml查找Action的相應(yīng)path,一旦配置文件path值修改,涉及到這個(gè)所有相關(guān)頁(yè)面都要修改。

      JSF將鏈接概念劃分兩個(gè)方面:導(dǎo)航性質(zhì)和事件激活,在導(dǎo)航方面還是需要到配置faces-config查詢Navigation的from-outcome的值。

      由于Tapestry沒(méi)有標(biāo)簽庫(kù)概念,只有組件或頁(yè)面兩個(gè)概念,因此,鏈接跳轉(zhuǎn)目標(biāo)要么是組件,要么是頁(yè)面,簡(jiǎn)潔簡(jiǎn)單,它沒(méi)有多余的path概念,就是組件名,也就是對(duì)象名稱,組件名稱和path名稱合二為一。

      總結(jié)

      JSF在很大程度上類似Struts,而不是類似Tapestry,可以說(shuō)是一種Struts 2.0,都是采取標(biāo)簽庫(kù)+組件的形式,只是JSF的組件概念沒(méi)有象Struts那樣必須繼承ActionForm的限制;JSF在事件粒度上要細(xì)膩,不象Struts那樣,一個(gè)表單一個(gè)事件,JSF可以細(xì)化到表單中的每個(gè)字段上。

      JSF只有在組件和事件機(jī)制這個(gè)概念上類似Tapestry,但是不似Tapestry那樣是一個(gè)完全組件的框架,所以,如果你做一個(gè)對(duì)頁(yè)面要求靈活度相當(dāng)高的系統(tǒng),選用Tapestry是第一考慮。

      Struts/JSF則適合在一般的數(shù)據(jù)頁(yè)面錄入的系統(tǒng)中,對(duì)于Struts和JSF的選用,我目前個(gè)人觀點(diǎn)是:如果你是一個(gè)新的系統(tǒng),可以直接從JSF開(kāi)始;如果你已經(jīng)使用Struts,不必轉(zhuǎn)換,如果需要切換,可以將JSF和Tapestry一起考慮。

      另外,JSF/Tapestry不只是支持Html,也支持多種客戶端語(yǔ)言如WML或XUI等。

      這三者之間關(guān)系:如果說(shuō)Struts是左派;那Tapestry則是右派;而JSF則是中間派,中庸主義是SUN聯(lián)盟的一貫策略。

      當(dāng)然,你也可以發(fā)表你在實(shí)踐中這三者任何一個(gè)的使用感受,以使得后來(lái)者有一個(gè)比較。

    posted on 2006-08-04 13:30 Kimi 閱讀(326) 評(píng)論(1)  編輯  收藏 所屬分類: Java

    評(píng)論

    # re: MVC三種框架的討論 (轉(zhuǎn)) 2006-08-04 13:35 Kemi
    本人是使用JSF的,看來(lái)沒(méi)選錯(cuò)  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 久久亚洲精品无码网站| 粉色视频免费入口| 亚洲香蕉免费有线视频| 国产精彩免费视频| 国产成人亚洲精品91专区高清| 亚洲国产aⅴ综合网| 久久99青青精品免费观看| 亚洲国产日韩视频观看| 久久精品免费观看国产| 精品丝袜国产自在线拍亚洲| 亚洲av麻豆aⅴ无码电影| 久久这里只精品热免费99| 亚洲依依成人亚洲社区| 亚洲色图综合在线| 无码国产精品一区二区免费| 一级做a爱过程免费视频高清| 亚洲综合小说久久另类区| 九月婷婷亚洲综合在线| 91九色精品国产免费| 成人免费乱码大片A毛片| 亚洲欧美成人综合久久久| 亚洲AV无码专区国产乱码4SE| 日韩免费无砖专区2020狼| 99在线免费观看视频| www免费插插视频| 中日韩亚洲人成无码网站| 久久亚洲精品无码| 波多野结衣一区二区免费视频| aⅴ在线免费观看| 两个人的视频www免费| 国产成人人综合亚洲欧美丁香花| 久久久久亚洲Av片无码v | 亚洲免费一区二区| 120秒男女动态视频免费| 成年免费a级毛片免费看无码| 亚洲熟妇无码一区二区三区导航| 亚洲欧洲在线观看| 中文亚洲AV片不卡在线观看 | 中文字幕不卡亚洲| 日本不卡免费新一二三区| 成人无码区免费A片视频WWW|