|
2006 年 12 月 26 日
對(duì) Ajax 這種使 Web 頁(yè)面更具交互性的技術(shù)的大肆宣傳已成過(guò)度之勢(shì)。Ruby on Rails 框架和 Ajax 的完美集成所產(chǎn)生的力量在一定程度上促成了該框架的繁榮。本文旨在揭示:是什么使 Ajax on Rails 成為如此強(qiáng)大的組合。
跨越邊界 系列之前的兩篇文章(參見(jiàn) 參考資料)全面介紹了 Streamlined,這是 Rails 的輔助框架,該框架有效地利用 scaffolding 來(lái)快速生成簡(jiǎn)單的、使用 Ajax 的用戶界面。除非您一直與世隔絕,不然您一定會(huì)知道 Ajax 是這樣一種編程技術(shù),它使用 XML、JavaScript 和 Web 標(biāo)準(zhǔn)來(lái)創(chuàng)建高度交互性的 Web 頁(yè)面,正如您在 Google Maps 和大量其他站點(diǎn)上所看到的頁(yè)面那樣。許多讀過(guò) Streamlined 文章的讀者都要求我描述一下 Ajax 在 Ruby on Rails 上的運(yùn)行方式。本文全面介紹了兩個(gè)簡(jiǎn)單的 Ajax 例子,延著這個(gè)思路介紹了 Ruby/Ajax 這一組合如此成功的原因。在本系列的下篇文章中,我將探究 JavaScript 這門編程語(yǔ)言。
Ajax 定義
Ajax 代表 Asynchronous JavaScript + XML。信息架構(gòu)師 Jesse James Garrett 于 2005 年提出這一術(shù)語(yǔ),該術(shù)語(yǔ)用來(lái)描述一門在夾縫中生存了近二十年的技術(shù)(參見(jiàn) 參考資料)。Ajax 的使用隨即爆增,不論在圖書(shū)館、流行網(wǎng)站還是文獻(xiàn)作品中都保持同步增長(zhǎng)。
Ajax 重新定義了基本的瀏覽器使用模型。原模型一次呈現(xiàn)一個(gè)頁(yè)面。Ajax 允許瀏覽器在頁(yè)面更新的間隔同服務(wù)器進(jìn)行交流。這樣做的好處是帶來(lái)更加豐富的客戶體驗(yàn),但卻以增加復(fù)雜度為代價(jià)。Ajax 是這樣運(yùn)行的:使用 JavaScript 客戶端庫(kù)在客戶機(jī)和服務(wù)器間發(fā)送 XML。Ajax 開(kāi)發(fā)人員可以在任何時(shí)刻從客戶機(jī)發(fā)送異步請(qǐng)求,因而在服務(wù)器處理這些請(qǐng)求時(shí),用戶交互可以繼續(xù)進(jìn)行。下面就是 Ajax 請(qǐng)求的流程:
 |
