《Java EE程序設(shè)計(jì)教程》課件Chapter4 Ajax+jQuery_第1頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter4 Ajax+jQuery_第2頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter4 Ajax+jQuery_第3頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter4 Ajax+jQuery_第4頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter4 Ajax+jQuery_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第四章Ajax/JSON學(xué)習(xí)目標(biāo)首要目標(biāo)學(xué)習(xí)并掌握Ajax技術(shù)及原理;理解掌握jQuery的使用方法;掌握J(rèn)SON語(yǔ)法、使用;熟練應(yīng)用Ajax和JSON進(jìn)行項(xiàng)目開(kāi)發(fā);次要目標(biāo)理解jQuery框架下的Ajax理解對(duì)象模型API本章提綱4.1Ajax技術(shù)簡(jiǎn)介4.2jQuery技術(shù)簡(jiǎn)介4.3JSON簡(jiǎn)介4.4JavaEE平臺(tái)中的JSON處理4.5使用對(duì)象模型API4.6JavaEERESTfulWeb服務(wù)中的JSON4.7Ajax和JSON開(kāi)發(fā)實(shí)例4.1Ajax技術(shù)簡(jiǎn)介Ajax是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的開(kāi)發(fā)技術(shù),通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量的數(shù)據(jù)交換,實(shí)現(xiàn)網(wǎng)頁(yè)的異步更新。與傳統(tǒng)Web開(kāi)發(fā)相比(圖4-1),Ajax是一種獨(dú)立于Web服務(wù)器的瀏覽器技術(shù)。它在瀏覽器與服務(wù)器之間使用異步傳輸(HTTP請(qǐng)求)模式Ajax關(guān)鍵技術(shù)XHTML和CSS:通過(guò)標(biāo)準(zhǔn)化的方式顯示數(shù)據(jù)。XML和XSLT:進(jìn)行數(shù)據(jù)的交互和操作。DOM(DocumentObjectModel):實(shí)現(xiàn)動(dòng)態(tài)的顯示和交互。XMLHttpRequest:用于數(shù)據(jù)的異步更新。JavaScript:響應(yīng)用戶(hù)動(dòng)作和處理數(shù)據(jù),并將以上關(guān)鍵技術(shù)綁定在一起。Ajax工作過(guò)程JavaScript腳本使用XMLHttpRequest對(duì)象向服務(wù)器發(fā)送請(qǐng)求。發(fā)送請(qǐng)求時(shí),既可以發(fā)送GET請(qǐng)求,也可以發(fā)送POST請(qǐng)求。JavaScript腳本使用XMLHttpRequest對(duì)象解析服務(wù)器響應(yīng)數(shù)據(jù)。JavaScript腳本通過(guò)DOM動(dòng)態(tài)刷新HTML頁(yè)面,也可以為服務(wù)器響應(yīng)數(shù)據(jù)增加CSS樣式表,在當(dāng)前網(wǎng)頁(yè)的某個(gè)部分加以顯示。4.1.1XMLHttpRequest對(duì)象Ajax技術(shù)的核心就是異步請(qǐng)求發(fā)送,而XMLHttpRequest則是異步發(fā)送請(qǐng)求的對(duì)象。同步與異步圖4-2同步交互時(shí)序圖圖4-3異步交互時(shí)序圖XMLHttpRequest對(duì)象屬性與方法XMLHttpRequest對(duì)象提供了一系列的屬性和方法,來(lái)向服務(wù)器發(fā)送異步的HTTP請(qǐng)求。在服務(wù)器處理用戶(hù)請(qǐng)求的過(guò)程中,XMLHttpRequest通過(guò)屬性的狀態(tài)值來(lái)實(shí)時(shí)反映HTTP請(qǐng)求所處的狀態(tài),并根據(jù)當(dāng)前狀態(tài)指示JavaScript做出相應(yīng)處理表4-1XMLHttpRequest對(duì)象方法方法描述abort取消當(dāng)前請(qǐng)求。調(diào)用此方法,當(dāng)前狀態(tài)返回UNINITIALIZED狀態(tài)getAllResponseHeaders將HTTP請(qǐng)求的所有響應(yīng)頭部作為鍵/值對(duì)返回getResponseHeaders從響應(yīng)信息中獲取指定的HTTP頭的字符串形式open創(chuàng)建一個(gè)新的HTTP請(qǐng)求,并指定此請(qǐng)求的方法、URL、是否異步以及驗(yàn)證信息(用戶(hù)名/密碼)send發(fā)送請(qǐng)求到HTTP服務(wù)器setRequestHeader把指定頭部設(shè)置為所提供的指,在調(diào)用該方法之前必須先調(diào)用open方法XMLHttpRequest對(duì)象屬性與方法屬性描述onreadystatechange狀態(tài)改變的事件觸發(fā)器,當(dāng)readyState屬性改變時(shí)會(huì)觸發(fā)此事件。只寫(xiě)readyState當(dāng)前請(qǐng)求處理返回的狀態(tài),只讀responseBody將響應(yīng)信息以u(píng)nsignedbyte數(shù)組形式返回,只讀responseStream將響應(yīng)信息以AdoStream對(duì)象形式返回,只讀responseText將響應(yīng)信息以字符串形式返回,只讀responseXML將響應(yīng)信息格式化為XMLDocument對(duì)象返回,只讀status返回當(dāng)前請(qǐng)求的HTTP狀態(tài)碼,200:OK,404:未找到statusTextHTTP狀態(tài)碼的相應(yīng)文本,只讀表4-2XMLHttpRequest對(duì)象屬性XMLHttpRequest對(duì)象屬性與方法狀態(tài)含義說(shuō)明0未初始化對(duì)象已創(chuàng)建,但未初始化,即尚未調(diào)用open()方法1初始化對(duì)象已創(chuàng)建,已調(diào)用open()方法,但尚未調(diào)用send()方法2發(fā)送數(shù)據(jù)send()方法已調(diào)用,準(zhǔn)備發(fā)送數(shù)據(jù)3數(shù)據(jù)傳送中已接受部分?jǐn)?shù)據(jù),但沒(méi)有完全接收4傳送完成數(shù)據(jù)接收完畢,此時(shí)可以通過(guò)response系列方法獲取完整回應(yīng)數(shù)據(jù)表4-3readyState屬性的狀態(tài)值實(shí)例:第一個(gè)Ajax程序認(rèn)識(shí)了Ajax以及它的核心對(duì)象XMLHttpRequest之后,接下來(lái)看一個(gè)非常簡(jiǎn)單的例子,感受一下Ajax是如何與服務(wù)器之間進(jìn)行異步通信的。在webapps目錄下新建文件夾FirstAjax,并在其下創(chuàng)建文件index.html和helloworld.html文件。這個(gè)例子的功能是實(shí)現(xiàn)單擊網(wǎng)頁(yè)上的一個(gè)按鈕,顯示一句“Hello,world!”。實(shí)例:第一個(gè)Ajax程序index.html<scriptlanguage="javascript">varxmlHttp;functioncreateXMLHttp(){if(window.XMLHttpRequest){xmlHttp=newXMLHttpRequest();}else{xmlHttp=newActiveXObject("Microsoft.XMLHTTP");}}functionshowMsg(){createXMLHttp();xmlHttp.open("POST","helloworld.html");xmlHttp.onreadystatechange=showMsgCallback;xmlHttp.send(null);}functionshowMsgCallback(){if(xmlHttp.readyState==4){if(xmlHttp.status==200){vartext=xmlHttp.responseText;document.getElementById("msg").innerHTML=text;}}}</script></head><body><inputtype="button"value="調(diào)用Ajax的內(nèi)容"onclick="showMsg()"/><spanid="msg"></span></body>實(shí)例:第一個(gè)Ajax程序<html><head><title></title></head><body>hello,world!</body></html>helloworld.html文件index.html中包括createXMLHttp、showMsg、showMsgCallback三個(gè)JavaScript函數(shù)。其中createXMLHttp函數(shù)完成XMLHttpRequest對(duì)象的初始化,showMsg函數(shù)向Web服務(wù)器發(fā)送XMLHttp請(qǐng)求,訪問(wèn)helloworld.html文件里的數(shù)據(jù)。showMsgCallback函數(shù)將服務(wù)器返回的信息以字符串的形式賦給text,并在網(wǎng)頁(yè)上顯示。實(shí)例:第一個(gè)Ajax程序單擊按鈕觸發(fā)監(jiān)聽(tīng)事件onclick,從而向服務(wù)器異步發(fā)送請(qǐng)求,獲取返回的信息并顯示。運(yùn)行效果如圖所示。4.2jQuery技術(shù)簡(jiǎn)介jQuery是一個(gè)兼容多瀏覽器的JavaScript庫(kù),核心理念是“writeless,domore”。jQuery的語(yǔ)法設(shè)計(jì)可以使開(kāi)發(fā)更加敏捷,能完成文檔對(duì)象的操作、選擇DOM對(duì)象、制作動(dòng)畫(huà)效果、事件處理、使用Ajax以及其他功能。同時(shí)jQuery提供許多成熟的插件,能使用戶(hù)的HTML代碼與內(nèi)容分離,即不用再在HTML里面插入一堆JavaScript,只需定義ID即可。模塊化的應(yīng)用模式可以輕松的開(kāi)發(fā)出功能強(qiáng)大的動(dòng)態(tài)頁(yè)面。一個(gè)簡(jiǎn)單的jQuery實(shí)例在該例子中,jQuery選擇器$("p")表示選取全部<p>元素,在綁定的click事件被觸發(fā)之后調(diào)用function()函數(shù),從而隱藏<p>與</p>之間的內(nèi)容。當(dāng)然,運(yùn)行代碼之前需要先下載jQuery并通過(guò)<script>標(biāo)簽把它添加到網(wǎng)頁(yè)中。<html><head><scripttype="text/javascript“src="jquery.js"></script><scripttype="text/javascript">$(document).ready(function(){$("p").click(function(){$(this).hide();});});</script></head><body><p>點(diǎn)我,我就會(huì)隱藏!</p></body></html>4.2.1jQuery框架下的Ajax編寫(xiě)常規(guī)的Ajax代碼并不容易,因?yàn)椴煌臑g覽器對(duì)Ajax的實(shí)現(xiàn)并不相同。這意味著需要編寫(xiě)額外的代碼對(duì)瀏覽器進(jìn)行測(cè)試。jQuery為Ajax提供了多個(gè)方法,使用jQuery將極大提高編寫(xiě)JavaScript代碼的效率,同時(shí)也能解決瀏覽器兼容性問(wèn)題。原始的Ajax需要手動(dòng)的做很多事情。比如針對(duì)不同的瀏覽器創(chuàng)建XMLHttpRequest對(duì)象、判斷請(qǐng)求狀態(tài)、編寫(xiě)回調(diào)函數(shù)使用jQuery不僅簡(jiǎn)化了代碼的邏輯結(jié)構(gòu),使用jQuery的Load方法就能代替一大堆繁瑣的函數(shù)定義與調(diào)用。所以jQuery提供的Ajax方法可以在解決各種差異性問(wèn)題的同時(shí),大大提高代碼的編寫(xiě)效率。<scripttype="text/javascript"src="js/jquery-1.3.2-vsdoc2.js"></script><scripttype="text/javascript">$(function(){$("#btnAjaxJquery").click(function(event){

