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