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