比較JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket
Java Web層框架——JSF、Spring MVC、Stripes、Struts 2、Tapestry和Wicket他們各自的優(yōu)點(diǎn)和缺點(diǎn):
JSF
優(yōu)點(diǎn):
◆Java EE標(biāo)準(zhǔn),這意味著有很大的市場(chǎng)需求和更多的工作機(jī)會(huì)
◆上手快速并且相對(duì)容易
◆有大量可用的組件庫
缺點(diǎn):
◆大量的JSP標(biāo)簽
◆對(duì)REST和安全支持不好
◆沒有一個(gè)統(tǒng)一的實(shí)現(xiàn)。既有SUN的實(shí)現(xiàn),又有Apache的實(shí)現(xiàn)——MyFaces。
◆國內(nèi)的OperaMasks還支持AJAX,以及有開發(fā)工具支持
Spring MVC
優(yōu)點(diǎn):
◆對(duì)覆蓋綁定(overriding binding)、驗(yàn)證(validation)等提供生命周期管理
◆與許多表示層技術(shù)/框架無縫集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF等
◆便于測(cè)試——?dú)w功于IoC
缺點(diǎn):
◆大量的XML配置文件
◆太過靈活——沒有公共的父控制器
◆沒有內(nèi)置的Ajax支持
Stripes
優(yōu)點(diǎn):
◆不需要書寫XML配置文件
◆良好的學(xué)習(xí)文檔
◆社區(qū)成員很熱心
缺點(diǎn):
◆社區(qū)比較小
◆不如其他的項(xiàng)目活躍
◆ActionBean里面的URL是硬編碼的
Struts 2
優(yōu)點(diǎn):
◆架構(gòu)簡單——易于擴(kuò)展
◆標(biāo)記庫很容易利用FreeMarker或者Velocity來定制
◆基于控制器或者基于頁面的導(dǎo)航
缺點(diǎn):
◆文檔組織得很差
◆對(duì)新特征過分關(guān)注
◆通過Google搜索到的大多是Struts 1.x的文檔
Tapestry
優(yōu)點(diǎn):
◆一旦學(xué)會(huì)它,將極大地提高生產(chǎn)率
◆HTML模板——對(duì)頁面設(shè)計(jì)師非常有利
◆每出一個(gè)新版本,都會(huì)有大量的創(chuàng)新
缺點(diǎn):
◆文檔過于概念性,不夠?qū)嵱?BR>◆學(xué)習(xí)曲線陡峭
◆發(fā)行周期長——每年都有較大的升級(jí)
Wicket
優(yōu)點(diǎn):
◆對(duì)Java開發(fā)者有利(不是Web開發(fā)者)
◆頁面和顯示綁定緊密
◆社區(qū)活躍——有來自創(chuàng)建者的支持
缺點(diǎn):
◆HTML模板和Java代碼緊挨著
◆需要對(duì)OO有較好的理解
◆Wicket邏輯——什么都用Java搞定
接著,Matt通過采訪這些框架的作者,與他們討論各種開源的Java Web框架,并且突出各個(gè)框架的長處、聽取框架作者對(duì)其他框架的看法,希望借此了解這些框架的未來發(fā)展方向。
下列是一些被采訪者:
JSF:Jacob Hookom
RIFE:Geert Bevin
Seam:Gavin King
Spring MVC:Rob Harrop
Spring Web Flow:Rob Harrop and Keith Donald
Stripes:Tim Fennell
Struts 1:Don Brown
Tapestry:Howard Lewis Ship
Trails:Chris Nelson
Struts 2:Patrick Lightbody
Wicket:Eelco Hillenius
Matt對(duì)采訪做了如下總結(jié):
JSF:
如果你想讓web應(yīng)用具有類似桌面程序的功能性,那么JSF的標(biāo)準(zhǔn)規(guī)范和大量第三方組件庫的支持值得你 信賴。
Spring MVC:
綜合了許多不同的技術(shù),這使得它可以被廣泛地應(yīng)用到不同類型的項(xiàng)目中去;它可以被當(dāng)作web應(yīng)用開發(fā)的一個(gè)基礎(chǔ)平臺(tái)。
Stripes:
可以被應(yīng)用到存在大量復(fù)雜數(shù)據(jù)交互的程序中;有強(qiáng)大的類型轉(zhuǎn)換、綁定和驗(yàn)證功能;可以使管理大的復(fù)雜表單以及直接映射它們到域?qū)ο笞兊煤唵巍?BR>Tapestry:
在中到大型項(xiàng)目中,表現(xiàn)突出(當(dāng)然,你也可以只把它應(yīng)用到單個(gè)頁面上),在這些項(xiàng)目中,你可以通過簡單地創(chuàng)建新的組件起到杠桿作用。
Struts 2:
通常更適合于那些希望可以真正開始做事并且愿意花費(fèi)大量時(shí)間來學(xué)習(xí)他們使用的開源工具的小項(xiàng)目組。Struts 2的目標(biāo)不是那些更喜歡拖放式開發(fā)的“扶手椅程序員”。
Wicket:
非常適合于這樣的內(nèi)/外部網(wǎng)應(yīng)用:UI很復(fù)雜并且你希望可以充分利用你的開發(fā)者資源。
上面的總結(jié),基本是突出了各個(gè)框架的長處。然而,哪些又是他們不好的地方呢?
Matt提出了評(píng)價(jià)一個(gè)框架好壞與否的標(biāo)準(zhǔn):
◆Ajax支持
是不是內(nèi)置了?是否便于使用?
◆書簽?zāi)芰?/EM>
用戶能否將某個(gè)頁面收藏起來并且可以方便地返回到該頁面?
驗(yàn)證
使用是否簡單?是否支持客戶端(JavaScript)驗(yàn)證?
◆可測(cè)試性
脫離容器測(cè)試控制器,是否足夠簡單?
◆提交和重定向
框架如何處理重復(fù)提交問題?
◆國際化
如何支持國際化?控制器利用國際化信息,是否容易?
◆頁面修飾
框架支持哪種類型的頁面修飾/組成機(jī)制?
◆社區(qū)和技術(shù)支持
提出問題,能否被快速地、恭敬地回答?
◆開發(fā)工具
是否有支持這個(gè)框架的好的工具,尤其是IDE?
◆市場(chǎng)需求
學(xué)習(xí)了這個(gè)框架,它能否幫你找到份工作?
◆崗位數(shù)量
在dice.com和indeed.com上,對(duì)這個(gè)框架技能的需求如何?
筆者認(rèn)為這個(gè)評(píng)價(jià)標(biāo)準(zhǔn),值得大家借鑒。
然后,Matt按照這些評(píng)價(jià)標(biāo)準(zhǔn),對(duì)各個(gè)框架做了以下闡述:
Ajax支持
◆JSF:沒有內(nèi)置的Ajax支持,需要使用ICEfaces和Ajax4JSF
◆Stripes:沒有對(duì)應(yīng)的類庫,支持流輸出
◆Struts 2:內(nèi)置Dojo,有用于GWT和JSON的插件
◆Spring MVC:沒有對(duì)應(yīng)的類庫,需要使用DWR和Spring MVC擴(kuò)展
◆Tapestry:Tapestry 4.1中,有內(nèi)置的Dojo
◆Wicket:有Dojo和Script.aculo.us支持
書簽?zāi)芰?BR>◆JSF:可以任意提交——URL甚至不被考慮
◆Stripes:使用約定,但是你可以不加理會(huì)
◆Struts 2:有命名空間的概念,這使得收藏某個(gè)頁面并返回變得容易
◆Spring MVC:允許完全的URL控制
◆Tapestry:依然存在一些丑陋的URL
◆Wicket:允許裝配(mount)頁面/URL
驗(yàn)證
◆JSF:默認(rèn)的國際化信息丑陋,但是配置簡單
◆Stripes和Wicket:用Java類進(jìn)行驗(yàn)證——不支持客戶端驗(yàn)證
◆Struts 2:使用OGNL完成強(qiáng)大的表達(dá)式驗(yàn)證功能;只有在Action上指定了規(guī)則,才支持客戶端驗(yàn)證。
◆Spring MVC:允許你使用公共驗(yàn)證器——這是一種成熟的解決方案
◆Tapestry:有健壯的驗(yàn)證功能——不需自定義就有漂亮的國際化信息
可測(cè)試性
◆Spring MVC和Struts 2:允許利用mocks(例如EasyMock、jMock和Spring Mocks)簡單地進(jìn)行測(cè)試
◆Tapestry:測(cè)試?yán)щy,因?yàn)轫撁骖惐怀橄?、具體類被簡化
◆JSF:頁面類可以方便地被測(cè)試,實(shí)際上很像Struts 2 中的actions
◆Wicket:有WicketTester——一個(gè)強(qiáng)大的解決方案
◆Stripes:有Servlet API Mocks和MockRoundtrip
提交和重定向
解決重復(fù)提交問題的最簡單方法是:在提交后重定向
◆Spring MVC:允許你將參數(shù)加到重定向URL上
◆Stripes、Tapestry和Wicket:有“flash式”的支持
◆Struts 2:需要一個(gè)自定義的解決方案
◆JSF:需要一個(gè)自定義的解決方案,國際化信息很難加入到頁面bean中
國際化
◆JSTL的
◆Stripes、Spring MVC和JSF:每個(gè)地區(qū)使用一個(gè)資源綁定文件
◆Struts 2、Tapestry和Wicket:提倡把每個(gè)頁面/action用到的資源文件分開
◆JSF:需要在每個(gè)頁面上定義資源綁定信息
◆Tapestry:標(biāo)簽比較可怕
頁面修飾
◆Tiles能夠用于Struts 2、Spring MVC和JSF中;需要對(duì)每個(gè)頁面進(jìn)行配置。
◆SiteMesh能夠用于所有的這些框架中(不推薦在JSF、Tapestry或者Wicket中使用);在設(shè)置完成后, 只需要很少的維護(hù)。
開發(fā)工具
◆Spring MVC:Spring IDE,但是只做XML校驗(yàn),不是一個(gè)UI/web工具
◆Struts 2:Eclipse
◆Tapestry:Spindle,對(duì)編碼者非常有利
◆JSF:眾多IDE支持,并且做得越來越好
◆Stripes和Wicket:沒有任何官方工具
◆NetBeans目前支持Struts *、JSF(+Facelets)、Tapestry和Wicket,尚不支持Stripes和Spring MVC
市場(chǎng)需求
◆Struts 1:需求依然很大并且被廣泛使用
◆Spring MVC:越來越受關(guān)注,但大部分是因?yàn)镾pring框架的一些其他特征
◆JSF:很快地變得流行起來
◆Struts 2:正在獲得地盤,但是相關(guān)的工作機(jī)會(huì)很少
◆Tapestry:在過去的數(shù)年里,受歡迎程度不斷增加
◆Wicket和Stripes:還是未知數(shù)
【編輯推薦】

















