Posted on 2010-10-04 11:02
viery 閱讀(208)
評(píng)論(0) 編輯 收藏 所屬分類:
JavaEE
也有些Web框架是直接設(shè)計(jì)出來(lái)的,很多Web框架在設(shè)計(jì)的時(shí)候也都借鑒了別的框架,吸取優(yōu)點(diǎn),修改不足,并根據(jù)自己的框架的定位,在特定方面有自己的發(fā)揮,形成了自己的特點(diǎn),比如有的web框架追求的是松耦合性,層次,結(jié)構(gòu)之間都不密切綁定,有的Web框架則追求敏捷性,強(qiáng)調(diào)約定而不是配置。
Java 的 Web框架雖然各不相同,但基本也都是遵循特定的路數(shù)的:使用Servlet或者Filter攔截請(qǐng)求,使用MVC的思想設(shè)計(jì)架構(gòu),使用約定,XML或 Annotation實(shí)現(xiàn)配置,運(yùn)用Java面向?qū)ο蟮奶攸c(diǎn),面向抽象實(shí)現(xiàn)請(qǐng)求和響應(yīng)的流程,支持Jsp,F(xiàn)reemarker,Velocity等視圖。
JSF
優(yōu)點(diǎn):
Java EE標(biāo)準(zhǔn),這意味著有很大的市場(chǎng)需求和更多的工作機(jī)會(huì)
上手快速并且相對(duì)容易
有大量可用的組件庫(kù)
缺點(diǎn):
大量的JSP標(biāo)簽
對(duì)REST和安全支持不好
沒(méi)有一個(gè)統(tǒng)一的實(shí)現(xiàn)。既有SUN的實(shí)現(xiàn),又有Apache的實(shí)現(xiàn)——MyFaces。
國(guó)內(nèi)的OperaMasks還支持AJAX,以及有開(kāi)發(fā)工具 支持
Spring MVC
優(yōu)點(diǎn):
對(duì)覆蓋綁定(overriding binding)、驗(yàn)證(validation)等提供生命周期管理
與許多表示層技術(shù)/框架無(wú)縫集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF 等
便于測(cè)試——?dú)w功于IoC
缺點(diǎn):
大量的XML配置文件
太過(guò)靈活——沒(méi)有公共的父控制器
沒(méi)有內(nèi)置的Ajax支持
Stripes
優(yōu)點(diǎn):
不需要書(shū)寫(xiě)XML配置文件
良好的學(xué)習(xí)文檔
社區(qū)成員很熱心
缺點(diǎn):
社區(qū)比較小
不如其他的項(xiàng)目活躍
ActionBean里面的URL是硬編碼的
Struts 2
優(yōu)點(diǎn):
架構(gòu)簡(jiǎn)單——易于擴(kuò)展
標(biāo)記庫(kù)很容易利用FreeMarker或者Velocity來(lái)定制
基于控制器或者基于頁(yè)面的導(dǎo)航
缺點(diǎn):
文檔組織得很差
對(duì)新特征過(guò)分關(guān)注
通過(guò)Google搜索到的大多是Struts 1.x的文檔
Tapestry
優(yōu)點(diǎn):
一旦學(xué)會(huì)它,將極大地提高生產(chǎn)率
HTML模板——對(duì)頁(yè)面設(shè)計(jì)師非常有利
每出一個(gè)新版本,都會(huì)有大量的創(chuàng)新
缺點(diǎn):
文檔過(guò)于概念性,不夠?qū)嵱?/p>
學(xué)習(xí)曲線陡峭
發(fā)行周期長(zhǎng)——每年都有較大的升級(jí)
Wicket
優(yōu)點(diǎn):
對(duì)Java開(kāi)發(fā)者有利(不是Web開(kāi)發(fā)者)
頁(yè)面和顯示綁定緊密
社區(qū)活躍——有來(lái)自創(chuàng)建者的支持
缺點(diǎn):
HTML模板和Java代碼緊挨著
需要對(duì)OO有較好的理解
Wicket邏輯——什么都用Java搞定
在Java的Web框架中,我使用過(guò)Struts1,Struts2,試用過(guò)Stripes,Wicket,了解過(guò)JSF,SpringMVC。以我使用的經(jīng)驗(yàn),我覺(jué)得看一個(gè)Java Web框架應(yīng)看看下面幾個(gè)方面:
1.設(shè)計(jì)理念
一個(gè)框架設(shè)計(jì)出來(lái)應(yīng)該有一個(gè)基本的思路,它為什么要要被設(shè)計(jì)出來(lái)?有的框架的目標(biāo) 就是提高效率,有的框架的目標(biāo)的給用戶充分的選擇,有的框架的目標(biāo)是充分了解實(shí)際需求,給用戶一個(gè)盡量合理的默認(rèn)選擇,有的框架是要給使用者開(kāi)發(fā)桌面程序的感覺(jué)。應(yīng)該說(shuō),一個(gè)好的框架應(yīng)該是實(shí)現(xiàn)了預(yù)期目標(biāo),體現(xiàn)出了自己的設(shè)計(jì)理念的。
2.設(shè)計(jì)的合理性
設(shè)計(jì)的合理性表現(xiàn)在框架在一些關(guān)鍵問(wèn)題上的處理,比如靈活性和敏捷性之間的權(quán)衡,硬編碼和文本配置之間的權(quán)衡。靈活性指的是可以適應(yīng)用戶多樣的需求,很特殊的要求也能得到支持,有的框架的實(shí)現(xiàn)基于太多的約定,使得用戶只能遵循。而敏捷性指的是用戶在解決絕大多數(shù)常規(guī)問(wèn)題的時(shí)候,能盡量少做工作,提高效率。框架設(shè)計(jì)者只能在這兩者見(jiàn)達(dá)到一個(gè)平衡點(diǎn),權(quán)衡的怎么樣,就很見(jiàn)水平了。硬編碼和文本配置之間的權(quán)衡也很有意思,文本配置的意義在于Java是一個(gè)編譯語(yǔ)言,強(qiáng)調(diào)代碼的封閉,講究擴(kuò)展而不是修改,這種情況下文本配置信息可以很方便的在不修改程序的情況下改變程序行為,但是隨著一些靈活的腳本語(yǔ)言實(shí)現(xiàn)的 Web框架的出現(xiàn),人們發(fā)現(xiàn)在這樣的框架中,腳本語(yǔ)言即做程序編碼語(yǔ)言,也做配置語(yǔ)言,還做視圖上的標(biāo)記語(yǔ)言,這使我們對(duì)Java實(shí)現(xiàn)的框架有了一番新的審視,既然配置文件并沒(méi)有消除對(duì)程序的修改,為什么不能在應(yīng)編碼上下下功夫呢?
3.設(shè)計(jì)的平衡性
設(shè)計(jì)的平衡性指的是,框架在設(shè)計(jì)流程中各階段,各層次的實(shí)現(xiàn)方式時(shí),所達(dá)到的上述權(quán)衡(靈活性和敏捷性之間的權(quán)衡等)應(yīng)該是具有一致的水平。一個(gè)在控制上過(guò)分靈活,而視圖上具有非常大限制的框架是不能算做一個(gè)好的框架的。
4.框架真的解放了開(kāi)發(fā)者嗎
框架的目的是讓開(kāi)發(fā)者把更多的精力放在領(lǐng)域問(wèn)題,而非Web的請(qǐng)求和響應(yīng)的處理問(wèn)題上。而事實(shí)上框架都做到這一點(diǎn)了嗎?不可否認(rèn),框架的使用提高代碼的可維護(hù)性,但是框架在解放開(kāi)發(fā)者這點(diǎn)上就未必了,有時(shí)還給開(kāi)發(fā)者帶來(lái)了額外的負(fù)擔(dān)。事實(shí)上,直接使用Servlet,只要維持好代碼風(fēng)格,一樣可以很有效率,當(dāng)然,直接使用Servlet的靈活性就不用說(shuō)了。
在我接觸的Web框架中,我最推崇的是Struts2,設(shè)計(jì)優(yōu)雅,偏重靈活,也基本不造成額外的負(fù)擔(dān),當(dāng)然這些評(píng)價(jià)是和我參與的項(xiàng)目的規(guī)模有關(guān)的,其他規(guī)模的項(xiàng)目Struts2就未必合適了。我希望Struts2能在下面幾個(gè)方面有些改善:
1.在提供文本配置方式的基礎(chǔ)上給一個(gè)約定配置的方式,讓開(kāi)發(fā)者在大多數(shù)情況下可以不配置。
2.配置也支持硬編碼,因?yàn)橛袝r(shí)候維護(hù)可修改的硬編碼是很有效率的。
3.在攔截請(qǐng)求上,能借鑒下ROR,Django的思路,適應(yīng)新的Url的需求,考慮大家對(duì)“?”后添加屬性的回避,支持帶占位符的Url。