$("#divResult").load("data/AjaxGetCityInfo.jsp",

{"resultType":"html"});});})</script></head><body><buttonid="btnAjaxJquery">使用jQuery的load方法</button><br/><divid="divResult"></div></body>4.2.1jQuery框架下的Ajax4.2.2利用jQuery的Ajax功能調(diào)用遠(yuǎn)程方法jQuery提供了多個(gè)與Ajax相關(guān)的方法,通過(guò)調(diào)用這些方法能夠使用HTTPGET或HTTPPOST從遠(yuǎn)程服務(wù)器上請(qǐng)求文本、HTML、XML或JSON數(shù)據(jù)。jQuery.load(url,[data],[callback])方法jQuery.get(url,[callback])方法jQuery.post(url,[data],[callback])方法jQuery.ajax(options)方法jQuery.load方法jQuery.load(url,[data],[callback])方法url:規(guī)定希望加載的urldata:與請(qǐng)求一同發(fā)送的查詢(xún)字符串鍵/值對(duì)集合callback:load方法完成后所執(zhí)行的函數(shù)名稱(chēng)jQuery.load方法jQuery.load是最簡(jiǎn)單的Ajax函數(shù),使用具有一定的局限性。它主要用于直接返回HTML的Ajax接口。下面的這句代碼會(huì)把jQuery-load.txt文件中id=p1的元素內(nèi)容加載到指定的<div1>元素中。<h2>jQueryandAjax</h2><pid="p1">Thisissometextinaparagraph.</p>jQuery-load.txt$("#div1").load("jQuery-load.txt#p1");jQuery.get方法jQuery.get(url,[callback])方法url:希望請(qǐng)求的urlcallback:請(qǐng)求成功后所執(zhí)行的函數(shù)名稱(chēng)jQuery.get方法jQuery.get方法通過(guò)HTTPGET方式從遠(yuǎn)程服務(wù)器上請(qǐng)求數(shù)據(jù)。$.get()的第一個(gè)參數(shù)是請(qǐng)求的url("demo_test.jsp"),第二個(gè)參數(shù)是回調(diào)函數(shù)function。該函數(shù)的第一個(gè)回調(diào)參數(shù)data保存被請(qǐng)求頁(yè)面的內(nèi)容,第二個(gè)回調(diào)參數(shù)status保存請(qǐng)求的狀態(tài)。$("button").click(function(){$.get("demo_test.jsp",function(data,status){alert("Data:"+data+"\nStatus:"+status);});});<%response.getWriter().write("ThisissometextfromanexternalJSPfile.")%>jQuery.post方法jQuery.post(url,[data],[callback])方法url:希望請(qǐng)求的urldata:與請(qǐng)求一同發(fā)送的數(shù)據(jù)callback:請(qǐng)求成功后所執(zhí)行的函數(shù)名稱(chēng)jQuery.post方法jQuery.post方法通過(guò)HTTPPOST方式從遠(yuǎn)程服務(wù)器上請(qǐng)求數(shù)據(jù)。使用$.post()連同請(qǐng)求一起發(fā)送數(shù)據(jù)$("button").click(function(){$.post("demo_test_post.jsp",{name:"DonaldDuck",city:"Duckburg"},function(data,status){alert("Data:"+data+"\nStatus:"+status);});});jQuery.post方法$.post()的第一個(gè)參數(shù)是請(qǐng)求的URL("demo_test_post.jsp")。然后連同請(qǐng)求(name和city)一起發(fā)送數(shù)據(jù)。"demo_test_post.jsp"中的JSP腳本讀取這些參數(shù),對(duì)它們進(jìn)行處理,然后返回結(jié)果。第三個(gè)參數(shù)是回調(diào)函數(shù)。第一個(gè)回調(diào)參數(shù)data存有被請(qǐng)求頁(yè)面的內(nèi)容,而第二個(gè)參數(shù)status存有請(qǐng)求的狀態(tài)。<%Stringfname=request.getParameter("name");Stringcity=request.getParameter("city");response.Write("Dear"&fname&".");response.Write("Hopeyoulivewellin"&city&".")%>jQuery.ajax方法jQuery.ajax(options)方法通過(guò)HTTP請(qǐng)求加載遠(yuǎn)程數(shù)據(jù),并返回其創(chuàng)建的XMLHttpRequest對(duì)象。這是jQuery中Ajax的核心函數(shù),上面所有的發(fā)送Ajax請(qǐng)求的函數(shù)內(nèi)部最后都會(huì)調(diào)用此函數(shù)。option參數(shù)支持很多數(shù)據(jù)類(lèi)型,例如XML、HTML、Script、JSON、TXT等。使用這些參數(shù)完全可以控制Ajax的請(qǐng)求,在Ajax回調(diào)函數(shù)中的this對(duì)象也是options對(duì)象。jQuery.ajax方法$.ajax({type:"POST",url:"/user.do/save",data:{‘userName’:’Jack’,‘a(chǎn)ge’:22},contentType:"application/json;charset=utf-8",dataType:"json",success:function(data){if(data.msg=="true"){alert("修改成功!");window.location.reload();}else{view(data.msg);}},error:function(){alert("異常!");}});4.3JSON簡(jiǎn)介JSON(JavaScriptObjectNotation)是一種輕量級(jí)的文本數(shù)據(jù)交換格式。JSON解析器和JSON庫(kù)支持多種不同的編程語(yǔ)言,包括C、C++、C#、Java、JavaScript、Perl和Python等。它與XML類(lèi)似,使用JavaScript語(yǔ)法來(lái)描述數(shù)據(jù)對(duì)象,后來(lái)慢慢發(fā)展成獨(dú)立于任何語(yǔ)言和平臺(tái)的數(shù)據(jù)交換格式,比XML更小、更快、更易解析。正是由于這些特性,JavaScript能夠通過(guò)內(nèi)建函數(shù),使用JSON數(shù)據(jù)來(lái)生成原生的JavaScript對(duì)象。4.3.1JSON語(yǔ)法JSON主要有如下兩種數(shù)據(jù)結(jié)構(gòu):key-value對(duì)組成的數(shù)據(jù)結(jié)構(gòu)。

