<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

    表現層框架Struts/Tapestry/JSF比較



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

      其實,JSF和Tapestry也并不是那種頭碰頭的相同競爭性技術,兩者還是各有側重點的,不過比較細微,但是這種細微點在實現一個大工程時可能帶來不同的感受和變化。

      首先,我們從一個高度來抽象一下表現層框架應有的技術架構,下圖可以說所有表現層框架技術都必須實現的功能架構圖:

      當然,我們不必廢話羅嗦MVC模式,MVC模式是基準模式,現在框架技術已經不必再拼是否是MVC模式了。 在上圖MVC模式基礎上,一個表現層框架無外乎要實現圖中的三個功能:

      1.在當前頁面能夠顯示一個組件對象的內容;而不是象純JSP那樣,需要在Jsp頁面寫入“調用對象方法”的Java代碼。

      2.當用戶按下頁面的提交按扭或鏈接后,事件發生,這時應該觸發服務器端并將當前頁面的參數提交給服務器。這種機制表現在Form表單提交和有參數的鏈接<a href=""></a>

      3.從一個頁面視圖直接跳轉到另外一個頁面視圖,單純的導航作用。

      我們通過下表來比較這 三種框架在實現上圖各個功能時技術細節,從而得出他們的異同點和偏重點。

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

    組件必須繼承ActionForm

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

      Struts組件編程模型

      Struts實現組件編程時有一些復雜:經常為一個頁面中需要引入多個組件而頭疼,因為Struts中無法直接引入多個組件,必須繞一些圈子:

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

      1.將這多個組件裝入一個ActionForm中,如使用MapForm等機制;

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

      這兩個方法都有缺點: 第一種辦法經常一個ActionForm弄得面目全非,變成一個大雜燴,違反了OO分派封裝的原則;第2種辦法其實又回到jsp編程;

      第二種情況,如果這些組件必須有預先由不同的Action來處理,每個組件必須經過Action -->ActionForm流程,在這種情況下有兩種辦法:

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

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

      Struts組件模型缺點

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

      Struts標簽庫

      在Struts中,經常需要使用標簽庫來顯示組件ActionForm中內容,這就涉及到一個結合的問題,標簽庫是別人寫的,參考Struts的標簽庫用法,而組件是自己的,難度和麻煩就體現在這個結合點上。

      JSF基本思路和Struts差不多,只不過換了不同標簽庫,也需要標簽庫+組件的結合思考,不過因為組件這里是通用組件,沒有什么限制,所以這樣比Struts要輕松一些。

      Tapestry使用了組件庫概念替代了標簽庫,沒有標簽庫概念,這樣就沒有標簽庫和自己的組件需要結合的問題,都是組件的使用,組件中分Tapestry標準組件和自己定義的組件,這也是接觸了Jsp體系的人學習Tapestry面臨的一個思路轉換。

      具體以頁面跳轉為例子,頁面跳轉是靠鏈接<a href="目標"></a> 實現,鏈接是頁面經常使用的元素。

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

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

      由于Tapestry沒有標簽庫概念,只有組件或頁面兩個概念,因此,鏈接跳轉目標要么是組件,要么是頁面,簡潔簡單,它沒有多余的path概念,就是組件名,也就是對象名稱,組件名稱和path名稱合二為一。

      總結

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

      JSF只有在組件和事件機制這個概念上類似Tapestry,但是不似Tapestry那樣是一個完全組件的框架,所以,如果你做一個對頁面要求靈活度相當高的系統,選用Tapestry是第一考慮。

      Struts/JSF則適合在一般的數據頁面錄入的系統中,對于Struts和JSF的選用,我目前個人觀點是:如果你是一個新的系統,可以直接從JSF開始;如果你已經使用Struts,不必轉換,如果需要切換,可以將JSF和Tapestry一起考慮。

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

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

      當然,你也可以發表你在實踐中這三者任何一個的使用感受,以使得后來者有一個比較。

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

    評論

    # re: MVC三種框架的討論 (轉) 2006-08-04 13:35 Kemi
    本人是使用JSF的,看來沒選錯  回復  更多評論
      

    主站蜘蛛池模板: 高清永久免费观看| 中文字字幕在线高清免费电影| 老司机69精品成免费视频| 国产成人亚洲精品91专区手机| 美女羞羞喷液视频免费| 国产成人无码区免费A∨视频网站| 亚洲乱妇老熟女爽到高潮的片| 女人被男人躁的女爽免费视频| 国产成人精品日本亚洲直接| 日本视频免费观看| 一本天堂ⅴ无码亚洲道久久| 日本黄色免费观看| 在线jlzzjlzz免费播放| 亚洲综合激情九月婷婷| 18禁美女裸体免费网站| 亚洲情A成黄在线观看动漫软件| 黄页免费的网站勿入免费直接进入| 亚洲av永久无码嘿嘿嘿| 成年在线观看免费人视频草莓| 亚洲精品人成网线在线播放va| 国产女高清在线看免费观看| 高潮毛片无遮挡高清免费| 亚洲国产成人五月综合网| 国产一级高青免费| 亚洲网站视频在线观看| 成年女人毛片免费视频| 人人公开免费超级碰碰碰视频| 中文字幕人成人乱码亚洲电影| 日本视频在线观看永久免费| 亚洲伊人久久大香线焦| 日韩视频免费一区二区三区| 久久不见久久见免费影院www日本| 国产成人精品日本亚洲网站| 麻豆成人久久精品二区三区免费| 亚洲综合校园春色| 拔擦拔擦8x华人免费久久| 亚洲国产精品不卡毛片a在线| 动漫黄网站免费永久在线观看| 亚洲桃色AV无码| 在线观看日本亚洲一区| 又爽又高潮的BB视频免费看|