雖然Web 2.0應(yīng)用程序著實(shí)讓人興奮,但它們?cè)谙乱淮鶵IA+SOA集成平臺(tái)形成之前是不會(huì)成為主流的。
下一代RIA+SOA平臺(tái)什么樣子
目前,在基于HTML、CSS、Javascript標(biāo)準(zhǔn)的網(wǎng)絡(luò)環(huán)境下,RIA開發(fā)人員在構(gòu)建富用戶界面時(shí),必須對(duì)多種第三方庫(kù)文件和框架進(jìn)行編譯。這種“ 照單選菜”的RIA程序開發(fā)方式給開發(fā)人員增加了多余的負(fù)擔(dān)。他們不能將精力全部用于編寫程序,而必須拿出部分時(shí)間用來尋找、集成和整理各種各樣的RIA 開發(fā)平臺(tái)。
SOA方面也是如此。開發(fā)人員必須自己解決如何創(chuàng)建服務(wù),以及如何將這些服務(wù)集成到RIA前端程序。開發(fā)人員需要一個(gè)能解決編寫程序時(shí)所需考慮的各種問題的平臺(tái),這樣他們才能把精力放在他們最擅長(zhǎng)的事情上——編寫程序。
問題是:下一代RIA+SOA平臺(tái)應(yīng)該是什么樣子呢?
我們可以從建立一個(gè)RIA+SOA應(yīng)用的活動(dòng)開始。一般來說,這些活動(dòng)主要包括:
1、設(shè)計(jì)程序的“樣子”
也就是程序的總體外觀。它包括以下方面:顏色、字體、圖表,以及總體頁(yè)面布局。
常用工具包括:HTML、CSS和圖像工具。
2、集成控件(widget)
控件將一系列常用功能封裝在一個(gè)單獨(dú)的組件里。除一些預(yù)定義的動(dòng)態(tài)行為之外,它們通常還包含“感觀”效果。它們是RIA程序的基礎(chǔ)組成模塊。
常用工具包括:ExtJS、Dojo、Yahoo YUI,以及一些其它小型控件工具。
3、為用戶界面添加動(dòng)態(tài)行為
在用戶界面創(chuàng)建動(dòng)態(tài)行為涉及兩件事:
事件處理
文檔對(duì)象模型(DOM)操作
事件處理是對(duì)發(fā)生的特定事件(比如用戶點(diǎn)擊一個(gè)按鈕或者收到服務(wù)響應(yīng))進(jìn)行判定的能力。DOM操作可以讓你根據(jù)接收到的事件動(dòng)態(tài)改變用戶界面。
常用工具包括:Javascript庫(kù)類,比如JQuery、Prototype和Scriptaculous。
4、使用服務(wù)
RIA的一個(gè)主要功能是使用后端服務(wù)。這使它可以用單頁(yè)面用戶界面?zhèn)鬏敺?wù)的應(yīng)用數(shù)據(jù)。用戶界面與服務(wù)層也可以完全分開。Ajax是最常用的與服務(wù)交互的方法。
常用工具包括:Javascript庫(kù)類,比如Jquery和Prototype。
5、創(chuàng)建服務(wù)
服務(wù)為數(shù)據(jù)和應(yīng)用業(yè)務(wù)邏輯層提供了一個(gè)接口。
常用工具包括:可以根據(jù)你所用的程序設(shè)計(jì)語言選擇適當(dāng)?shù)目蚣軄韯?chuàng)建服務(wù)。
下一代RIA+SOA平臺(tái)基本特征
了解了創(chuàng)建RIA+SOA應(yīng)用程序的大致需求,我們?cè)賮砜匆幌略鯓訉⑦@些活動(dòng)整合到一起,從而最大化開發(fā)人員的效率。下面幾個(gè)部分概述了下一代RIA+SOA平臺(tái)的基本特征。
1、支持HTML和CSS
這兩種語言非常適合用來實(shí)現(xiàn)應(yīng)用程序的“外觀”,并且大多網(wǎng)絡(luò)用戶界面的開發(fā)人員對(duì)它們都很熟悉。所以沒必要再去另做一些工作實(shí)現(xiàn)重復(fù)的功能。
2、提供開放的控件框架(Open Widget Framework)
正如前面講到的,控件是RIA程序的基礎(chǔ)組成模塊。有許多工具可以使用,比如Yahoo、Dojo和ExtJS。也有一些小型項(xiàng)目或個(gè)人開發(fā)的獨(dú)立控件。你可以使用這些控件構(gòu)建RIA程序,但有一些需要注意的地方:
幾乎不可能僅靠一個(gè)控件來滿足你所有的需求。
集成各種第三方控件時(shí)可能需要定制代碼,并對(duì)各個(gè)控件有深入的了解。
編寫新的控件是一項(xiàng)有挑戰(zhàn)性的工作,因?yàn)檫@意味著你得編寫自己所用的控件工具的低層API,甚至要從零開始。
某些控件框架要求開發(fā)人員為所用的控件編寫大量的JavaScript,這對(duì)那些JavaScript開發(fā)經(jīng)驗(yàn)很少甚至沒有的人來說,無疑是有很大問題。
為解決以上問題,RIA+SOA平臺(tái)提供的開放控件框架需要具備以下功能:
·支持集成現(xiàn)有的第三方控件
·為新建控件提供簡(jiǎn)單的API
·可以通過簡(jiǎn)單標(biāo)記(markup)使用控件(不需要使用JavaScript)
·支持分布模型,以簡(jiǎn)化新控件的提交、發(fā)現(xiàn)和使用。
開放的控件框架將成為開發(fā)人員獲取控件的資源,并使開發(fā)人員可以很容易地集成控件和應(yīng)用程序。如果沒有所需的控件,使用開放控件框架的API重新創(chuàng)建也很容易。
由于控件在RIA開發(fā)中的重要性及其分散的特性,開放的控件框架應(yīng)該是任何RIA+SOA平臺(tái)必不可少的組成部分。
3、提供一個(gè)集成的RIA編程模型
與傳統(tǒng)的Web應(yīng)用相比,RIA程序需要編寫更多的用戶界面代碼。因此,下一代平臺(tái)需要集成的RIA編程模型來簡(jiǎn)化主要用戶界面設(shè)計(jì)任務(wù)。這些任務(wù)包括:
·事件處理
·DOM操作
·服務(wù)使用(Ajax)
事件處理、DOM操作和Ajax是富網(wǎng)絡(luò)應(yīng)用中實(shí)現(xiàn)“富”任務(wù)的部分。它們的關(guān)系非常緊密。為說明這一點(diǎn),我們來看一個(gè)典型的RIA登錄過程。
·點(diǎn)擊登錄按鈕(事件處理)
·發(fā)送服務(wù)請(qǐng)求(Ajax)
·顯示相應(yīng)的活動(dòng)指示器(DOM操作)
·返回服務(wù)(Ajax)
·關(guān)閉活動(dòng)指示器(DOM操作)
·顯示登錄“成功”的消息(DOM操作)
雖然它們關(guān)系緊密,大部分框架和庫(kù)都只提供了簡(jiǎn)單的集成,而讓開發(fā)人員完成剩下的任務(wù)。為表明這一點(diǎn),我們來看一些代碼。在下面的示例中,當(dāng)一個(gè)組合框的值發(fā)生改變時(shí),我們將設(shè)定另一個(gè)組合框的內(nèi)容。示例是用Jquery寫的。
$(function(){$(“select#comboOne”).change(function(){$.getJSON(“/combo.php”,{id: $(this).val(), ajax: “true”}, function(j){var options = “”;for (var i = 0; i < j.length; i++) {options += “” + j[i].optionDisplay + “”;}$(“select#comboTwo”).html(options);})})})
現(xiàn)在我們來看看怎么用事件處理、DOM操作和Ajax完全集成的方法來完成同樣的任務(wù)。
on=“change then r:load.combo2.request”>on=“r:load.combo2.response then value[property=rows,text=text,value=value]”>
這兩段代碼用不同的方式完成同一件任務(wù)。第一段使用了較多的代碼,并且都是用JavasSript。第二段使用了簡(jiǎn)單的表達(dá)式語言來完成同樣的任務(wù)。我們來分析一下語法。
on=“change then r:load.combo2.request”
在這句表達(dá)式中,當(dāng) on=“r:load.combo2.response then value[property=rows,text=text,value=value]
and effect[Highlight]”>
通過在表達(dá)式中添加effect[Highlight],我們就能使用一種微妙的效果來提示使用者組合框的值已經(jīng)發(fā)生變化。
這些示例代碼顯示了事件處理、DOM操作和Ajax完全集成這一方法的強(qiáng)大與簡(jiǎn)易。沒有JavaScript經(jīng)驗(yàn)的開發(fā)人員也很容易掌握像上面所示的表達(dá)式語言。這將使他們很快進(jìn)入工作狀態(tài),因?yàn)樗麄儾辉傩枰A(yù)先進(jìn)行大量枯燥的學(xué)習(xí)。當(dāng)然,有JavaScript經(jīng)驗(yàn)的開發(fā)人員也可以自由選擇使用 JavaScript。這樣,一個(gè)集成的RIA編程模型也應(yīng)該支持JavaScript,特別是要支持行為與標(biāo)記的分離。通常稱之為低調(diào)(unobtrusive)JavaScript。我們來看一個(gè)示例:
$(“progress_images”).on(“r:login.request then show”).on(“r:login.response then hide”);
在這個(gè)示例中,標(biāo)記與JavaScript代碼定義的行為——收到登錄請(qǐng)求消息的時(shí)候“show”及收到登錄響應(yīng)消息的時(shí)候“hide”——就是分離的。 這種編程模型有利于喜歡使用JavasScript進(jìn)行RIA編程的開發(fā)人員。
一個(gè)集成的RIA編程模型是RIA+SOA平臺(tái)的基礎(chǔ)組成部分。它為開發(fā)人員處理主要的RIA編程活動(dòng)提供了單一、完整的機(jī)制。這樣,相較現(xiàn)在來說,開發(fā)人員可以使用更少的代碼、更快地構(gòu)建富用戶界面。
4. 提供集成的服務(wù)平臺(tái)(Integrated Services Platform)
RIA 只是構(gòu)建富應(yīng)用程序的一部分。我們?nèi)孕枰瓿蒖IA+SOA中的SOA部分。不幸的是,當(dāng)前的Web 2.0工具包和框架主要用于RIA,很少甚至不提供對(duì)構(gòu)建服務(wù)的支持。這確實(shí)是個(gè)問題,因?yàn)檫@樣又需要開發(fā)人員來完成大量的工作,使得應(yīng)用開發(fā)和維護(hù)需要耗費(fèi)更多的時(shí)間并變得異常困難。
下一代RIA+SOA平臺(tái)要解決這個(gè)問題必需提供一個(gè)能滿足以下條件的集成的服務(wù)平臺(tái):
·支持使用任何語言創(chuàng)建服務(wù)
·實(shí)現(xiàn)RIA與SOA層的無縫交互
·可以使用本地模擬服務(wù)(mock service)
過去,網(wǎng)絡(luò)框架使用單一的編程語言構(gòu)建,但是在RIA+SOA時(shí)代,這種做法將變得過時(shí)并且多余。RIA程序只與服務(wù)交換應(yīng)用數(shù)據(jù),它們應(yīng)該是獨(dú)立于編程語言的。RIA程序與SOA服務(wù)只需要一個(gè)簡(jiǎn)單的消息關(guān)系。RIA與SOA層之間的松耦合特性為集成的服務(wù)平臺(tái)提供了方法,可以使開發(fā)人員使用任何編程語言創(chuàng)建服務(wù)并不會(huì)影響到RIA層。
集成的服務(wù)平臺(tái)同樣應(yīng)該提供RIA與SOA各層之間的無縫交互。特別是,它應(yīng)該代替開發(fā)人員處理服務(wù)路由選擇和數(shù)據(jù)轉(zhuǎn)換。下面是一個(gè)用簡(jiǎn)單的集成方法創(chuàng)建服務(wù)的示例。這個(gè)示例是用Java編寫的。
@Service (request = 'login.request‘, response ='login.response’)protected void loginRequest (Message req, Message resp)throws Exception{String username = req.getData().getString(“username”);String password = req.getData().getString(“password”);User user = UserDAO.login(username,password);if (user !=null){response.getData().put(“success”,true);response.getData().put(“user”,user);return;}response.getData().put(“success”,false);}
在上面的示例中,有兩點(diǎn)需要注意:首先,通過在Java方法中加入一個(gè)簡(jiǎn)單的“Service”注釋便讓一個(gè)平常的Java對(duì)象變成了一個(gè)服務(wù)。注釋中包含了這個(gè)方法所處理的服務(wù)請(qǐng)求和服務(wù)響應(yīng)消息,使路由設(shè)置變得簡(jiǎn)單。其次,可以簡(jiǎn)單明了地處理請(qǐng)求和響應(yīng)數(shù)據(jù)。在這個(gè)示例中,將整個(gè)User對(duì)象放入響應(yīng)消息中。服務(wù)平臺(tái)負(fù)責(zé)處理數(shù)據(jù)轉(zhuǎn)換。這樣開發(fā)人員可以集中精力編寫服務(wù)邏輯而不是膠合代碼(glue code),可以減少代碼量并提高開發(fā)速度。
然后,如果RIA與服務(wù)之間的關(guān)系是基于消息的,就可以創(chuàng)建本地模擬服務(wù)。本地模擬服務(wù)可以響應(yīng)遠(yuǎn)程請(qǐng)求,但它們只存在于本地RIA中。這是一種很強(qiáng)大的功能,因?yàn)闊o需一行服務(wù)代碼便可創(chuàng)建功能齊全的RIA模型。可以將這些本地模擬服務(wù)放在單個(gè)文件中,并在用戶界面開發(fā)完成后刪除。我們來看一個(gè)例子:
on=“r:login.request then show or r:login.response then hide”/>Username: Password: on=“click then r:login.request”/>登錄表單$MQ(‘r:login.response’, {'success‘:true,'username’:‘foo'});
模擬服務(wù)
在上面的示例中,我們有一個(gè)產(chǎn)生服務(wù)請(qǐng)求r:login.request的登錄表單。我們還有一張圖像,它將在收到r:login.request消息時(shí)顯示,并在收到r:login.response消息后隱藏。第二部分是一個(gè)模擬服務(wù)的示例。這個(gè)模擬服務(wù)監(jiān)聽r:login.request服務(wù)請(qǐng)求,并在一秒后用r:login.response消息響應(yīng)(當(dāng)然這一秒只是模擬服務(wù)延遲)。登錄表單并不知道服務(wù)的位置,它只負(fù)責(zé)響應(yīng)消息。這個(gè)簡(jiǎn)單的示例顯示了如何不靠一行服務(wù)代碼創(chuàng)建一個(gè)完整的RIA模型。這種模型是100%可重用的,并使開發(fā)人員可以在服務(wù)創(chuàng)建之前定義服務(wù)合約。這樣,服務(wù)創(chuàng)建工作得到了很大程度的簡(jiǎn)化,因?yàn)殚_發(fā)人員不僅有一個(gè)功能齊全的模型作為參考,還同時(shí)得到了一個(gè)完整的服務(wù)界面。
總結(jié)
開發(fā)人員目前正在經(jīng)歷網(wǎng)絡(luò)應(yīng)用開發(fā)的巨大轉(zhuǎn)變。我們正從Web 1.0的基于服務(wù)器的MVC模式轉(zhuǎn)為面向網(wǎng)絡(luò)的客戶機(jī)/服務(wù)器架構(gòu),或者更準(zhǔn)確一點(diǎn)應(yīng)該稱為RIA+SOA。由于這個(gè)轉(zhuǎn)變,開發(fā)人員要將他們所用的網(wǎng)絡(luò)開發(fā)平臺(tái)集成到一起才能進(jìn)行富網(wǎng)絡(luò)應(yīng)用的開發(fā)。當(dāng)然,轉(zhuǎn)變的同時(shí)也會(huì)帶來機(jī)會(huì)。這個(gè)機(jī)會(huì)便是建立下一代為Web 2.0應(yīng)用提供端對(duì)端支持的網(wǎng)絡(luò)平臺(tái)。
在 Appcelerator,我們看到公司在一年以前已經(jīng)接受這種轉(zhuǎn)變。他們正在開發(fā)Appcelerator Platform,這是一個(gè)支持RIA+SOA的全新平臺(tái)。本文所用的示例正是基于這一平臺(tái)。當(dāng)然,創(chuàng)建下一代網(wǎng)絡(luò)平臺(tái)有許多不同的方法。但是,即使實(shí)現(xiàn)細(xì)節(jié)上有些許不同,大體特征應(yīng)該都是一樣的。