對(duì)程序員而言,開發(fā)Ajax應(yīng)用頭痛的問(wèn)題莫過(guò)于以下幾點(diǎn):
瀏覽器的兼容性問(wèn)題
Ajax在本質(zhì)上是一個(gè)瀏覽器端的技術(shù),首先面臨無(wú)可避免的第一個(gè)問(wèn)題即是瀏覽器的兼容性問(wèn)題。
各家瀏覽器對(duì)于JavaScript/DOM/CSS的支持總有部分不太相同或是有Bug,甚至同一瀏覽器的各個(gè)版本間對(duì)于JavaScript/DOM/CSS的支持也有可能部分不一樣。這導(dǎo)致程序員在寫Ajax應(yīng)用時(shí)花大部分的時(shí)間在調(diào)試瀏覽器的兼容性而非在應(yīng)用程序本身。因此,目前大部分的Ajax鏈接庫(kù)或開發(fā)框架大多以js鏈接庫(kù)的形式存在,以定義更高階的JavaScript API 、JavaScript對(duì)象(模板)、或者JavaScript Widgets來(lái)解決此問(wèn)題。如prototype.js。
業(yè)務(wù)邏輯分散
Ajax技術(shù)之主要目的在于局部交換客戶端及服務(wù)器之間的數(shù)據(jù)。如同傳統(tǒng)之主從架構(gòu),無(wú)可避免的會(huì)有部分的業(yè)務(wù)邏輯會(huì)實(shí)現(xiàn)在客戶端,或部分在客戶端部分在服務(wù)器。由于業(yè)務(wù)邏輯可能分散在客戶端及服務(wù)器,且以不同之程序語(yǔ)言實(shí)現(xiàn),這導(dǎo)致Ajax應(yīng)用程序極難維護(hù)。如有用戶接口或業(yè)務(wù)邏輯之更動(dòng)需求,再加上前一個(gè)JavaScript/DOM/CSS之兼容性問(wèn)題,Ajax應(yīng)用往往變成程序員的夢(mèng)魘。針對(duì)業(yè)務(wù)邏輯分散的問(wèn)題,Ajax開發(fā)框架大致可分為兩類:
將業(yè)務(wù)邏輯及表現(xiàn)層放在瀏覽器,數(shù)據(jù)層放在服務(wù)器:因?yàn)樗械某绦蛞訨avaScript執(zhí)行在客戶端,只有需要數(shù)據(jù)時(shí)才向服務(wù)器要求服務(wù),此法又稱為胖客戶端(fat client)架構(gòu)。服務(wù)器在此架構(gòu)下通常僅用于提供及儲(chǔ)存數(shù)據(jù)。此法的好處在于程序員可以充分利用JavaScript搭配業(yè)務(wù)邏輯來(lái)做出特殊的用戶接口,以符合終端用戶的要求。但是問(wèn)題也不少,主因在
第一,JavaScript語(yǔ)言本身之能力可能不足以處理復(fù)雜的業(yè)務(wù)邏輯。
第二,JavaScript的執(zhí)行效能一向不好。
第三,JavaScript訪問(wèn)服務(wù)器數(shù)據(jù),仍需適當(dāng)?shù)姆⻊?wù)器端程序之配合。第四,瀏覽器兼容性的問(wèn)題又出現(xiàn)。
有些Ajax開發(fā)框架如DWR企圖以自動(dòng)生成JavaScript之方式來(lái)避免兼容的問(wèn)題,并開立通道使得JavaScript
可以直接調(diào)用服務(wù)器端的Java程序來(lái)簡(jiǎn)化數(shù)據(jù)的訪問(wèn)。但是前述第一及第二兩個(gè)問(wèn)題仍然存在,程序員必須費(fèi)相當(dāng)?shù)牧獠拍苓_(dá)到應(yīng)用程序之規(guī)格要求,或可能根本無(wú)法達(dá)到要求。
將表現(xiàn)層、業(yè)務(wù)邏輯、及數(shù)據(jù)層放在服務(wù)器,瀏覽器僅有用戶接口引擎(User Interface engine);
此法又稱為瘦客戶端(thin client)架構(gòu),或中心服務(wù)器(server-centric)架構(gòu)。瀏覽器的用戶接口引擎僅用于反映服務(wù)器的表現(xiàn)層以及傳達(dá)用戶的輸入回到服務(wù)器的表現(xiàn)層。由瀏覽器所觸發(fā)之事件亦送回服務(wù)器處理,根據(jù)業(yè)務(wù)邏輯來(lái)更新表現(xiàn)層,然后反映回瀏覽器。因?yàn)樗袘?yīng)用程序完全在服務(wù)器執(zhí)行,數(shù)據(jù)及表現(xiàn)層皆可直接訪問(wèn),程序員只需使用服務(wù)器端相對(duì)較成熟之程序語(yǔ)言(如Java語(yǔ)言)即可,不需再學(xué)習(xí)JavaScript/DOM/CSS,在開發(fā)應(yīng)用程序時(shí)相對(duì)容易。缺點(diǎn)在于用戶接口引擎以及表現(xiàn)層通常以標(biāo)準(zhǔn)組件的形式存在,如需要特殊組件(用戶接口)時(shí),往往須待原框架之開發(fā)者提供,緩不濟(jì)急。如開源碼Ajax開發(fā)框架ZK目前支持XUL及XHTML組件,尚無(wú)XAML之支持。
多進(jìn)程或多線程的競(jìng)爭(zhēng)問(wèn)題
Ajax是以異步的方式向服務(wù)器提交需求。對(duì)服務(wù)器而言,其與傳統(tǒng)的提交窗體需求并無(wú)不同,而且由于是以異步之方式提交,如果同時(shí)有多個(gè)Ajax需求及窗體提交需求,將無(wú)法保證哪一個(gè)需求先獲得服務(wù)器的響應(yīng)。這會(huì)造成應(yīng)用程序典型的多進(jìn)程(process)或多線程(thread)的競(jìng)爭(zhēng)(racing)問(wèn)題。程序員因此必須自行處理或在JavaScript里面動(dòng)手腳以避免這類競(jìng)爭(zhēng)問(wèn)題的發(fā)生(如Ajax需求未響應(yīng)之前,先disable送出按鈕),這又不必要的增加了程序員的負(fù)擔(dān)。目前已知有自動(dòng)處理此問(wèn)題之開發(fā)框架似乎只有ZK。