關(guān)于本系列
在 跨越邊界系列 文章中,作者 Bruce Tate 提出這樣一種觀點(diǎn),即當(dāng)今的 Java 程序員們可以通過(guò)學(xué)習(xí)其他方法和語(yǔ)言很好地武裝自己。自從 Java 技術(shù)明顯成為所有開(kāi)發(fā)項(xiàng)目最好的選擇以來(lái),編程前景已經(jīng)發(fā)生了改變。其他框架影響著 Java 框架的構(gòu)建方式,從其他語(yǔ)言學(xué)到的概念也可以影響 Java 編程。您編寫(xiě)的 Python(或 Ruby、Smalltalk 等語(yǔ)言)代碼可以改變編寫(xiě) Java 代碼的方式。
本系列介紹與 Java 開(kāi)發(fā)完全不同的編程概念和技術(shù),但是這些概念和技術(shù)也可以直接應(yīng)用于 Java 開(kāi)發(fā)。在某些情況下,需要集成這些技術(shù)來(lái)利用它們。在其他情況下,可以直接應(yīng)用概念。具體的工具并不重要,重要的是其他語(yǔ)言和框架可以影響 Java 社區(qū)中的開(kāi)發(fā)人員、框架,甚至是基本方式。
|
|
- 一個(gè)事件(如用戶的鼠標(biāo)點(diǎn)擊或編程計(jì)時(shí)器的觸發(fā))啟動(dòng)一個(gè) JavaScript 函數(shù)。
- JavaScript 函數(shù)為部分頁(yè)面而不是整個(gè)頁(yè)面創(chuàng)建一個(gè)請(qǐng)求。JavaScript 隨后通過(guò) HTTP 將該請(qǐng)求發(fā)送到 Web 服務(wù)器。
- 此 HTTP 請(qǐng)求調(diào)用服務(wù)器上的一個(gè)腳本,如 Rails 控制器方法或 Java? servlet。
- 該服務(wù)器腳本創(chuàng)建一個(gè) XML 文檔并將其返回給服務(wù)器。
- 在接收結(jié)果的同時(shí),客戶機(jī)異步處理創(chuàng)建、更新或刪除部分 Web 頁(yè)面,如列表元素、
div 標(biāo)記或圖像。
所有 Ajax 應(yīng)用程序都使用類似這種順序的一種方法。例如,某個(gè)應(yīng)用程序允許將字典中的單詞與其定義一起保存。舊式的應(yīng)用程序會(huì)強(qiáng)迫您用一個(gè)新的頁(yè)面視圖來(lái)編輯定義。Ajax 允許原地編輯,它用一個(gè)條目字段替換定義文本,然后用更新的定義來(lái)替換該表單。
Ajax 解決方案的組件是:
- 客戶端 JavaScript 庫(kù),用來(lái)管理異步請(qǐng)求。
- 服務(wù)器端 JavaScript 庫(kù),用來(lái)處理進(jìn)來(lái)的請(qǐng)求,并構(gòu)造一個(gè) XML 響應(yīng)。
- 客戶端 JavaScript 庫(kù),用來(lái)處理生成的 XML。
- 稱作文檔對(duì)象模型(DOM)的庫(kù),允許對(duì)現(xiàn)有 Web 頁(yè)面進(jìn)行更新。
- 輔助例程,用來(lái)處理不可避免的 UI 和集成問(wèn)題。
事件/請(qǐng)求/響應(yīng)/替換模型是大多數(shù) Ajax 應(yīng)用程序的核心模型,但如果您剛接觸 Ajax,您一定會(huì)對(duì) Ajax 中大量的可用庫(kù)和這些庫(kù)之間巨大的差別感到驚訝不已。該領(lǐng)域中有許多 Ajax 框架,它們的功能常常重疊且沒(méi)有確定的勝出者。單就 Java 市場(chǎng)而言,有許多庫(kù)可用,包括 Echo、Dojo、DWR、Google Web Toolkit(GWT)、Java Web Parts、AjaxAnywhere、AjaxTags、Scriptaculous 和 Prototype。這些框架使用截然不同的方法。一些框架試圖通過(guò)生成 JavaScript 代碼的 Java 庫(kù)來(lái)隱藏 JavaScript,如 GWT。另一些框架致力于使 JavaScript 更易使用。一些相當(dāng)?shù)厝?,?Dom4J,而另一些則僅著力于解決好一個(gè)小問(wèn)題。由于有許多流行的新技術(shù),解決方案之間互相割據(jù)的場(chǎng)面有時(shí)會(huì)很難駕馭,調(diào)試工具、UI 實(shí)踐(如 Back 按鈕)和明智的開(kāi)發(fā)實(shí)踐的實(shí)現(xiàn)非常緩慢。Java 平臺(tái)上的 Ajax 庫(kù)的力量源自其多樣性。這也正是其缺點(diǎn)所在,因?yàn)槎鄻有詫?dǎo)致了難以決斷、集成方面的顧慮和復(fù)雜性。
有了 Ruby on Rails,開(kāi)發(fā)體驗(yàn)就顯著不同了,這是由于兩個(gè)原因。首先,Ruby on Rails 有一個(gè)核心的 Web 開(kāi)發(fā)平臺(tái):Ruby on Rails。其次,到目前為止,大多數(shù)在 Rails 上的 Ajax 開(kāi)發(fā)體驗(yàn)都圍繞著兩個(gè)核心框架:Scriptaculous 和 Prototype(參見(jiàn) 參考資料)。Rails 方法使用運(yùn)行時(shí)代碼生成和定制標(biāo)記,這使您不必理會(huì)復(fù)雜的 JavaScript。是時(shí)候自己來(lái)實(shí)踐了。如果您想要在學(xué)習(xí)本文的過(guò)程中編寫(xiě)代碼的話,需要下載 Rails,也要下載必要的 Ajax 框架(參見(jiàn) 參考資料)。打開(kāi)您的 Rails 環(huán)境,跟我一起來(lái)吧。
沒(méi)有 Ajax 的簡(jiǎn)單的 Rails 應(yīng)用程序
要使用 Rails 和 Ajax,就要?jiǎng)?chuàng)建一個(gè)空項(xiàng)目,并生成一個(gè)有兩個(gè)方法的控制器。一個(gè)控制器控制簡(jiǎn)單的頁(yè)面,另一個(gè)控制器建立一個(gè) Ajax 響應(yīng)。鍵入下列代碼:
rails ajax
cd ajax
script/generate controller ajax show time
|
第一行和第二行代碼生成一個(gè) Rails 項(xiàng)目,并切換到新目錄。第三行代碼生成一個(gè)叫做 ajax 的控制器,并查看兩個(gè)動(dòng)作:show 和 time。清單 1 顯示了該控制器的代碼:
清單 1. 有兩個(gè)空方法的控制器
class AjaxController < ApplicationController
def show
end
def time
end
end
|
首先在不使用 Ajax 的情況下構(gòu)建兩個(gè)簡(jiǎn)單視圖,然后用 Ajax 將這兩個(gè)視圖綁定到一起。編輯 app/views/ajax 中的 show.rhtml 視圖,使它和清單 2 類似:
清單 2. 簡(jiǎn)單視圖
<h1>Ajax show</h1>
Click this link to show the current <%= link_to "time", :action => "time" %>.
|
清單 1 和清單 2 中的代碼不支持 Ajax,但我還是會(huì)仔細(xì)分析該代碼。首先,看清單 1 中的控制器。兩個(gè)空的控制器方法處理進(jìn)來(lái)的 HTTP 請(qǐng)求。如果不明確地呈現(xiàn)一個(gè)視圖(使用 render 方法),Rails 會(huì)呈現(xiàn)和該方法同名的視圖。由于 Scriptaculous 和 Prototype 庫(kù)也使用 HTTP,Rails 不需要對(duì)標(biāo)準(zhǔn) HTTP 方法和 Ajax 方法進(jìn)行區(qū)分。
現(xiàn)在將注意力轉(zhuǎn)移到清單 2 中的視圖。大多數(shù)代碼都是簡(jiǎn)單的 HTML 代碼,只有第二行的 link_to 輔助例程例外:<%= link_to "time", :action => "time" %>。
正如在跨越邊界 之前的文章中所看到的那樣,Ruby 用其表達(dá)式的值替代 <%=h 和 %> 之間的代碼。在這個(gè)示例中,link-to 方法是一個(gè)生成簡(jiǎn)單 HTML 鏈接的輔助例程??梢酝ㄟ^(guò)執(zhí)行該代碼看到該鏈接。通過(guò)鍵入 script/server 啟動(dòng)服務(wù)器,然后將瀏覽器指向 http://localhost:3000/ajax/show 。您將看到圖 1 中的視圖:
圖 1. 不涉及 Ajax 的簡(jiǎn)單用戶界面
在瀏覽器中,單擊菜單項(xiàng)來(lái)查看頁(yè)面源代碼(在 Internet Explorer 為 View > Source ,在 Firefox 中為 View > Page Source)。您將看到清單 3 中的代碼:
清單 3. 由 show.rhtml 生成的視圖
<h1>Ajax show</h1>
Click this link to show the current <a href="/ajax/time">time</a>.
|
請(qǐng)注意清單 3 中的鏈接代碼。該模板讓 Rails 用戶不必面對(duì)冗長(zhǎng)且容易出錯(cuò)的 HTML 句法。(Ajax 代碼也是這樣運(yùn)行:使用輔助方法插入 JavaScript 代碼,該代碼替您管理遠(yuǎn)程請(qǐng)求和 HTML 替換。)如果單擊該鏈接,將看到針對(duì) time 方法的默認(rèn)視圖,但我還沒(méi)有實(shí)現(xiàn)它。為加以補(bǔ)救,請(qǐng)用清單 4 中的代碼替換 app/controllers/ajax_controller.rb 中的 time 方法。為保持簡(jiǎn)單,我直接從控制器中呈現(xiàn)視圖。稍后,我會(huì)把一切處理好并呈現(xiàn)視圖。
清單 4. 呈現(xiàn)時(shí)間
def time
render_text "The current time is #{Time.now.to_s}"
end
|
現(xiàn)在,當(dāng)單擊該鏈接時(shí),會(huì)得到圖 2 中的視圖:
圖 2. 不涉及 Ajax 的視圖
很快就能看到這個(gè) UI 的一個(gè)問(wèn)題。這兩個(gè)視圖不從屬于單獨(dú)的頁(yè)面。該應(yīng)用程序表示一個(gè)單一概念:?jiǎn)螕粢粋€(gè)鏈接來(lái)顯示時(shí)間。為反復(fù)更新時(shí)間,每次都需要單擊該鏈接和 Back 按鈕。將該鏈接和時(shí)間放到相同的頁(yè)面中也許可以解決這個(gè)問(wèn)題。但如果該頁(yè)面變得非常大或非常復(fù)雜,重新顯示整個(gè)頁(yè)面會(huì)很浪費(fèi),也會(huì)很復(fù)雜。
添加 Ajax
Ajax 讓您可以只更新 Web 頁(yè)面的一個(gè)片段。Rails 庫(kù)為您處理大部分的工作。要將 Ajax 添加到這個(gè)應(yīng)用程序中,需要以下四個(gè)步驟:
- 配置 Rails 以使用 JavaScript。
- 更改時(shí)間鏈接來(lái)提交 JavaScript Ajax 請(qǐng)求,而不是僅呈現(xiàn)一個(gè) HTML 鏈接。
- 指定要更新的 HTML 片斷。
- 為更新的 HTML 內(nèi)容準(zhǔn)備一個(gè)位置。
- 構(gòu)建一個(gè)控制器方法,或者一個(gè)視圖來(lái)呈現(xiàn) Ajax 響應(yīng)。
首先,更改 app/views/ajax/show.rhtml 中的代碼,使其與清單 5 類似:
清單 5. 更改顯示視圖來(lái)使用 Ajax
<%= javascript_include_tag :defaults %>
<h1>Ajax show</h1>
Click this link to show the current
<%= link_to_remote "time",
:update => ‘time_div‘,
:url => {:action => "time"} %>.<br/>
<div id=‘time_div‘>
</div>
|
我做了一些更改。首先,為處理配置,簡(jiǎn)單地將必要的 JavaScript 庫(kù)直接包含在視圖中。通常,還會(huì)有更多的視圖,為避免重復(fù),我將 JavaScript 文件包含在一個(gè)公共的 Rails 組件中,如 Rails 布局。本例只有一個(gè)視圖,所以一切從簡(jiǎn)。
其次,我改變了鏈接標(biāo)記來(lái)使用 link_to_remote。您一會(huì)兒就能看到這個(gè)鏈接的作用。請(qǐng)注意下列三個(gè)參數(shù):
- 鏈接文本:從非 Ajax 的例子中照搬過(guò)來(lái)。
:update 參數(shù)。如果您以前沒(méi)見(jiàn)過(guò)這種語(yǔ)法,那么就把 :update => ‘time_div‘ 當(dāng)作是一個(gè)已命名的參數(shù),其中的 :update 是名稱,update_div 是值。此代碼告訴 Prototype 庫(kù):此鏈接中的結(jié)果將用 time_div 這一名稱更新 HTML 組件。
- 代碼
:url => {:action => "time"} 指定該鏈接將調(diào)用的 URL。:url 從一個(gè)哈希映射表中獲取值。在實(shí)際中,該哈希映射表只有一個(gè)針對(duì)控制器動(dòng)作的元素::time。理論上,該 URL 也可以包含控制器的名稱和控制器需要的任何可選參數(shù)。
在清單 5 中,還可以看到空的 div,Rails 將用當(dāng)前時(shí)間更新它。
在瀏覽器中,裝載頁(yè)面 http://localhost:3000/ajax/show。單擊該鏈接,將看到圖 3 中的結(jié)果。
圖 3. 含 Ajax 的視圖
為了很好地了解這里發(fā)生的情況,請(qǐng)查看該 Web 頁(yè)面的源代碼。清單 6 顯示了該代碼:
清單 6. 顯示模板的結(jié)果(在啟用 Ajax 的情況下)
<script src="/javascripts/prototype.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/effects.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/dragdrop.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/controls.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/application.js?1159113688" type="text/javascript"></script>
<h1>Ajax show</h1>
Click this link to show the current
<a href="#" onclick="new Ajax.Updater(
‘time_div‘, ‘/ajax/time‘, {asynchronous:true, evalScripts:true});
return false;">time</a>.<br/>
<div id=‘time_div‘>
</div>
|
請(qǐng)注意包含的 JavaScript 列表。Rails 輔助方法(include_javascript_tags :defaults)為您構(gòu)建了此列表。接下來(lái),看到一個(gè)用來(lái)構(gòu)建新的 Ajax.Updater 對(duì)象的 JavaScript 函數(shù)調(diào)用,而不是一個(gè) HTML 鏈接。正如您所料想的那樣,名為 asynchronous 的參數(shù)被設(shè)置為 true。最后,在 HTML div 標(biāo)記中看不到值,這是由于初始頁(yè)面在那里沒(méi)有值。
使用其他 Ajax 選項(xiàng)
Ajax 能生成強(qiáng)大的動(dòng)作,甚至能生成一些預(yù)料不到的動(dòng)作。例如,用戶也許沒(méi)注意到更新的時(shí)間鏈接。link_to_remote 選項(xiàng)讓您能夠輕易地將特殊效果應(yīng)用到該條目上,從而讓用戶注意到該結(jié)果?,F(xiàn)在將應(yīng)用一些效果。請(qǐng)更改 show.rhtml 中的 link_to_remote 輔助方法,使它與清單 7 類似:
清單 7. 添加效果
<%= link_to_remote "time",
:update => ‘time_div‘,
:url => {:action => "time"},
:complete => "new Effect.Highlight(‘time_div‘)" %>
|
最佳 Ajax 效果會(huì)使您的更改獲得臨時(shí)的關(guān)注,但卻不會(huì)永久持續(xù)。您的目標(biāo)應(yīng)該是把更改提示給用戶,而不打斷他們的工作流。像這種用黃色來(lái)弱化強(qiáng)調(diào)的技術(shù),或用滑入內(nèi)容或淡出內(nèi)容來(lái)讓用戶注意的技術(shù)都不是長(zhǎng)久之計(jì)。
到目前為止,鏈接是您見(jiàn)到的惟一觸發(fā)器。Ajax 還有許多其他的可用武器,一些由用戶驅(qū)動(dòng),而另一些由程序事件驅(qū)動(dòng),如時(shí)鐘。它是一個(gè)像鬧鐘一樣并不需要用戶干預(yù)的東西??梢杂?Ajax 的 periodically_call_remote 方法定期更新時(shí)鐘。請(qǐng)按照清單 8 編輯 show.rhtml 中的代碼:
清單 8. 定期調(diào)用遠(yuǎn)程方法
<%= javascript_include_tag :defaults %>
<h1>Ajax show</h1>
<%= periodically_call_remote :update => ‘time_div‘,
:url => {:action => "time"},
:frequency => 1.0 %>
<div id=‘time_div‘>
</div>
|
圖 4 顯示了結(jié)果:不需要用戶干預(yù),每隔一秒鐘進(jìn)行更新的時(shí)鐘:
圖 4. 用 Ajax 定期更新的時(shí)鐘
盡管 Rails 視圖中的代碼和不含 Ajax 的版本相似,但背后的代碼卻很不同:此版本使用 JavaScript 代替了 HTML??梢酝ㄟ^(guò)在瀏覽器中查看源代碼看到清單 9 中的代碼:
清單 9. periodically_call_remote 的源代碼
<script src="/javascripts/prototype.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/effects.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/dragdrop.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/controls.js?1159113688" type="text/javascript"></script>
<script src="/javascripts/application.js?1159113688" type="text/javascript"></script>
<h1>Ajax show</h1>
<script type="text/javascript">
//<![CDATA[
new PeriodicalExecuter(function() {new Ajax.Updater(
‘time_div‘, ‘/ajax/time‘, {asynchronous:true, evalScripts:true})}, 1.0)
//]]>
</script>
<div id=‘time_div‘>
</div>
|
請(qǐng)一定注意這里發(fā)生的情況。您正在一個(gè)更高層的抽象之上有效地工作,而不是使用小塊的自定義 JavaScript 片段,Ruby on Rails 模板系統(tǒng)使使用模型變得相當(dāng)自然。
正如之前提到的那樣,我正從控制器中直接呈現(xiàn)文本。這一簡(jiǎn)化使開(kāi)始編程變得很容易,但卻不能一直持續(xù)下去。視圖應(yīng)該處理顯示,控制器應(yīng)該在視圖和模型間調(diào)度數(shù)據(jù)。這項(xiàng)設(shè)計(jì)技術(shù)叫做模型-視圖-控制器(MVC),它使對(duì)視圖或模型的更改更容易分隔開(kāi)。為使這個(gè)應(yīng)用程序符合 MVC,可以讓 Rails 呈現(xiàn)默認(rèn)視圖,正如預(yù)料的那樣,該內(nèi)容將替代 time-div 之前的內(nèi)容。請(qǐng)按照清單 10 更改 app/controllers/ajax_controller.rb 中的 time 方法:
清單 10. 重構(gòu)
def time
@time = Time.now
end
|
請(qǐng)按照清單 11 更改 app/views/ajax/time.rhtml 中的視圖:
清單 11. 使用視圖呈現(xiàn) Ajax 內(nèi)容
<p>The current time is <%=h @time %></p>
|
控制器方法設(shè)置一個(gè)名為 @time 的實(shí)例變量。由于控制器什么都沒(méi)明確地呈現(xiàn)出來(lái),Rails 將 time.rhtml 視圖呈現(xiàn)出來(lái)。這種使用模型和呈現(xiàn)一個(gè)不含 Ajax 的視圖完全一致。 可以再一次看到,Rails 使開(kāi)發(fā)人員不必考慮使用 Ajax 和不使用 Ajax 的應(yīng)用程序間的區(qū)別。從傳統(tǒng)的 Web 應(yīng)用程序到 Ajax,該使用模型都驚人地相似。由于使用 Ajax 的成本如此之低,越來(lái)越多的 Rails 應(yīng)用程序都開(kāi)始利用 Ajax。
Rails 中 Ajax 的其他用法
Rails Ajax 體驗(yàn)領(lǐng)域?qū)拸V且內(nèi)容深刻 —— 我無(wú)法用單篇文章甚至一系列文章來(lái)概括其深刻的內(nèi)容。我只能指出 Rails Ajax 支持可以解決其他一些問(wèn)題。下面是 Rails 中 Ajax 的一些通常用法:
- 提交遠(yuǎn)程表單。 除了必須異步提交以外,Rails 中的 Ajax 表單和傳統(tǒng)表單的執(zhí)行方式完全一樣。這意味著 Rails 中的
Forms 輔助標(biāo)記讓您必須指定一個(gè)要更新的 URL,執(zhí)行可視化的效果,正如使用 link_to_remote 一樣。正如 link-to-remote 擴(kuò)展了 link_to 輔助方法一樣,Rails submit_to_remote 擴(kuò)展了一個(gè) Rails submit 輔助方法。
- 執(zhí)行復(fù)雜腳本。 Rails 開(kāi)發(fā)人員常常需要執(zhí)行復(fù)雜的腳本,遠(yuǎn)不止更新單個(gè)
div 和執(zhí)行效果那么簡(jiǎn)單。為此,Rails 提供 JavaScript 模板。用 JavaScript 模板,可以將任意 JavaScript 腳本作為 Ajax 請(qǐng)求的結(jié)果來(lái)執(zhí)行。這些模板的一些常見(jiàn)用法(叫作 RJS 模板)為更新多個(gè) div、處理表單驗(yàn)證和管理 Ajax 錯(cuò)誤場(chǎng)景。
- 拼寫(xiě)補(bǔ)全。 您一定想基于數(shù)據(jù)庫(kù)中的條目為您的用戶提供拼寫(xiě)補(bǔ)全服務(wù)。例如,如果用戶鍵入
Bru,我想讓我的應(yīng)用程序注意到數(shù)據(jù)庫(kù)中 “Bruce Tate” 這個(gè)值??梢允褂?Ajax 定期檢查字段的更改,并根據(jù)用戶鍵入的內(nèi)容發(fā)送拼寫(xiě)補(bǔ)全建議。
- 動(dòng)態(tài)構(gòu)建復(fù)雜表單。 在業(yè)務(wù)領(lǐng)域里,常常需要查看部分已完成表單,然后才能知道用戶應(yīng)該完成哪個(gè)字段。例如,如果用戶擁有一些特定種類的收入或費(fèi)用,那么 1040EZ 納稅單是無(wú)效的??梢栽谶@個(gè)過(guò)程中用 Ajax 更新表單。
- 拖放。 可以用 Rails 快速實(shí)現(xiàn)拖放支持,這比大多數(shù)其他框架要省力得多。
結(jié)束語(yǔ)
Ajax 并不是沒(méi)有問(wèn)題。當(dāng) Ajax 運(yùn)行良好時(shí),整個(gè)體驗(yàn)會(huì)是激動(dòng)人心的。但當(dāng)運(yùn)行不順利時(shí),您也許會(huì)發(fā)現(xiàn)對(duì)其進(jìn)行調(diào)試是一個(gè)全新的領(lǐng)域,調(diào)試技術(shù)和工具還沒(méi)有其他語(yǔ)言中那么成熟。Ruby on Rails 的確有一個(gè)核心優(yōu)勢(shì):簡(jiǎn)單。Rails 包裝器(加上很棒的社區(qū)支持)使得進(jìn)入這一新環(huán)境變得簡(jiǎn)單,而且最初的投資非常低。但 Rails 支持也僅限于此。這兩個(gè)框架還沒(méi)有覆蓋 Ajax 的全部?jī)?nèi)容,無(wú)法滿足每個(gè)用戶的需求。
Java 語(yǔ)言有更多的 Ajax 框架和方法可供選擇。可以找到更具靈活性的,也可以找到具有很棒的支持基礎(chǔ)的。但靈活性是要付出代價(jià)的。您不僅需要一個(gè)強(qiáng)大的 Ajax 框架,也需要一個(gè) Web 開(kāi)發(fā)框架。例如,集成 JSF 框架和集成 Struts 是兩種截然不同的體驗(yàn)。新技術(shù)通常追求簡(jiǎn)單。對(duì)于那些在 UI 中需要 Ajax 的出色特性,卻又不需要由 Java 提供的高級(jí)企業(yè)集成特性的問(wèn)題,Ajax on Rails 也許正合適。下一次,我將更深入地介紹 JavaScript。請(qǐng)繼續(xù)關(guān)注跨越邊界。
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
- Ruby on Rails:下載開(kāi)放源碼的 Ruby on Rails Web 框架。
- Ruby:從該項(xiàng)目的 Web 站點(diǎn)獲取 Ruby。
討論
關(guān)于作者
 |
|

|
 |
Bruce Tate 居住在德克薩斯州的首府奧斯汀,他是一位父親,同時(shí)也是山地車手和皮艇手。他是三本 Java 暢銷書(shū)的作者,包括榮獲 Jolt 大獎(jiǎng)的 Better, Faster, Lighter Java。最近他又出版了 Beyond Java. 一書(shū)。他在 IBM 工作了 13 年,現(xiàn)在是 RapidRed 顧問(wèn)公司 的創(chuàng)始人,在這里他潛心研究基于 Java 技術(shù)和 Ruby on Rails 的輕量級(jí)開(kāi)發(fā)策略和架構(gòu)。
|
|