在《WCF分布式安全開發(fā)實踐》系列文章之后,很想重新開啟一個系列文章,來完善WCF的學習知識。思考很久,決定寫一下WCF和AJAX學習的文章,取名為《WCF與AJAX編程開發(fā)實踐》。
這個系列主要關(guān)注在WCF于AJAX集成的開發(fā)學習上??紤]到很多沒有AJAX的朋友,可能要接觸WCF。這里會從頭開始。最初的AJAX概念和原理,然后會講解微軟的ASP.NET AJAX,中間是支持AJAX的Web Service,因為在WCF之前,Web Service已經(jīng)支持AJAX集成交互了,這里作為過渡知識,會單獨給出一篇介紹。最后正式進入WCF和AJAX的學習階段,進而分析一些與AJAX相關(guān)的重要的WCF的特性。
這個系列的文章大概會涉及一下幾個主題:
1.簡單的AJAX示例;
2.支持ASP.NET Ajax的Web Service;
3.支持ASP.NET Ajax的WCF服務;
4.支持非ASP.NET AJAX的WCF服務;
5.支持JSON的Ajax WCF服務;
6.支持XML的Ajax WCF服務 。
這些是計劃初步完成的文章。有一定AJAX基礎(chǔ)的學習者,可以直接從文章3以后看,前面3篇文章是作為0基礎(chǔ)AJAX學習準備的。這個計劃也是希望能使得學習者有個階梯進步的過程。網(wǎng)上關(guān)于AJAX的文章也很多,大家也可以自己學習。這里我堅持的原則還是從Ajax最初的歷史講起。免得給大家導致不必要的誤會。技術(shù)高手可以作為趣聞來重新回顧一下AJAX。
文章還是從最基本的概念講起,AJAX的起源和興起。一些與AJAX相關(guān)的重要Web技術(shù)標準.然后會提到AJAX的核心對象XMLHttpRequest。最后會是簡單AJAX的分析。
【1】什么是AJAX:
AJAX全稱是Asynchronous JavaScript and XML,也就是異步JavaScript和XML。
來自W3schools的定義:
1.AJAX = Asynchronous JavaScript and XML.
2.AJAX is based on JavaScript and HTTP requests.()。
3.AJAX is a type of programming made popular in 2005 by Google (with Google Suggest).
4.AJAX is not a new programming language, but a new way to use existing standards.
翻譯為中文以后就是:
1.AJAX等價于Asynchronous JavaScript and XML.
2.AJAX基于JavaScript和HTTP請求
3.AJAX是一種由Google 提示而流行起來的編程方式,
4.AJAX 不是一種新的編程語言,而是一種使用現(xiàn)有標準的新方法。
【1.1】歷史回顧:AJAX在1998年前后得到了應用。允許客戶端腳本通過XMLHTTP對象發(fā)送HTTP請求給服務端。第一個XMLHTTP組件由Outlook Web Access小組完成。該組件原屬于微軟Exchange Server服務器產(chǎn)品,并且迅速地成為了Internet Explorer 4.0的一部分。所以很多人認為第一個比較成熟應用了Ajax技術(shù)的成功的商業(yè)應用程序久是:Outlook Web Access。它使得Outlook Web Access成為包括Oddpost的網(wǎng)絡郵件產(chǎn)品在內(nèi)的許多產(chǎn)品的領(lǐng)頭羊。但是AJAX的推廣不得不提到另外一個公司:GOOGLE。2005年初,正是由于Google的大規(guī)模應用,才使得Ajax被大眾所了解。Google在它著名的交互應用程序中使用了異步通訊,如Google討論組、Google地圖、Google搜索建議、Gmail等。只要使用到Google產(chǎn)品的人都知道,最簡單的就是搜索提示,當用戶輸入一個字符的時候,會自動提示匹配的結(jié)果數(shù)目。大家可以到這里測試一下:
http://www.google.com/。
Ajax這個詞由Jesse James Gaiiett2005年在《Ajax: A New Approach to Web Applications》一文所創(chuàng)。從此AJAX為業(yè)界接受。另外,Mozilla Firefox、Opera 以及 Safari 瀏覽器的支持,也使得AJAX的得推廣更加容易,使得該技術(shù)走向成熟。
【1.2】基本原理與優(yōu)點:
AJAX技術(shù)的本質(zhì)原理就是:使用 JavaScript 的 XMLHttpRequest 對象來直接與服務器進行通信。通過這個對象,JavaScript 可在不重載頁面的情況與 Web 服務器交換數(shù)據(jù)。然后通過DOM更新部分頁面原屬。
Ajax最大的優(yōu)點在于它帶來的更好的用戶體驗。傳統(tǒng)的web頁面請求不同,AJAX技術(shù)當提交表單時就向web服務器發(fā)送一個請求。服務器接收并處理傳來的表單,然後返回一個新的網(wǎng)頁。這個做法浪費了許多帶寬,因為在前後兩個頁面中的大部分HTML代碼往往是相同的。AJAX 在瀏覽器與 Web 服務器之間使用異步數(shù)據(jù)傳輸(HTTP 請求),這樣就可使網(wǎng)頁從服務器請求少量的信息,而不是整個頁面。
AJAX 可使因特網(wǎng)應用程序更小、更快,更友好。
【2】相關(guān)的重要Web技術(shù):
AJAX基于JavaScript和HTTP請求,那一定會使用到一些現(xiàn)有的技術(shù),或者標準。簡單來說就是:
(1)JavaScript,腳本語言,操作DOM頁面對象,使用XMLHttpRequest 對象來直接與服務器進行通信。
(2)XML :跨平臺數(shù)據(jù)傳遞的標準。
(3)HTML :超文本標記語言。
(4)CSS :級聯(lián)樣式表,CSS提供了從內(nèi)容中分離應用樣式和設計的機制。
在 AJAX 中使用的 Web 標準已被良好定義,并被所有的主流瀏覽器IE5+,Mozilla Firefox、Opera 以及 Safari 支持。AJAX 應用程序獨立于瀏覽器和平臺。
所以說AJAX不是一個新技術(shù),而是現(xiàn)有技術(shù)和標準的結(jié)合。
【3】瀏覽器兼容性:
關(guān)于AJAX的應用,要考慮的一個重要問題就是瀏覽器的兼容性,因為各個廠商在定義諸如AJAX和CSS樣式特性的時候,標準不統(tǒng)一,應用過程中會出現(xiàn)瀏覽器兼容的問題。例如對于XMLHttpRequest。構(gòu)建一個運行在不同瀏覽器就需要特別注意。
這個問題解決的辦法之一就是在使用這些對象的時候,判斷瀏覽器,進而區(qū)別對待。另外一個推薦的方式就是使用現(xiàn)有的AJAX框架,它們符合跨瀏覽器AJAX開發(fā)的客戶端JavaScript庫。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.可以直接使用。XMLHttpRequest 對象得到下列瀏覽器的支持:Internet Explorer 5.0+、Safari 1.2、Mozilla 1.0 / Firefox、Opera 8+ 以及 Netscape 7。
【4】XMLHttpRequest:
前面我們提到,AJAX的核心在于XMLHttpRequest 對象。它是AJAX實現(xiàn)的基礎(chǔ)。AJAX通過使用 XMLHttpRequest 對象創(chuàng)建一種動態(tài)性極強的web 界面。Google 就是很好的例子。當你在Google 的搜索框中輸入查詢時,XMLHttpRequest 會向某個服務器發(fā)出這些字詞,然后服務器會返回一系列的搜索提示。
【4.1】對象創(chuàng)建:
不同的瀏覽器創(chuàng)建 XMLHttpRequest 對象的方法是有差異的。IE 瀏覽器使用 ActiveXObject,而其他的瀏覽器使用名為 XMLHttpRequest 的 JavaScript 內(nèi)建對象。代碼如下:
<script type="text/javascript">
function ajaxCall()
{
var xmlHttp;
try
{
// Safari 1.2、Mozilla 1.0 / Firefox、Opera 8+ 以及 Netscape 7等瀏覽器
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer 5.0+瀏覽器
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("瀏覽器不支持AJAX!");
return false;
}
}
}
}
</script>
這里代碼在實例化
XMLHttpRequest 對象的時候做了異常處理,從而嘗試創(chuàng)建瀏覽器支持的實例。
【4.2】對象狀態(tài):
在使用XMLHttpRequest對象時, 我們可以通過readyState屬性來判斷服務器響應狀態(tài)。返回值與狀態(tài)的關(guān)系如下:
狀態(tài) | 描述 |
0 | 請求未初始化(在調(diào)用 open() 之前) |
1 | 請求已提出(調(diào)用 send() 之前) |
2 | 請求已發(fā)送(這里通常可以從響應得到內(nèi)容頭部) |
3 | 請求處理中(響應中通常有部分數(shù)據(jù)可用,但是服務器還沒有完成響應) |
4 | 請求已完成(可以訪問服務器響應并使用它) |
也就是說,我們在readyState==4的時候,來處理返回結(jié)果。這樣保證了XMLHttpRequest對象完成了與服務器的交互過程。
【4.3】處理返回數(shù)據(jù):
在XMLHttpRequest對象返回數(shù)據(jù)以后,我們需要對數(shù)據(jù)進行處理。這些返回數(shù)據(jù)的可以是字符,也可以是XML文檔格式。
這里我們需要在在XMLHttpRequest對象的onreadystatechange屬性綁定我們要處理數(shù)據(jù)的Javascript函數(shù) .然后進行數(shù)據(jù)的處理。
我們可以通過 XMLHttpRequest對象的responseText 屬性來取回由服務器返回的數(shù)據(jù)。參考代碼如下:
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
var data =xmlHttp.responseText;
//獲取返回數(shù)據(jù),添加處理代碼進行處理
}
}
如果返回的是XML格式的數(shù)據(jù),我們也可以通過xmlHttp.responseXML.documentElement來處理;在定義了如何處理響應后,就要發(fā)送請求了.可以調(diào)用HTTP請求類的open()
和send()
方法, 這里需要想請求的服務器發(fā)送數(shù)據(jù)和請求。參考代碼如下:
http_request.open('GET', 'http://www.google.com', true);
http_request.send(null);
(1)open()的第一個參數(shù)是HTTP請求方式 – GET, POST, HEAD 或任何服務器所支持調(diào)用的方式. 有關(guān)HTTP請求方法的詳細信息可參考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs
(2)第二個參數(shù)是請求的URL.
(3)第三個參數(shù)設置請求是否為異步模式.如果第一個參數(shù)是"POST",send()方法的參數(shù)可以是任何想送給服務器的數(shù)據(jù). 這時數(shù)據(jù)要以字符串的形式送給服務器:name=frank&address=shanghai。
以上久是AJAX通信和數(shù)據(jù)處理相關(guān)的主要知識點。這些是AJAX技術(shù)的基礎(chǔ)步驟,無論你使用數(shù)目AJAX框架,基本的通信步驟和數(shù)據(jù)處理都是在此基礎(chǔ)上的封裝和擴展。
【5】示例代碼分析:
這里我們給出的是一個AJAX讀取數(shù)據(jù),并且顯示到頁面的例子。不使用ASP.NET FrameWork等框架.只使用Javascript和HTML借助XMLHttpRequest來實現(xiàn)數(shù)據(jù)的讀取,純潔的原生態(tài)AJAX代碼。這里大家可以使用文本編輯器或者寫字板等工具來編寫代碼。當然也可以借助其他功能強大的IDE編輯器。
【5.1】頁面Javascript代碼:
這里頁面上放置了3個HTML控件,2個文本和一個按鈕,點擊按鈕,讀取數(shù)據(jù),顯示到文本框。頁面比較簡單。整個過程發(fā)送一個簡單的HTTP請求。全部的代碼如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>純AJAX例子:讀取數(shù)據(jù)</title>
</head>
<body>
<script type="text/javascript">
function ajaxCall()
{
var xmlHttp;
try{// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();//實例化XMLHttpRequest對象
}
catch (e)
{
// Internet Explorer 5+
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("瀏覽器不支持AJAX!");
return false;
}
}
}
//綁定數(shù)據(jù)處理函數(shù)。
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
if (xmlHttp.status == 200)
{
document.getElementById('txtResult').innerHTML=document.getElementById('txtUsername').value + xmlHttp.responseText;
} else
{
alert('請求出錯.');
// there was a problem with the request,
// for example the response may be a 404 (Not Found)
// or 500 (Internal Server Error) response codes
}
}
}
xmlHttp.open("GET","data.txt",true);//異步請求數(shù)據(jù)
xmlHttp.send(null);
}
</script>
<form style="text-align:left">
姓名: <input type="text" name="txtUsername" style="width:400px;" />
<br />
測試:<input type="button" name="btn" value="測試" onclick="ajaxCall();" style="width:400px;" />
<br />
結(jié)果: <textarea name="txtResult" style="width:400px;"></textarea>
</form>
</body>
</html>
【5.2】數(shù)據(jù)文件:
數(shù)據(jù)文件使用文本文件,內(nèi)容是簡單的字符。包含字符“Hello,It is a pure AJAX test!”。這個會和輸入的用戶名顯示到一起。簡單的SayHello程序。就不貼出了。大家可以在例子代碼里下載這個代碼,然后自己定義或者修改。進行測試。
【5.3】測試結(jié)果:
輸入姓名,然后發(fā)送http get請求,XMLHttpRequest對象異步讀取數(shù)據(jù),顯示在結(jié)果列表。這里借助Visual Studio來測試頁面,使用Visual Studio網(wǎng)站方式打開剛才編輯的文件的目錄文件夾。然后運行或者在瀏覽器中查看頁面,就可以進行測試了。直接查看測試會出錯,文件讀取權(quán)限錯誤。測試結(jié)果如圖:
【6】總結(jié):
以上就是AJAX基礎(chǔ)概念和例子的全部內(nèi)容。這個文章適合AJAX入門的初學者。目前AJAX的應用已經(jīng)相當廣泛。幾乎所有的網(wǎng)站和基于Web的系統(tǒng)都能看到AJAX的影子,它已經(jīng)相當成熟。而且為廣大的開發(fā)者和用戶接受。
(1)AJAX不是一門新的技術(shù),它是多種已有技術(shù)的集成應用,帶來了更好的用戶體驗。
(2)AJAX最先由Microsoft創(chuàng)立,Google對AJAX的推廣起到很大作用。
(3)AJAX不是萬能的,在開發(fā)AJAX程序的過程里一定要注意瀏覽器的兼容性問題??梢钥紤]借助一些開源的AJAX框架。
(4)AJAX的初學者,很多人直接學習和使用ASP.NET AJAX框架,習慣拖拽控件,導致AJAX學習走了很都彎路。學ASP.NET AJAX等開發(fā)框架以前,最好能先閱讀一些AJAX基礎(chǔ)概念的書籍或者教程,這樣可以使你對AJAX的本質(zhì)有個清晰的認識。
最后是本文的參考代碼:/Files/frank_xl/1.PureAJAXSampleFrankXuLei.rar。歡迎關(guān)注后續(xù)WCF AJAX文章。謝謝.
參考文章:
1.http://www.w3schools.com/Ajax/Default.Asp
2.https://developer.mozilla.org/cn/AJAX/%e5%bc%80%e5%a7%8b
3.http://baike.baidu.com/view/1641.htm
4.http://www.w3school.com.cn/ajax/ajax_intro.asp