這種數(shù)據(jù)結(jié)構(gòu)在不同的語(yǔ)言中有不同的實(shí)現(xiàn),例如在JavaScript中是一個(gè)對(duì)象,在Java中一個(gè)種Map結(jié)構(gòu),在C語(yǔ)言中則是一個(gè)struct。值的有序集合。

這種數(shù)據(jù)結(jié)構(gòu)在不同語(yǔ)言中可能由list、vector、數(shù)據(jù)和序列等實(shí)現(xiàn)。4.3.1JSON語(yǔ)法下面例子中employees數(shù)組包括3個(gè)員工記錄,而每個(gè)員工記錄又是一個(gè)對(duì)象。{"employees":[

{"firstName":"Bill","lastName":"Gates"},

{"firstName":"George","lastName":"Bush"},

{"firstName":"Thomas","lastName":"Carter"}]}

4.3.1JSON語(yǔ)法數(shù)組:值的有序集合。一個(gè)數(shù)組以“[”開(kāi)始,“]”結(jié)束,數(shù)組中各個(gè)值之間使用逗號(hào)“,”分隔。對(duì)象:一個(gè)無(wú)序的名/值對(duì)集合。一個(gè)對(duì)象以“{”開(kāi)始,“}”結(jié)束,每個(gè)“名稱(chēng)”后接一個(gè)“:”冒號(hào),名/值對(duì)之間使用“,”逗號(hào)分隔。JSON值(Value):JSON數(shù)據(jù)值用雙引號(hào)括起來(lái),可以是數(shù)字(整數(shù)/浮點(diǎn)數(shù))、字符串、邏輯值(true/false)、數(shù)組、對(duì)象、null。這些結(jié)構(gòu)可以嵌套使用。4.3.1JSON語(yǔ)法使用JavaScript創(chuàng)建一個(gè)對(duì)象數(shù)組employees并賦值,進(jìn)行一些簡(jiǎn)單的操作。修改對(duì)象數(shù)組employees第一項(xiàng)中的lastName值,可以直接對(duì)其進(jìn)行賦值。varemployees=[{"firstName":"Bill","lastName":"Gates"},{"firstName":"George","lastName":"Bush"},{"firstName":"Thomas","lastName":"Carter"}];employees[0].lastName="Jobs";4.3.2JSON的使用JSON最常見(jiàn)的用法之一,是從Web服務(wù)器上讀取JSON數(shù)據(jù)(作為文件或作為HttpRequest),將JSON數(shù)據(jù)轉(zhuǎn)換為JavaScript對(duì)象,然后在網(wǎng)頁(yè)中使用該數(shù)據(jù)。首先創(chuàng)建包含JSON語(yǔ)法的JavaScript字符串:vartxt='{"employees":['+'{"firstName":"Bill","lastName":"Gates"},'+'{"firstName":"George","lastName":"Bush"},'+'{"firstName":"Thomas","lastName":"Carter"}]}';4.3.2JSON的使用由于JSON語(yǔ)法是JavaScript語(yǔ)法的子集,JavaScript使用函數(shù)eval()可用于將JSON文本轉(zhuǎn)換為JavaScript對(duì)象。eval()方法使用的是JavaScript編譯器,必須把文本包圍在括號(hào)中,這樣才能避免語(yǔ)法錯(cuò)誤。轉(zhuǎn)換為JavaScript對(duì)象之后,就可以在網(wǎng)頁(yè)中使用。varobj=eval("("+txt+")");JSON.stringify(user)<p>FirstName:<spanid="fname"></span><br/>LastName:<spanid="lname"></span><br/></p><scripttype="text/javascript">document.getElementById("fname").innerHTML=obj.employees[1].firstNamedocument.getElementById("lname").innerHTML=obj.employees[1].lastName</script>4.3.3生成和解析JSON數(shù)據(jù)在json.js提供的系統(tǒng)類(lèi)中,關(guān)于JSON數(shù)據(jù)的生成和解析主要包括以下幾個(gè)類(lèi):JSONObject:可以看作是一個(gè)json對(duì)象,這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(duì)(Key/Value)數(shù)值。JSONObject對(duì)外部調(diào)用的響應(yīng)體現(xiàn)為一個(gè)標(biāo)準(zhǔn)的字符串。例如:初始化一個(gè)JSONObject實(shí)例,引用內(nèi)部的put()方法添加數(shù)值:{"JSON":"Hello,World"}newJSONObject().put("JSON","Hello,World!")4.3.3生成和解析JSON數(shù)據(jù)JSONStringer:json文本構(gòu)建類(lèi),這個(gè)類(lèi)可以幫助快速和便捷的創(chuàng)建JSONtext。其最大的優(yōu)點(diǎn)在于可以減少由于格式的錯(cuò)誤導(dǎo)致程序異常,引用這個(gè)類(lèi)可以自動(dòng)嚴(yán)格按照J(rèn)SON語(yǔ)法規(guī)則(syntaxrules)創(chuàng)建JSONtext。每個(gè)JSONStringer實(shí)體只能對(duì)應(yīng)創(chuàng)建一個(gè)JSONtext。JSONArray:它代表一組有序的數(shù)值,將其轉(zhuǎn)換為String輸出(toString)所表現(xiàn)的形式。這個(gè)類(lèi)的內(nèi)部同樣具有查詢(xún)行為,get()和opt()兩種方法都可以通過(guò)index索引返回指定的數(shù)值,put()方法用來(lái)添加或者替換數(shù)值。JSONTokener:json解析類(lèi)。JSONException:json異常類(lèi)。生成JSON數(shù)據(jù)利用JSONObject構(gòu)建一個(gè)簡(jiǎn)單的JSON。得到的JSON數(shù)據(jù)為:{"id":"1","name":"李磊","age":"30"}publicStringcreateJson(){try{JSONObjectjsonObject=newJSONObject();jsonObject.put("id","1");jsonObject.put("name","李磊");jsonObject.put("age","30");returnjsonObject.toString();}catch(Exceptione){e.printStackTrace();}return"";}解析JSON數(shù)據(jù)數(shù)據(jù)為{"id":"1","name":"李磊","age":"30"}首先將json字符串轉(zhuǎn)換為jsonTokener對(duì)象,在這個(gè)過(guò)程中使用了JSONTokener解析類(lèi)。接著調(diào)用jsonTokener的nextValue()方法將json數(shù)據(jù)轉(zhuǎn)換為jsonObject對(duì)象,通過(guò)getString(keyname)獲取需要的值publicPersonparserJson(){Stringjson="{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}";Personperson=newPerson();try{ JSONTokenerjsonTokener=newJSONTokener(json);JSONObjectjsonObject=(JSONObject)jsonTokener.nextValue();person.setId(jsonObject.getString("id"));person.setName(jsonObject.getString("name"));person.setAge(jsonObject.getString("age"));}catch(Exceptione){e.printStackTrace();}returnperson;}4.4JavaEE平臺(tái)中的JSON處理JavaEE應(yīng)用程序中提供了各種便捷的API用來(lái)處理JSON數(shù)據(jù),其中包括主流的對(duì)象模型(ObjectModel)API和流模型(StreamingModel)API。對(duì)象模型API在內(nèi)存中產(chǎn)生一個(gè)隨機(jī)存取的樹(shù)狀結(jié)構(gòu)來(lái)代表了JSON數(shù)據(jù)。流模型API提供了一種以流來(lái)解析和生成JSON的方法,它把解析和生成JSON的控制權(quán)交給了程序員。對(duì)象模型API對(duì)象模型API和文件對(duì)象模型(DOM)API在xml中很相似。這是一個(gè)高級(jí)的API,它為JSON對(duì)象和數(shù)組結(jié)構(gòu)提供了不可變的對(duì)象模型。這些JSON結(jié)構(gòu)通過(guò)使用JsonObject和JsonArray被表示為對(duì)象模型。類(lèi)或接口描述Json包含產(chǎn)生JSONreaders,writers,builders,和對(duì)象的靜態(tài)方法JsonGenerator一次一個(gè)值的將JSON數(shù)據(jù)寫(xiě)入一個(gè)流中JsonReader從流中讀取JSON數(shù)據(jù),并且在內(nèi)存中創(chuàng)建一個(gè)對(duì)象模型JsonObjectBuilderJsonArrayBuilder在內(nèi)存中通過(guò)向源碼中加入一個(gè)值,創(chuàng)建一個(gè)對(duì)象模型或者數(shù)組模型JsonWriter從內(nèi)存中拿出一個(gè)對(duì)象模型寫(xiě)入流中JsonValueJsonObjectJsonArrayJsonStringJsonNumber表示JSON數(shù)據(jù)中的數(shù)據(jù)類(lèi)型表4-4對(duì)象模型API類(lèi)或接口流模型API流模型API與XML的流API(StAX)類(lèi)似,它是由接口JsonParser和JsonGenerator組成。JsonParser包含使用流模型解析JSON數(shù)據(jù)的方法,JsonGenerator包含輸出JSON數(shù)據(jù)到一個(gè)輸出源的方法。類(lèi)或接口描述Json包含創(chuàng)建JSON解析器、生成器、和對(duì)象的靜態(tài)方法JsonParser表示一個(gè)基于事件的解析器,可以從流中讀取JSON數(shù)據(jù)JsonGenerator每次一個(gè)值將JSON數(shù)據(jù)寫(xiě)入到流中表4-5流模型API類(lèi)或接口4.5使用對(duì)象模型API4.5.1從JSON數(shù)據(jù)創(chuàng)建對(duì)象模型JSON格式的數(shù)據(jù)經(jīng)常會(huì)遇到,比如訪問(wèn)Web服務(wù)器,取回的數(shù)據(jù)通常就是JSON格式的。然而JSON數(shù)據(jù)是一種純文本的格式,并不是一個(gè)對(duì)象,所以從Web服務(wù)器取回來(lái)的數(shù)據(jù)并不能直接使用,需要將它轉(zhuǎn)換成一個(gè)對(duì)象模型,然后在網(wǎng)頁(yè)上的相應(yīng)元素里顯示。JsonReader包含從輸入讀取JSON數(shù)據(jù)轉(zhuǎn)換到對(duì)象模型的方法。JsonReader可以從輸入流中創(chuàng)建對(duì)象模型JsonReaderreader=Json.createReader(newFileInputStream(...));4.5.1從JSON數(shù)據(jù)創(chuàng)建對(duì)象模型代碼顯示了如何從獲得的InputStream創(chuàng)建新的解析器API。當(dāng)然也可以使用JsonReaderFactory創(chuàng)建多個(gè)解析器。在這段代碼中,一個(gè)jsonReader通過(guò)StringReader初始化,讀取JSON的空對(duì)象。調(diào)用readObject方法返回JSONObject實(shí)例JsonReaderFactoryfactory=Json.createReaderFactory(null);JsonReaderparser1=factory.createReader(...);JsonReaderparser2=factory.createReader(...);//讀取一個(gè)空的JSON數(shù)據(jù)創(chuàng)建對(duì)象JsonReaderjsonReader=Json.createReader(newStringReader("{}"));JsonObjectjson=jsonReader.readObject();4.5.1從JSON數(shù)據(jù)創(chuàng)建對(duì)象模型讀取一個(gè)對(duì)象的名稱(chēng)/值對(duì)創(chuàng)建對(duì)象模型jsonReader=Json.createReader(newStringReader("{"

