ajax
【IT168 專稿】AJAX是若干成熟技術的組合,旨在讓使用者從Web應用中獲得更加滿意的使用者體驗。本文回顧了公司專屬應用程式體繫結構的進化曆程,試圖闡述AJAX是B/S架構發展的必然產物,但是,由於AJAX賴以生存的javascript程式設計語言的先天不足,AJAX似乎又前途堪憂。本文作者從中介軟體的角度,對AJAX的未來作出了自己的預測。
1. 什麼是AJAX
AJAX的全稱是Asynchronous JavaScript and XML,即非同步JavaScript和XML。這是一種多項成熟技術的組合,其目的是讓Web應用獲得與使用者快速、即時互動的能力。AJAX所組合的技術,包括:
• JavaScript,Java指令碼語言(注意,此Java非Sun公司的Java)
• DHTML,Dynamic HTML,動態HTML
• XML,Extensible Markup Language,可延伸標記語言 (XML)
• CSS,Cascading Style Sheets,層疊樣式表單
• DOM,Document Object Model,文件物件模型
• 微軟的稱為XMLHttpRequest的對象
在AJAX技術下,使用者會感覺到網頁與普通案頭應用一樣,響應迅速,而不是像傳統網頁那樣,任何操作都需要等待頁面的重新整理。AJAX是如何做到這一點的呢?有兩個秘密:第一,其實AJAX也會重新整理頁面,只不過,AJAX可以只重新整理部分頁面,而不是整個頁面;第二,AJAX的頁面重新整理是非同步,就是說,使用者可以繼續他的其他動作,而不必等候重新整理完成。
當使用者瀏覽一個基於AJAX的Web應用時,使用者的請求被提交給一個稱為AJAX引擎(AJAX Engine)的代理,這個AJAX引擎負責接收使用者請求,從Web伺服器上擷取響應,並更新瀏覽器內容。形象地說,傳統的Web應用中,瀏覽器是直接和Web伺服器打交道的,而在AJAX應用中,瀏覽器和Web伺服器之間出現了一個來回跑腿的“中介”,而且這個 “中介”相當的勤快,所以,能夠給瀏覽器提供更好的服務,從而使使用者獲得更滿意的應用體驗。
AJAX應用的例子,Google Map是一個典型。開啟Google Map網站(http://maps.google.com),會看到一張地圖,對地圖進行放大、縮小以及拖動等操作,網頁的響應十分迅速,看起來好像瀏覽器事先載入了整張地圖。其實,瀏覽器只是根據你的操作,向伺服器請求你所看到的那些資料,並非同步地更新你的瀏覽器內容,這一切,都拜AJAX所賜。
JavaScript和微軟的XMLHttpRequest對象,是AJAX 引擎的兩條腿。當與瀏覽器互動時,AJAX引擎使用JavaScript語言;而當與Web伺服器互動時,則使用微軟的XMLHttpRequest對象。由於AJAX引擎依賴微軟的XMLHttpRequest對象技術,所以,早期只有微軟的IE瀏覽器支援AJAX。現在,隨著採用AJAX技術的Web應用的不斷湧現,所有主流的瀏覽器,例如Firefox、Netscape、Opera、Safari等,也都支援AJAX了。
2. 公司專屬應用程式體繫結構的進化曆程
在筆者看來,AJAX的出現,並非偶然。為了說明這一點,讓我們來回顧一下,電腦應用體繫結構的發展曆史,這或許有助於我們揭示AJAX的來曆。
最早的電腦應用,是單機程式,運行在一台電腦上,那時還沒有電腦與電腦之間相互連信的概念,因為單機應用已經足以滿足人們的需要。因此,兩台電腦即使放在同一個實驗室,也是“機”犬相聞,老死不相往來。
人的慾望是永遠也不會滿足的,單機應用沒有持續多久,兩台電腦之間交換資料的需求,就隨著電腦應用範圍的擴充而出現了。在PC領域,最初的電腦資料互動形式是串口通訊,後來,隨著Novell公司著名的NetWare網路技術的推出,運行在兩台不同機器上的程式,有了可以更方便地互動的渠道,於是出現了客戶機和伺服器,即所謂的Client/Server結構,簡稱C/S結構。C/S結構因其將應用劃分為兩個部分的特點,也被稱為“二端”體繫結構。
C/S結構流行若干年後,人們發現,僅僅劃分“用戶端”和“伺服器”兩個角色,已經不敷使用,因為隨著應用複雜度的不斷增加,用戶端和伺服器都變得越來越龐大,於是,三端體繫結構冒了出來,在伺服器和客戶機之間增加了一個稱為“中介軟體(MiddleWare)”的“端”。在三端體繫結構中,原來散布在“用戶端”和“伺服器”上的一些功能(主要是應用邏輯),慢慢轉移到了中介軟體上,這樣就有效地減輕了“用戶端”和“伺服器”日益沉重的負擔,系統的架構重新趨於平衡。
三端體繫結構現在仍是公司專屬應用程式的事實上的標準,這是由三端體繫結構的適應性決定的。三個端中,中介軟體最為靈活,一方面可以擔負一部分用戶端的任務,有助於打造低成本的“瘦”用戶端;另一方面,一些通用的服務也可以從伺服器上挪到中介軟體上,讓伺服器的功能更加專一,以提高效能。中介軟體技術,作為三端體繫結構的核心技術,催生了很多以中介軟體為主要產品的軟體公司,激烈的競爭,使得中介軟體技術日趨成熟。
此後雖然出現了所謂的多端(nTier)體繫結構,本質上還是三端的,其區別只是一個應用中包含了不只一個中介軟體和伺服器,而是多個中介軟體,多個伺服器,甚至多種用戶端。
3. AJAX是B/S結構向三端體繫結構進化的產物嗎
在“用戶端/伺服器”體繫結構向“用戶端/中介軟體/伺服器”體繫結構演變的過程中,隨著互連網技術的廣泛應用,一種更簡便的體繫結構出現了,那就是所謂的“瀏覽器/伺服器(Browser/Server)”體繫結構,簡稱B/S結構。B/S結構一經出現,就因其無需開發用戶端,能大幅度降低公司專屬應用程式中用戶端部署和維護的成本等優點,迅速獲得了軟體企業及其客戶的青睞。現在,B/S結構是最流行的應用體繫結構,不論是大型的公司專屬應用程式,還是小型的個人應用,B/S結構都是首選的體繫結構,幾乎成了IT界的“預設”選擇,甚至我們在談起某某應用時,都不需要特別說明是什麼體繫結構了。
如果將B/S結構看作是C/S結構的變種(可能有人不同意,呵呵,只是筆者個人見解而已),那麼,我們可以發現,B/S結構不是三端體繫結構。在B/S結構中,作為“用戶端”的瀏覽器和作為“服務端”的Web伺服器,是直接互動的,並沒有中介軟體的介入,公司專屬應用程式的商務邏輯,要麼駐留在伺服器(包括Web伺服器、資料庫伺服器等)上,要麼以瀏覽器作為容器,沒有其他去處。因此,從“端”的角度看,B/S結構其實是“二端”的,像C/S結構一樣。
如果這個論點是成立的,那麼,C/S結構從“二端”向“三端”的演變,是否預示了,B/S結構也會按照同樣的方式進化,從而在瀏覽器和用戶端之間,產生出一個“中介軟體”呢?
AJAX的出現,似乎是對這種預示作出的響應。仔細觀察,我們可以在AJAX身上發現中介軟體的某些特徵。首先,AJAX所承載的功能,原本是分布在Web伺服器和瀏覽器上的,AJAX的介入,減輕了用戶端和伺服器的負擔,許多原本需要重載整個頁面的要求-回應處理,現在只需重載部分頁面了;其次,AJAX部分地接管了瀏覽器和Web伺服器的通訊,而通訊攔截是中介軟體的重要特徵之一。一方面,AJAX對瀏覽器的請求進行預分析,另一方面,AJAX對Web伺服器的響應進行預先處理,AJAX在瀏覽器和Web伺服器之間,扮演了一個“中介”的角色,與三端體繫結構中的中介軟體非常相似。
有趣的是,中介軟體的出現時機和AJAX的出現時機,也大致相同。C/S結構進入公司專屬應用程式領域若干年後,中介軟體出現了,而AJAX的出現,也是在B/S結構開始流行後的若干年。具體的時間長度已經不可考證了,不過,可以留意到的是,中介軟體是在C/S結構應用大量湧現,用戶端和伺服器日益膨脹的背景下誕生的,而AJAX也是在B/S結構應用如雨後春筍般冒出,網頁上Flash和廣告群魔亂舞,使用者不再滿足於平淡和遲鈍的應用體驗的情形下,在Web應用中嶄露頭角的。
4. AJAX有沒有未來
如果問一下,Web世界裡誰是炙手可熱的紅人,不少人一定會選擇AJAX了。不錯,AJAX現在確實非常火爆,自從Google開創了AJAX應用的先河之後,在Web領域,應用不論大小,程度不分高低,只要和Web沾邊的,人也好物也好,都要披上一件AJAX的時尚外衣,以示自己沒有落到潮流的後面。AJAX就像一桌美味佳肴,雖然選材未必精良,但色香味俱全,在這樣的誘惑下,程式員們要保持冷靜的態度和清醒的頭腦,殊非不易。其實,洗淨AJAX表面的各味調料,將AJAX的真材實料展示在食客的眼前,我們就會感覺到,AJAX的未來並不明朗。
理由之一,雖然從公司專屬應用程式體繫結構發展的曆史來看,AJAX的作為B/S結構的中介軟體出現,有其必然性,但別忘了,這是有假設條件的,這個假設條件就是,B/S結構可以作為二端結構來看待。這個假設不是所有人都同意的,因為也有一種觀點,是將B/S結構看作三端結構。很簡單,只要將Web伺服器往前提一提,B/S結構就變成三端結構了:瀏覽器是用戶端,資料庫是伺服器端,而Web伺服器是中介軟體。這是非常典型的Web公司專屬應用程式架構,可是在這個架構下,AJAX沒有地位。AJAX的一部分在瀏覽器,另一部分在Web伺服器,並沒有獨立出來,它必須依附瀏覽器和Web伺服器而存在,因此,AJAX還不能單獨成為一個端,當然,也就更談不上成為中介軟體了。
理由之二,即便大家都同意B/S結構可以視為二端結構,AJAX想要攀升到中介軟體的地位,仍然面臨許多懸而未決的問題。首先,AJAX賴以生存的程式設計語言是JavaScript,這是一個指令碼語言,是解釋性語言,雖然簡單、靈活並且容易上手,但具有解釋性語言的先天不足,比如,執行效率就是JavaScript的一個大問題,在瀏覽器上玩些花樣尚可,如果要作為中介軟體的程式設計語言,那就有點勉為其難了;其次,指令碼語言結構管理能力的低下,也是JavaScript成為中介軟體程式設計語言的障礙,用JavaScript很難寫出像C++或Java那樣規範、可靠、合理而優美的程式,而且,現今廣為接受的物件導向的編程思想,在JavaScript下要運用起來,似乎也不是特別的自然。
如此看來,AJAX的未來確實非常迷茫,即使受到越來越多AJAX支援者的追捧,但如果想要走得更遠,似乎也心有餘而力不足。AJAX問題的癥結,就在於JavaScript語言。對於這種語言,一直有兩股勢力在對抗。一種是看好JavaScript,認為其簡單易學、靈活多變而且功能強大;另一種則對JavaScript不屑一顧,甚至根本不願意承認它是一種程式設計語言。我見過一些非常資深的程式員,對JavaScript的態度,可以用“仇視”二字來描述。一種語言同時受到如此截然相反兩種對待,我所知道的,也就只有JavaScript了。
JavaScript遭受到的如此冰火兩重天的待遇,註定了建立在JavaScript之上的AJAX的尷尬地位。AJAX的未來,很大程度上取決於JavaScript的前途。勝者王侯敗者寇,現在AJAX最關心的,莫過於JavaScript面前水火不相容的兩股勢力,誰會是最後的贏家。AJAX和JavaScript,一根線上的兩隻螞蚱,它們的未來,已經牢牢地綁定在一起,誰又能把它們分開呢?