ajax脚本下载_E4X的AJAX和脚本Web服务,第1部分
ajax腳本下載
ECMAScript for XML
您可能以前沒有碰過術(shù)語ECMAScript 。 它實(shí)際上是JavaScript的正式名稱。 歐洲計(jì)算機(jī)制造商協(xié)會(huì)(ECMA)是JavaScript標(biāo)準(zhǔn)化的標(biāo)準(zhǔn)機(jī)構(gòu)(也是C#和CLR標(biāo)準(zhǔn)化的地方)。 可從ECMA網(wǎng)站免費(fèi)獲得ECMAScript標(biāo)準(zhǔn)。
E4X是JavaScript的擴(kuò)展,它為語言增加了對XML的直接支持。 這也是一個(gè)ECMA標(biāo)準(zhǔn)(參見相關(guān)主題 - ECMA-357)。 那么什么是直接支持,為什么有價(jià)值? 如果您是JavaScript程序員,則可能已經(jīng)使用Netscape LiveConnect或Rhino(在Java?下運(yùn)行的免費(fèi)可用JavaScript庫)之類的技術(shù)來將Java庫與JavaScript一起使用。 這意味著您已經(jīng)可以借助XML庫來創(chuàng)建,操作和使用XML。 同樣,如果使用Microsoft?Internet Explorer,則可以通過Microsoft MSXML2庫獲得XML支持。 好吧,如果您使用過這些庫,請為進(jìn)行重大更改做準(zhǔn)備-E4X變得更加簡單易用。
在查看示例之前,請先嘗試一下:E4X目前在兩種實(shí)現(xiàn)中可用。 兩者都可以從Mozilla獲得。 一個(gè)是瀏覽器使用的C JavaScript引擎(代號SpiderMonkey),它可以在最新的Mozilla構(gòu)建中使用-我們使用的是Mozilla 1.8a6。 Rhino也提供E4X。 Rhino是用Java內(nèi)置JavaScript解釋器和編譯器,我們將演示它們是獨(dú)立的并在Axis中運(yùn)行。 兩者都可以從Mozilla獲得 。
在這些示例中,我們首先在Rhino的命令行上使用E4X,然后再在Mozilla的瀏覽器中使用E4X,以演示AJAX模型。 在第二篇文章中,我們將向您展示如何通過將Rhino嵌入Apache Axis Web服務(wù)引擎中來在服務(wù)器中使用E4X。 但是,在繼續(xù)進(jìn)行Web服務(wù)之前,我們將向您展示E4X中XML編程的基礎(chǔ)。
一個(gè)簡單的例子
讓我們從一個(gè)簡單的例子開始。 我們解析并處理一個(gè)XML,該XML表示有關(guān)作者的一些信息。 我們想要的XML如下所示:
清單1.作者
<people><person gender="male"><name>Ant</name><hair>Shaggy</hair><eyes>Blue</eyes><height measure="metric">176</height></person><person gender="male"><name>Paul</name><hair>Spiky</hair><eyes>Grey</eyes><height measure="metric">178</height></person></people>如果我們將其包含在字符串中,則只需執(zhí)行以下操作即可“解析”該字符串:
var x = new XML(peopleXMLString);
另外,我們可以簡單地在代碼中“內(nèi)聯(lián)” XML:
var x = <people><person gender="male"><name>Ant</name><hair>Shaggy</hair><eyes>Blue</eyes><height measure="metric">176</height></person><person gender="male"><name>Paul</name><hair>Spiky</hair><eyes>Grey</eyes><height measure="metric">178</height></person></people>;是的-是的-XML成為語言的直接組成部分。
在Rhino上使用E4X
如果您和我們一樣,現(xiàn)在就想嘗試一下。 最新版本的Rhino 1.6R1與Apache的XMLBeans庫一起支持E4X。 只需抓取這些軟件包,解壓縮它們,然后將js.jar和xbean.jar添加到您的類路徑中,然后啟動(dòng)JavaScript shell。
java -cp js.jar;xbean.jar org.mozilla.javascript.tools.shell.Main現(xiàn)在,您可以嘗試以下示例。 您可以從此處剪切并粘貼它們,也可以將它們包含在文件examples1.js中,該文件位于zip文件(ws-ajax1code.zip)中,您可以通過單擊頂部的代碼圖標(biāo)進(jìn)行下載。或本文的底部。
您可以僅使用JavaScript屬性來引用XML的任何部分。 例如:
print(x.person[0].name);Antprint(x.person[1].hair);Spiky您是否注意到我們沒有使用DOM或SAX等XML API? XML已經(jīng)簡單地成為JavaScript可以理解的本機(jī)類型之一。
使用以下命令打印出兩個(gè)人的身高:
for each (var h in x..height) { print(h) };176178..語法非常有用。 它返回與以下標(biāo)記名匹配的所有深度的所有子元素。 因此x..height返回height標(biāo)簽的值。
另一個(gè)有用的語法如下:
print(x.person.(name=="Ant").hair);Shaggy這使得在樹內(nèi)進(jìn)行查找非常簡單。
一個(gè)更復(fù)雜的例子
假設(shè)您要將高度從公制更改為英制(這就是我們英國人所說的英尺和英寸)。
首先是從厘米到英寸的換算...
function metricToImperial(cms) {var totalinches = Math.round(cms/2.54); var inch = totalinches%12;var ft = (totalinches-inch)/12; var response = <height/>;response.feet = ft;response.inches = inch + 2; // we sounded a bit shortresponse.@measure = "imperial";return response;}第一個(gè)有趣的行是這樣的:
var response = <height/>;
該行允許您在JavaScript中“內(nèi)聯(lián)” XML。 此語法有兩個(gè)好處。 首先,它使使用XML變得非常容易。 其次,代碼的含義很明確。
現(xiàn)在,您可以向該元素添加更多子元素:
response.feet = ft;
這將創(chuàng)建<height>的子元素,其標(biāo)簽名稱設(shè)置為“ feet”,其值設(shè)置為變量ft的值。
您還可以通過以下方式操作屬性:
response.@measure = "imperial";
現(xiàn)在,讓我們使用此函數(shù)來更新XML:
for each (var p in x.person) { if (p.height.@measure=="metric") p.height=metricToImperial(p.height); }print (x);這是輸出:
<people><person gender="male"><name>Ant</name><hair>Shaggy</hair><eyes>Blue</eyes><height measure="imperial"><feet>5</feet><inches>11</inches></height></person><person gender="male"><name>Paul</name><hair>Spiky</hair><eyes>Grey</eyes><height measure="imperial"><feet>5</feet><inches>12</inches></height></person></people>E4X中的XML命名空間
如果您是XML專家,那么此時(shí),您可能想知道如何使用此語法管理XML命名空間。 有三種方法可以做到這一點(diǎn):
首先,您可以使用嵌入式XML語法:
var soapMsg = <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"/>;print(soapMsg.namespace());http://www.w3.org/2003/05/soap-envelope下一種方法是在創(chuàng)建元素之前設(shè)置默認(rèn)的XML命名空間:
default xml namespace = new Namespace("http://www.w3.org/2003/05/soap-envelope");您可以通過將默認(rèn)名稱空間設(shè)置為空字符串來重置默認(rèn)名稱空間:
default xml namespace = ""最后一種方法是使用::運(yùn)算符
var f = new Namespace("http://fremantle.org");soapMsg.Body.f::GetStockQuote="IBM";print(soapMsg);<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Body><frem:GetStockQuote xmlns:frem="http://fremantle.org">IBM</frem:GetStockQuote></s:Body></s:Envelope>XML元素排序
E4X的一大優(yōu)點(diǎn)是它完全支持XML,包括訂購。 從XML直接映射到語言對象的許多映射最終僅支持與常規(guī)對象語義相匹配的XML語義子集-因此缺少表示對象和文檔的能力。 盡管不適合本文,但快速瀏覽該規(guī)范將發(fā)現(xiàn)E4X XML對象具有的內(nèi)置函數(shù)允許精心設(shè)計(jì)XML的順序。
在XML中使用Javascript表達(dá)式
在繼續(xù)使用Web服務(wù)之前,我們還有最后一件事要告訴您-大括號。 上面我們介紹了“內(nèi)聯(lián)” XML。 E4X還使您可以重新進(jìn)入JavaScript的世界,并包含評估表達(dá)式。 因此,例如:
var num = 36;var p = <paul><age>{num}</age></paul>print(p);<paul><age>36</age></paul>現(xiàn)在,我們已經(jīng)介紹了E4X的基礎(chǔ)知識,因此讓我們對其進(jìn)行一些工作。
使用E4X調(diào)用Web服務(wù)
在本節(jié)中,我們描述如何在以下兩種環(huán)境中使用E4X:
您可以非常輕松地使用E4X在瀏覽器中調(diào)用Web服務(wù)。 不過有一個(gè)問題! 到目前為止,唯一支持E4X的瀏覽器是Mozilla 1.8的開發(fā)人員版本。
雖然我們不建議您將此作為可移植的跨瀏覽器解決方案,但以下示例演示了如何使用E4X以簡單的方式調(diào)用Web服務(wù)。 在下一節(jié)中,我們將介紹在Rhino Javascript引擎中有效的另一種方法。
AJAX
這個(gè)簡單的示例顯示了瀏覽器向SOAP服務(wù)器發(fā)送和接收SOAP消息的過程。 為此,我們將E4X與XMLHttpRequest對象一起使用。 這個(gè)有用的對象(Mozilla和Internet Explorer支持)允許瀏覽器中運(yùn)行的腳本在后臺(tái)發(fā)出HTTP請求。 實(shí)際上,這就是Google的GMail幾乎執(zhí)行所有操作的方式。 該體系結(jié)構(gòu)最近被命名為異步JavaScript + XML(AJAX)。 您可以在文章“ Ajax:Web應(yīng)用程序的新方法”中閱讀有關(guān)AJAX的更多信息(請參閱參考資料 )。
從根本上講,AJAX的想法是通過以比標(biāo)準(zhǔn)HTML和HTTP的“頁面”模型更靈活的方式與服務(wù)器交互來提高網(wǎng)頁的響應(yīng)能力和可用性。 一個(gè)很好的例子是Google Maps beta,它比以前的地圖網(wǎng)站更具交互性。
好消息是,結(jié)合了E4X的AJAX甚至更好! 我們將顯示兩個(gè)版本的瀏覽器應(yīng)用程序。 第一個(gè)演示了交互的工作原理,而第二個(gè)版本則隱藏了網(wǎng)頁的按鈕和內(nèi)部工作原理,以顯示交互性和異步性。
瀏覽器安全
為了證明這一點(diǎn),我們使用了xmethods.net上通過Web提供的標(biāo)準(zhǔn)服務(wù)。 但是,有一個(gè)陷阱! 瀏覽器安全規(guī)則通常不允許腳本或Java小程序創(chuàng)建網(wǎng)絡(luò)連接,但不能連接到頁面所在的服務(wù)器。 否則,您可能會(huì)有一個(gè)間諜軟件頁面,將您的擊鍵復(fù)制到另一臺(tái)服務(wù)器。
但是,您可以解決此問題。 為此,您需要執(zhí)行兩個(gè)步驟。 首先,您必須在Mozilla的配置中為腳本啟用增強(qiáng)的特權(quán)。 (假設(shè)您已經(jīng)下載并安裝了Mozilla 1.8 beta)。
在瀏覽器地址欄中鍵入about:config ,然后將signed.applets.codebase_principal_support的值從false更新為true 。 (出于安全原因,請記住在完成操作后再設(shè)置一次。)
然后,在腳本中,您可以要求增強(qiáng)的特權(quán)。 腳本運(yùn)行時(shí),將提示用戶允許使用這些腳本。 代碼行是:
netscape.security.PrivilegeManager.enablePrivilege( "UniversalXPConnect UniversalBrowserAccess");
另一種選擇是將服務(wù)和網(wǎng)頁部署到Web應(yīng)用程序服務(wù)器中,例如IBM?WebSphere?Application Server或Tomcat。 例如,這適用于Apache Axis和Axis隨附的默認(rèn)股票報(bào)價(jià)器示例(請參閱參考資料 )。
股票報(bào)價(jià)客戶樣本
該腳本是stockclient.html的一部分。 如果從本文下載了ws-ajax1code.zip文件,解壓縮了zip內(nèi)容,然后使用Mozilla打開stockclient.html ,則應(yīng)該看到以下內(nèi)容:
圖1. Mozilla中的stockclient.html
要嘗試,請首先點(diǎn)擊更新URL 。 這使用XMLHttpRequest從http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl(或在WSDL框中鍵入的任何URL)中獲取WSDL文件,然后使用E4X捕獲端口從那里的地址URL。 現(xiàn)在單擊Send ,您應(yīng)該會(huì)看到SOAP請求已填寫。再過一兩秒鐘,SOAP響應(yīng)以及結(jié)果字段都將更新。 讓我們看一下代碼。
股票報(bào)價(jià)客戶端腳本
該腳本調(diào)用該URL并請求提供IBM股票價(jià)格。 如果您使用的是Axis服務(wù)器,我們建議使用股票代號XXX,這是一個(gè)特殊符號-部署的服務(wù)將始終為此股票代號返回固定的響應(yīng),而不是通過Web請求查找實(shí)際價(jià)格-因此,這樣做更好用于測試。
您需要做的第一件事就是定義您希望使用E4X:
<script type="text/javascript;e4x=1">
當(dāng)您按下發(fā)送按鈕時(shí),腳本將執(zhí)行以下操作:
var s = new Namespace("s","http://schemas.xmlsoap.org/soap/envelope/");var envelope = <s:Envelope xmlns:s={s}/>;envelope.s::Body="";var body = envelope.s::Body;這對任何SOAP請求都是通用的。 它只是創(chuàng)建一個(gè)帶有空主體的SOAP信封。
執(zhí)行此操作的等效方法如下:
var envelope = <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body/></s:Envelope>但是,前面的代碼更簡單,并且還為您提供了一個(gè)指向body元素的指針。
下一步是創(chuàng)建消息的正文:
var x = new Namespace("x","urn:xmltoday-delayed-quotes");body.x::getQuote = <x:getQuote xmlns:x={x}/>;最后,您需要添加正確的符號:
var symbol = document.getElementById("symbol").value; var getQuote = body.x::getQuote;getQuote.symbol=symbol;現(xiàn)在,您有了一個(gè)格式完整的SOAP請求。 如果您要評估信封,您將獲得以下信息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><x:getQuote xmlns:x="urn:xmethods-delayed-quotes"><symbol>XXX</symbol></x:getQuote></s:Body></s:Envelope>要發(fā)送此消息,您需要使用XMLHTTPRequest對象。 我們創(chuàng)建了一個(gè)簡單的輔助函數(shù),以支持使用XMLHttpRequest對象來調(diào)用使用E4X的服務(wù)。 函數(shù)execService支持異步和同步使用。
function execService(url, xml, callback) {var xmlhttp = new XMLHttpRequest();var async=false;if (arguments.length==3) async=true;xmlhttp.open("POST", url, async);xmlhttp.setRequestHeader("SOAPAction", "\"\"")xmlhttp.setRequestHeader("Content-Type", "text/xml")if (async) { var f = function() {if (xmlhttp.readyState==4) {callback(new XML(xmlhttp.responseText));}}xmlhttp.onreadystatechange = f;}xmlhttp.send(xml.toString());if (!async) return new XML(xmlhttp.responseText);}讓我們更詳細(xì)地看一下代碼。 首先,代碼支持兩種調(diào)用方式。 您可以致電:
XML execService(String url, XML envelope);
要么
void execService(String url, XML envelope, function callback);
在這種情況下,回調(diào)函數(shù)應(yīng)為void callback(XML x) 。
因此,您可以使用它直接調(diào)用XML服務(wù)并等待響應(yīng),也可以傳入將與響應(yīng)XML一起調(diào)用的函數(shù)。
該函數(shù)根據(jù)參數(shù)的數(shù)量(3為異步)確定是異步還是同步,然后僅使用XMLHttpRequest對象將XML POST到URL。
我們設(shè)置了兩個(gè)HTTP標(biāo)頭-SOAPAction和Content- xmlhttp.send(xml.toString()) ,然后使用xmlhttp.send(xml.toString())發(fā)送信封參數(shù)。
如果調(diào)用是異步的,則它將等待,直到readyState為4(完成),然后才使用通過響應(yīng)創(chuàng)建的XML調(diào)用回調(diào)。
因此,使用它的代碼如下:
var url = document.getElementById("url").value;var callback = function(resp) {alert(resp..*::getQuoteReturn);}execService(url, envelope, callback);在這種情況下,我們使用異步模型。 Web瀏覽器在與服務(wù)器對話時(shí)通常不會(huì)阻塞,我們也不想這么做。 例如,如果我們這樣做了,瀏覽器窗口可能最終對Windows“無響應(yīng)”,提示用戶將其殺死。
resp..*::getQuoteReturn
如果您不熟悉E4X,則需要花費(fèi)一秒鐘的時(shí)間來消化此語法。 ..表示在樹中搜索命名元素。 *::表示任何命名空間,因此該值將是響應(yīng)SOAP信封中任何命名空間中名為getQuoteReturn的任何元素的值。
實(shí)際的示例代碼stockclient.html還顯示了請求和響應(yīng)SOAP信封。 試試看-您應(yīng)該看到以下內(nèi)容:
圖2. stockclient.html顯示請求和響應(yīng)SOAP信封
stockclient.html看起來像帶有提交按鈕的傳統(tǒng)Web頁面,盡管它不是真的(瀏覽器正在查看的頁面永遠(yuǎn)不會(huì)改變)。 我們以這種方式構(gòu)建它,以使您了解交互。 但是,頁面的真實(shí)AJAX版本要好得多。 stockclientAjax.html沒有按鈕。 鍵入時(shí),它會(huì)自動(dòng)更新股票價(jià)格。 試試看。
圖3. Web頁面的AJAX版本-stockclientAjax.html
現(xiàn)在,該頁面沒有按鈕,而是在您停止鍵入后自動(dòng)發(fā)出請求(在發(fā)出請求之前等待0.6秒,以便在停止時(shí)“感知”)。
從Rhino提出Web服務(wù)請求
Rhino不支持XMLHTTPRequest對象,但是不用擔(dān)心。 由于Rhino在Java環(huán)境中運(yùn)行,因此您可以使用Java功能來發(fā)出Web服務(wù)請求。 為了證明這一點(diǎn),我們編寫了XMLHttpRequest對象的簡單Java實(shí)現(xiàn)。 Rhino允許Java程序員擴(kuò)展發(fā)布Java語言JavaScript環(huán)境。 要在Rhino shell中使用XMLHttpRequest對象,只需確保e4xutils.jar位于類路徑中,然后使用shell命令defineClass將其添加到環(huán)境中:
>set classpath=.\js.jar;.\xbean.jar;.\e4xutils.jar;.>java org.mozilla.javascript.tools.shell.MainRhino 1.6 release 1 2004 11 30Hjs> defineClass('xmlhttp.XMLHttpRequest');這是一個(gè)測試此腳本的簡單腳本:
>test.jsdefineClass("xmlhttp.XMLHttpRequest");var xh = new XMLHttpRequest();xh.open("GET","http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl",false);xh.send(null);var wsdl = new XML(xh.responseText);print(wsdl..*::address.@location);>java org.mozilla.javascript.tools.shell.Main test.jshttp://64.124.140.30:9090/soap結(jié)果是,您現(xiàn)在可以使用到目前為止在Mozilla和Rhino中編寫的相同類型的腳本(E4X + XMLHttpRequest)。 在本文的第二部分,我們將在一些有趣的場景中使用它。
結(jié)論
到目前為止,您已經(jīng)了解了如何使用E4X和Javascript發(fā)起Web服務(wù)請求。 在下一篇文章中,我們將向您展示如何使用E4X提供Web服務(wù)。
翻譯自: https://www.ibm.com/developerworks/xml/library/ws-ajax1/index.html
ajax腳本下載
總結(jié)
以上是生活随笔為你收集整理的ajax脚本下载_E4X的AJAX和脚本Web服务,第1部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel数值累加操作演示(一)
- 下一篇: 3个表单设计的最佳技巧