+"\"apple\":\"red\","

+"\"banana\":\"yellow\""

+"}"));JsonObjectjson=jsonReader.readObject();json.getString("apple");json.getString("banana");4.5.1從JSON數(shù)據(jù)創(chuàng)建對(duì)象模型讀取一個(gè)有兩個(gè)對(duì)象的數(shù)組數(shù)據(jù)生成對(duì)象模型jsonReader=Json.createReader(newStringReader("["

+"{\"apple\":\"red\"},"

+"{\"banana\":\"yellow\"}"

+"]"));JsonArrayjsonArray=jsonReader.readArray();4.5.1從JSON數(shù)據(jù)創(chuàng)建對(duì)象模型讀取嵌套結(jié)構(gòu)的JSON數(shù)據(jù)生成對(duì)象模型jsonReader=Json.createReader(newStringReader("{"+"\"title\":\"TheMatrix\","+"\"year\":1999,"+"\"cast\":["+"\"KeanuReeves\","+"\"LaurenceFishburne\","+"\"Carrie-AnneMoss\""+"]"+"}"));json=jsonReader.readObject();4.5.2從應(yīng)用代碼創(chuàng)建對(duì)象模型JsonObjectBuilder可以用來(lái)創(chuàng)建對(duì)象的JSON數(shù)據(jù)JsonArrayBuilder可以用來(lái)創(chuàng)建類(lèi)型是JsonArray的JSON陣列。也就是說(shuō),可以通過(guò)在內(nèi)存中利用add()方法向應(yīng)用代碼添加values,從而創(chuàng)建一個(gè)JsonObject對(duì)象模型或者JsonArray對(duì)象模型。通過(guò)JsonBuilderFactory創(chuàng)建多個(gè)對(duì)象JsonObjectjsonObject=Json.createObjectBuilder().build();JsonBuilderFactoryfactory=Json.createBuilderFactory(null);JsonArrayBuilderarrayBuilder=factory.createArrayBuilder();JsonObjectBuilderobjectBuilder=factory.createObjectBuilder();4.5.2從應(yīng)用代碼創(chuàng)建對(duì)象模型加入一對(duì)鍵值生成對(duì)象模型的代碼生成的JSON結(jié)構(gòu):寫(xiě)入對(duì)象數(shù)組生成對(duì)象模型JsonObjectjsonObject=Json.createObjectBuilder().add("apple","red").add("banana","yellow").build();{"apple":"red","banana":"yellow"}JsonArrayjsonArray=Json.createArrayBuilder().add(Json.createObjectBuilder().add("apple","red")).add(Json.createObjectBuilder().add("banana","yellow")).build();4.5.3導(dǎo)航對(duì)象模型對(duì)象模型API創(chuàng)建了一個(gè)樹(shù)形結(jié)構(gòu),代表了一個(gè)JSON數(shù)據(jù)存儲(chǔ)器,它可以很容易地實(shí)現(xiàn)導(dǎo)航和查詢(xún)功能。JsonObject為訪問(wèn)名稱(chēng)/值對(duì)的無(wú)序集合提供了一個(gè)地圖視圖模型(導(dǎo)航)。JsonObjectobject=newJsonBuilder().beginObject().add("firstName","John").add("lastName","Smith").add("age",25).beginObject("address").add("streetAddress","212ndStreet").add("city","NewYork").add("state","NY").add("postalCode","10021").endObject().beginArray("phoneNumber").beginObject().add("type","home").add("number","212555-1234").endObject().beginObject().add("type","home").add("number","646555-4567").endObject().endArray().endObject().build();4.5.3導(dǎo)航對(duì)象模型創(chuàng)建的導(dǎo)航對(duì)象模型object數(shù)據(jù)結(jié)構(gòu)如下:同樣的,object對(duì)象也可以通過(guò)JsonWriter寫(xiě)至一個(gè)輸出流{"firstName":"John","lastName":"Smith","age":25,"phoneNumber":[{"type":"home","number":"212555-1234"},{"type":"fax","number":"646555-4567"}]}4.5.4將對(duì)象模型寫(xiě)至一個(gè)流使用API創(chuàng)建的對(duì)象模型可以是JsonObject、JsonArray、JsonString、JsonNumber、JsonValue,不管是哪一種類(lèi)型的對(duì)象模型,都可以通過(guò)JsonWriter將創(chuàng)建的對(duì)象模型寫(xiě)至一個(gè)流。下面以JsonArray為例,其他類(lèi)型的對(duì)象模型操作方法類(lèi)似。4.5.4將對(duì)象模型寫(xiě)至一個(gè)流生成的JSON數(shù)據(jù)結(jié)構(gòu)如下:JsonBuilderFactoryfactory=Json.createBuilderFactory(null);JsonArrayjsonArray=factory.createArrayBuilder().add(factory.createObjectBuilder().add("type","home").add("number","(800)111-1111")).add(factory.createObjectBuilder().add("type","cell").add("number","(800)222-2222")).build();[{"type":"home","number":"(800)111-1111"},{"type":"cell","number":"(800)222-2222"}]4.5.4將對(duì)象模型寫(xiě)至一個(gè)流將創(chuàng)建好的JsonArray對(duì)象模型通過(guò)JsonWriter寫(xiě)至一個(gè)流try(JsonWriterjsonWriter=Json.createWriter(System.out)){jsonWriter.writeArray(jsonArray);jsonWriter.close();}4.6JavaEERESTfulWeb服務(wù)中的JSONREST(RepresentationStateTransfer,表述性狀態(tài)轉(zhuǎn)移)是一種跨平臺(tái)的、跨語(yǔ)言的架構(gòu)風(fēng)格。在REST風(fēng)格中,對(duì)象被抽象為一種資源,資源數(shù)據(jù)的某個(gè)瞬間狀態(tài)被定義為一種表述,這種描述性的狀態(tài)包括資源數(shù)據(jù)的內(nèi)容、表述格式(XML、JSON、Atom)等信息。REST的資源是可尋址的,通過(guò)HTTP協(xié)議定義的方法(GET、PUT、DELETE、POST)實(shí)現(xiàn)。HTTP+URI+XML是REST的基本實(shí)現(xiàn)形式,但不是唯一的實(shí)現(xiàn)形式。具體而言,HTTP協(xié)議和URI用于統(tǒng)一接口和定位資源,文本、二進(jìn)制流、XML和JSON等格式用來(lái)作為資源的表述。RESTfulWebServices(REST式的Web服務(wù))是一種基于ROA(Resource-OrientedArchitecture,面向資源的架構(gòu))的應(yīng)用,其主要特點(diǎn)是方法信息存在于HTTP的方法(GET、PUT)中,作用域存在于URI中。Jersey簡(jiǎn)介RESTfulWeb服務(wù)對(duì)應(yīng)的標(biāo)準(zhǔn)規(guī)范是JAX-RS,它是JCP(JavaCommunityProcess)為JavaRESTfulWeb服務(wù)定義的一套API,從JavaEE6開(kāi)始引入。RESTfulWeb服務(wù)的開(kāi)發(fā)工具使用的是Jersey,它是JAX-RS的參考實(shí)現(xiàn)。Jersey框架由核心模塊、容器模塊、連接器模塊、Media模塊等模塊組成。RESTfulWeb服務(wù)中的JSON處理使用MOXy處理JSONMOXy是EclipseLink項(xiàng)目的一個(gè)模塊,也是Jersey默認(rèn)的JSON解析方式,可以在項(xiàng)目中添加MOXy的依賴(lài)包來(lái)使用MOXy。定義依賴(lài)<dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-moxy</artifactId></dependency>使用MOX

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論