收藏一篇DLEE老大的文章,里面的話句句說(shuō)到了我的心坎里。
為什么我說(shuō)Struts/WebWork會(huì)受到Ajax的威脅呢?有的人可能覺得大家相安無(wú)事不是很好,你是不是有神經(jīng)病故意挑起人民內(nèi)部矛盾?問題是他們之間確實(shí)存在著一些深層的內(nèi)在矛盾和沖突,這些矛盾才是目前Struts和 WebWork都只能在非常有限的程度上支持Ajax的原因。所以,問題是架構(gòu)性的,并不是小型的修補(bǔ)或者更好的編程技巧可以徹底解決的。
傳統(tǒng)的服務(wù)器端MVC架構(gòu)設(shè)計(jì)(也就是Model2),存在著一個(gè)基本的假設(shè)就是Web應(yīng)用的工作流是由一系列的頁(yè)面切換構(gòu)成的。這種架構(gòu)中的一個(gè)View,從語(yǔ)義上來(lái)講只能代表一個(gè)完整的HTML頁(yè)面。整個(gè)Web應(yīng)用的表現(xiàn)層,被劃分成為非常多的頁(yè)面的組合。
而Ajax開發(fā)者眼里,Web應(yīng)用的工作流并不是這樣構(gòu)成的。Ajax開發(fā)者看待Web應(yīng)用的角度與傳統(tǒng)開發(fā)者相比差別非常大。在一個(gè)Ajax應(yīng)用中,只有相對(duì)很少的頁(yè)面。每個(gè)頁(yè)面,包括頁(yè)面引用CSS樣式、JS腳本,都是一個(gè)更小型的Ajax應(yīng)用。甚至一些功能簡(jiǎn)單的Ajax應(yīng)用,本身僅僅由一個(gè)單一的頁(yè)面構(gòu)成。例如一個(gè)簡(jiǎn)單的RSS閱讀器,還有IBM筆記本上那個(gè)獲得天氣預(yù)報(bào)的桌面。
按照Ajax in Action,Ajax應(yīng)用可以分成3種類型:
-
以內(nèi)容為中心的應(yīng)用,服務(wù)器返回的是一段HTML內(nèi)容。
-
以腳本為中心的應(yīng)用,服務(wù)器返回的是一段JS腳本。
-
以數(shù)據(jù)為中心的應(yīng)用,服務(wù)器返回的是一段數(shù)據(jù),可以是XML格式、JSON格式或者其他文本格式。
服務(wù)器返回給Ajax應(yīng)用的3種類型的網(wǎng)絡(luò)流量(不稱為數(shù)據(jù)是與上面第3種Ajax應(yīng)用相區(qū)別),任何一種都不能被簡(jiǎn)單地視作傳統(tǒng)MVC架構(gòu)中的View,因?yàn)樗麄兏髯运淼恼Z(yǔ)義與傳統(tǒng)MVC架構(gòu)中的View的語(yǔ)義是完全不同的。所以可以看出,除了初次交付給瀏覽器一個(gè)完整的Ajax應(yīng)用之外,傳統(tǒng)的MVC架構(gòu)對(duì)于Ajax應(yīng)用的支持是非常有限的。其實(shí)為了給客戶端提供上面3類網(wǎng)絡(luò)流量,一個(gè)Servlet已經(jīng)足夠了。DWR、JSON-RPC、Buffalo在服務(wù)器端也就是由Servlet實(shí)現(xiàn)的,不要求服務(wù)器端一定要安裝某種MVC框架。
上面3類應(yīng)用,前面的兩類,客戶端JS代碼比較簡(jiǎn)單,表現(xiàn)邏輯僅有一部分位于客戶端,大部分仍然位于服務(wù)器端,因此傳統(tǒng)的服務(wù)器端MVC架構(gòu)仍然是非常有價(jià)值的。但是大家注意第3類Ajax應(yīng)用,實(shí)際上它已經(jīng)將絕大部分甚至可以將全部的表現(xiàn)邏輯都轉(zhuǎn)移到客戶端來(lái)執(zhí)行,這個(gè)時(shí)候服務(wù)器端傳統(tǒng)的Web表現(xiàn)層實(shí)際上被架空了(皮之不存,毛將焉附?)。而對(duì)于Ajax應(yīng)用來(lái)說(shuō),雖然近期可能還是以第1類Ajax應(yīng)用為主(例如,所謂的AHAH技術(shù)),但是最有生命力和發(fā)展前景的還是第3類Ajax應(yīng)用。
自從1999年M$推出IE5.0支持XMLHTTP,可以不刷新頁(yè)面以異步方式從服務(wù)器獲取數(shù)據(jù)之后,Web開發(fā)的領(lǐng)域就埋下了一顆定時(shí)炸彈(6年以后,一個(gè)新詞Ajax的出現(xiàn)引爆了這顆炸彈)。Model2最初的設(shè)計(jì)應(yīng)該發(fā)生在這件大事(現(xiàn)在應(yīng)該承認(rèn),M$做了一件天大的好事)發(fā)生之前,其設(shè)計(jì)師不可能想到異步請(qǐng)求的價(jià)值。按照Model2的設(shè)計(jì)思想直接產(chǎn)生了Struts。但是后來(lái)的WebWork在最初設(shè)計(jì)階段仍然與這個(gè)技術(shù)失之交臂,這是相當(dāng)可惜的一件事情。WebWork其實(shí)最初設(shè)計(jì)的時(shí)候就可以走的更遠(yuǎn),但是他們只想超越Struts,做一個(gè)更好的Model2 MVC開發(fā)框架?,F(xiàn)在他們?cè)傧脍s上這班列車已經(jīng)有點(diǎn)晚了。如果基礎(chǔ)的服務(wù)器端MVC架構(gòu)的價(jià)值是可疑的,那么其他圍繞這個(gè)架構(gòu)所開發(fā)的基礎(chǔ)架構(gòu)的價(jià)值也同樣是可疑的。
所以在現(xiàn)在這個(gè)時(shí)刻,重新正本清源地思考Model2最初的設(shè)計(jì),它帶來(lái)的Web開發(fā)的巨大進(jìn)步,以及它所存在的不足,是一個(gè)非常現(xiàn)實(shí)的問題。