Posted on 2006-05-09 22:56
canonical 閱讀(1623)
評論(2) 編輯 收藏 所屬分類:
軟件開發
? 傳統的Mode2模式的服務器端框架在處理AJAX應用的時候存在一定的不適應性,這主要的原因在于Model2基于推模式,它隱含的假設是基于action的處理結果生成整個頁面,而AJAX應用中所強調的是頁面局部的變化,只更新發生變化的部分,而不是重新生成整個頁面(change instead of create), 這兩者之間存在著內在的不協調。有些人推崇后臺服務程序只返回xml數據的方法,將顯示層完全推到前臺。雖然在前臺通過js腳本操縱DOM節點可以實現非常細粒度上的控制,但是我們并不總是需要最細粒度上的控制權的。例如現在我們在前臺實現一個grid控件, grid控件本身只需要控制到單元格層次即可,而不需要對于單元格里存放什么內容有預先的假設. grid.getCell(i,j).innerHTML = cellHtml是非常自然的一種解決方式。完全通過dom來構造界面面臨著眾多問題,除了瀏覽器bug這種揮之不去的噩夢之外,在實現過程中我們往往會引入對界面元素的大量限制條件,而無法做到集成各種來源的控件。
? 在服務器端生成頁面片斷的方式也稱為AJAH,表面上看起來它比AJAX要簡易一些,是很多服務器端框架引入AJAX概念的鄉間小徑。但有趣的是在基于拉模式(pull mode)的服務器端MVC框架中,AJAH是在架構上比AJAX更加靈活的一種方式。在witrix平臺的jsplet框架中,web訪問的基本形式如下:
?? /view.jsp?objectName=XXObject&objectEvent=XXEvent&otherArgs&tplPart=XXPart
其中objectName對應于后臺的服務對象,objectEvent參數映射到服務對象的方法,view.jsp是對于后臺對象進行渲染的模板頁面,而tplPart參數可以指定只使用模板的某一部分進行渲染。如果我們選擇json.jsp或者burlap.jsp作為渲染模板,則可以退化到返回數據而不是內容的方式。在js中進行簡單的封裝后我們可以通過如下方式進行遠程調用:
? new js.Ajax().setObjectName("XXObject").setObjectEvent("XXEvent").addForm("XXFormId").callRemote(callbackFunc);
?? 它對應的url請求為
?? /json.jsp?objectName=XXObject&objectEvent=XXEvent&...
對于同樣的后臺業務處理,我們可以自由的選擇渲染模板,則可以很自然的得到更多的處理方式,例如返回javascript代碼來實現對于前臺的回調。