這里我們要將 Tapestry 與其它主要的 Java Web 框架做一番比較,包括 Struts,JSF。
Struts 是一個(gè) Action 方式的 Web 框架,所有的請(qǐng)求直接對(duì)應(yīng)了相應(yīng)的 Action,我們需要通過(guò)一些相應(yīng)的技巧性處理才能把我們?cè)陧?yè)面上的 Click,Value Change 等轉(zhuǎn)換到后端對(duì)應(yīng)的 Action,抽象程度顯得不夠高,并且這樣會(huì)使 Struts 在處理一些較為復(fù)雜的頁(yè)面時(shí)配置過(guò)多,造成開(kāi)發(fā)和維護(hù)上的繁雜。另外 Struts 默認(rèn)使用的 Tiles 模板框架使用了 <jsp:include> 方式的拼裝頁(yè)面技術(shù),并且在每個(gè)頁(yè)面都需要配置,這樣的話,又增加了不少的配置量。在Struts中,經(jīng)常需要使用標(biāo)簽庫(kù)通過(guò) EL(Expression Language)來(lái)顯示組件ActionForm中內(nèi)容,這就涉及到一個(gè)結(jié)合的問(wèn)題,標(biāo)簽庫(kù)是別人寫(xiě)的,而且 Struts 在這方面并沒(méi)有確定的標(biāo)準(zhǔn),如何才能讓自己的組件庫(kù)和現(xiàn)有的組件庫(kù)很好的結(jié)合,難度和麻煩就體現(xiàn)在這個(gè)結(jié)合點(diǎn)上。
JSF的視圖層開(kāi)發(fā)的基本思路和Struts差不多,只不過(guò)換了不同標(biāo)簽庫(kù),也需要標(biāo)簽庫(kù)+組件的結(jié)合思考,不過(guò)因?yàn)榻M件這里是通用組件,沒(méi)有什么限制,并且遵循了一個(gè)共同的標(biāo)準(zhǔn),所以這樣比Struts要輕松一些。JSF 提供了一套完整的生命周期和組件標(biāo)準(zhǔn),我們很容易的為其定制一些組件和使用現(xiàn)有的組件庫(kù)。另外JSF采用了事件驅(qū)動(dòng)的方式,同一個(gè)頁(yè)面對(duì)應(yīng)的多個(gè) Action 請(qǐng)求會(huì)比較直接的通過(guò) EL映射到后端對(duì)應(yīng)的 Java 方法上,從而大大減少了復(fù)雜頁(yè)面的配置量。但是在默認(rèn)情況下,JSF 每個(gè)頁(yè)面的都需要配置其單獨(dú)的導(dǎo)航,如果頁(yè)面導(dǎo)航復(fù)雜的話,配置還是不少的。JSF 在默認(rèn)情況下并沒(méi)有集成模板引擎,但是開(kāi)源的 Facelets 模板引擎提供了類似 Tapestry 的模板方式,從另外一種方式簡(jiǎn)化了 JSF 的開(kāi)發(fā)。JSF 采用了 HTML 頁(yè)面保存組件樹(shù)的機(jī)制,頁(yè)面的所有組件和組件狀態(tài)被序列化到頁(yè)面中或者 Session 中,這樣的話,如果在頁(yè)面上 Javascrīpt 通過(guò)修改 DOM 的方式修改頁(yè)面的組件,會(huì)導(dǎo)致頁(yè)面和組件樹(shù)不一致,導(dǎo)致 JSF 無(wú)法正常工作,但是可以通過(guò) Ajax 方式向服務(wù)端發(fā)出更新組件樹(shù)的請(qǐng)求,但這樣需要走完 JSF 整個(gè)生命周期,顯得較為笨重,所以從架構(gòu)上來(lái)看,JSF 在處理頁(yè)面問(wèn)題上不夠靈活,也不夠 Ajax 化。
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è)面修改而帶來(lái)的修改難度。同為事件驅(qū)動(dòng)的框架,在配置上 Tapestry 有著和 JSF 類似的優(yōu)勢(shì),我們只需要簡(jiǎn)單的在 XML 文件里配置事件和后端方法的對(duì)應(yīng)關(guān)系,或者使用 OGNL 直接在頁(yè)面中與后端方法建立關(guān)聯(lián)。在頁(yè)面導(dǎo)航上,Tapestry 是根據(jù)監(jiān)聽(tīng)器方法的返回值而確定,這樣就省去了頁(yè)面導(dǎo)航部分的配置。Tapestry 的模板技術(shù)天生就是其優(yōu)勢(shì)所在,這樣的方式將前臺(tái)頁(yè)面的制作和后臺(tái)業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)完美的結(jié)合在一起。Tapestry 因?yàn)闆](méi)有 JSF 這樣的組件樹(shù)綁定的方式,就能夠比較容易的和 Ajax 綁定在一起,目前開(kāi)源的 Tacos 組件庫(kù)就提供了很多這樣的組件,并且整合了 Dojo Toolkit 使得我們開(kāi)發(fā)頁(yè)面中有了更多好用的組件,并且只需要很簡(jiǎn)單的配置工作就可以使用功能強(qiáng)大的 Web 組件和 Ajax 功能。
另外,JSF/Tapestry不只是支持HTML,也支持多種客戶端語(yǔ)言如WML或XUI等。
posted on 2006-11-22 14:20
steady 閱讀(1437)
評(píng)論(1) 編輯 收藏