ajax 的 java 對象序列化_第1頁
ajax 的 java 對象序列化_第2頁
ajax 的 java 對象序列化_第3頁
ajax 的 java 對象序列化_第4頁
ajax 的 java 對象序列化_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1/1ajax的java對象序列化面向Java開發(fā)人員的Ajax:Ajax的Java對象序列化在Ajax應(yīng)用程序中序列化數(shù)據(jù)的五種途徑如果您正在使用異步JavaScript和XML(Ajax)進(jìn)行JavaWeb開發(fā),那么您最關(guān)心的問題可能就是把數(shù)據(jù)從服務(wù)器傳遞給客戶機(jī)。

在面向Java開發(fā)人員的Ajax系列的第二篇文章中,PhilipMcCarthy介紹了Java對象序列化的五種方式,并提供了選擇最適合應(yīng)用程序的數(shù)據(jù)格式和技術(shù)所需要的全部信息。

在這個系列的第一篇文章中,我介紹了Ajax的構(gòu)造塊:

如何用JavaScriptXMLHttpRequest對象從Web頁面向服務(wù)器發(fā)送異步請求。

如何用Javaservlet處理和響應(yīng)請求(向客戶機(jī)返回XML文檔)。

如何在客戶端用響應(yīng)文檔更新頁面視圖。

這一次,我將繼續(xù)討論Ajax開發(fā)的基礎(chǔ)知識,但是將側(cè)重于許多JavaWeb開發(fā)人員最關(guān)心的問題:

為客戶機(jī)生成數(shù)據(jù)。

多數(shù)Java開發(fā)人員已經(jīng)把模型-視圖-控制器(MVC)模式應(yīng)用在他們的Web應(yīng)用程序上。

在傳統(tǒng)的Web應(yīng)用程序中,視圖組件由JSP或者其他表示技術(shù)(例如Velocity模板)構(gòu)成。

這些表示組件動態(tài)地生成全新的HTML頁面,替代用戶以前正在查看的頁面,從而更新用戶界面。

但是,在JavaWeb應(yīng)用程序使用AjaxUI的情況下,基于從XMLHttpRequest的響應(yīng)接收到的數(shù)據(jù),JavaScript客戶端代碼對于更新用戶看到的內(nèi)容負(fù)有最終責(zé)任。

從服務(wù)器的角度來看,視圖成為它響應(yīng)客戶機(jī)請求而發(fā)送的數(shù)據(jù)表示。

這篇文章側(cè)重于可以用來生成Java對象以數(shù)據(jù)為中心的視圖的技術(shù)。

我將演示可以把JavaBeans變成XML文檔的各種方法,并且討論每種方法的優(yōu)劣。

您將看到為什么XML并不總是最好的途徑:

對于簡單的Ajax請求來說,傳輸純文本更好。

最后,我將介紹JavaScript對象標(biāo)注(JSON)。

JSON允許數(shù)據(jù)以序列化的JavaScript對象圖的形式傳輸,在客戶端代碼中處理序列化的JavaScript對象圖極為容易。

關(guān)于示例我將使用一個示例應(yīng)用程序和幾個用例來演示這里討論的技術(shù)特性和技術(shù)。

圖1顯示的極為簡單的數(shù)據(jù)模型可以表示示例用例。

這個模型代表在線商店中的顧客帳戶。

顧客擁有以前訂單的集合,每個訂單包含幾個商品。

圖1.簡單的對象模型雖然XMLHttpRequest對于發(fā)送數(shù)據(jù)使用的格式?jīng)]有做任何限制,但是對于多數(shù)目的來說,只發(fā)送傳統(tǒng)的表單數(shù)據(jù)是適合的,所以我的討論集中在服務(wù)器的響應(yīng)上。

響應(yīng)也可以有基于文本的格式,但是正如它的名字表示的,XMLHttpRequest具有內(nèi)置的處理XML響應(yīng)數(shù)據(jù)的能力。

這使XML成為Ajax響應(yīng)的默認(rèn)選擇,所以我們從XML格式開始討論。

從Java類產(chǎn)生XML把Ajax響應(yīng)作為XML來傳遞有許多原因:

每個支持Ajax的瀏覽器都有導(dǎo)航XML文檔的方法,也有許多服務(wù)器端技術(shù)可以處理XML數(shù)據(jù)。

通過制定一個方案,描述要交換的文檔類型,在Ajax客戶端和服務(wù)器端之間很容易定義合約,而且如果服務(wù)器端架構(gòu)采用面向服務(wù)的方式,那么使用XML也可以允許非Ajax客戶機(jī)使用您提供的數(shù)據(jù)。

我將考慮從Java對象產(chǎn)生XML數(shù)據(jù)的三種方法,并討論每種方法的優(yōu)劣。

回頁首自行進(jìn)行序列化首先,可以從對象圖以編程的方式生成XML。

這種方式可以簡單到只是在每個JavaBean類中實現(xiàn)toXml()方法即可。

然后就可以選擇合適的XMLAPI,讓每個bean提供表示自己狀態(tài)的元素,并遞歸地對自己的成員調(diào)用對象圖。

顯然,這種方式無法擴(kuò)展到大量的類,因為每個類都需要專門編寫自己的XML生成代碼。

從好的方面來看,這是一個實現(xiàn)起來簡單的方式,沒有額外的配置支出或者更復(fù)雜的構(gòu)建過程支出,任何JavaBean圖都可以只用幾個調(diào)用就變成XML文檔。

在本系列前一篇文章的示例代碼中,我把XML標(biāo)記字符串連接在一起,實現(xiàn)了toXml()方法。

上次我就提到過,這是個糟糕的方法,因為它把確保標(biāo)記配對、實體編碼等工作的負(fù)擔(dān)放在每個toXml()方法的代碼中。

在Java平臺上有幾個XMLAPI可以替您做這些工作,這樣您就可以把精力集中在XML的內(nèi)容上。

清單1用JDOMAPI實現(xiàn)了在線商店示例中表示訂單的類中的toXml()(請參閱圖1)。

清單1.Order類的toXml()的JDOM實現(xiàn)publicElementtoXml(){ElementelOrder=newElement(order);elOrder.setAttribute(id,id);elOrder.setAttribute(cost,getFormattedCost());ElementelDate=newElement(date).addContent(date);elOrder.addContent(elDate);ElementelItems=newElement(items);for(IteratorItemiter=items.iterator();iter.hasNext();){elItems.addContent(iter.next().toXml());}elOrder.addContent(elItems);returnelOrder;}在這里可以看到用JDOM創(chuàng)建元素、使用屬性和添加元素內(nèi)容有多么簡單。

遞歸地調(diào)用復(fù)合JavaBean的toXml()方法是為了取得它們子圖的Element表示。

例如,items元素的內(nèi)容是通過調(diào)用Order聚合的每個Item對象上的toXml()得到的。

回頁首一旦所有的JavaBean都實現(xiàn)了toXml()方法,那么把任意對象圖序列化成XML文檔并返回給Ajax客戶機(jī)就簡單了,如清單2所示。

清單2.從JDOM元素生成XML響應(yīng)publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)throwsjava.io.IOException,ServletException{StringcustId=req.getParameter(username);Customercustomer=getCustomer(custId);ElementresponseElem=customer.toXml();DocumentresponseDoc=newDocument(responseElem);res.setContentType(application/xml);newXMLOutputter().output(responseDoc,res.getWriter());}JDOM再次把工作變得非常簡單。

只需要在對象圖返回的XML元素外面包裝一個Document,然后用XMLOutputter把文檔寫入servlet響應(yīng)即可。

清單3顯示了用這種方式生成的XML示例,用JDOMFormat.getPrettyFormat()對XMLOutputter進(jìn)行初始化,格式化得非常好。

在這個示例中,顧客只做了一個訂單,包含兩個商品。

清單3.代表顧客的XML文檔?xmlversion=1.0encoding=UTF-8?customerusername=jimmy66realnameJamesHyrax/realnameordersorderid=o-11123cost=$349.98date08-26-2005/dateitemsitemid=i-55768nameOolong512MBCFCard/namedescription512MegabyteType1CompactFlashcard.ManufacturedbyOolongIndustries/descriptionprice$49.99/price/itemitemid=i-74491nameFujakSuperpix72Camera/namedescription7.2Megapixeldigitalcamerafeaturingsixshootingmodesand3xopticalzoom.Silver./descriptionprice$299.99/price/item/items/order/orders/customer自行序列化的不足有趣的是,清單3中的代碼展示了讓JavaBean把自己序列化為XML的一個主要不足。

假設(shè)要用這個文檔表示顧客的訂單歷史視圖。

在這種情況下,不太可能要顯示每個歷史訂單中每個商品的完整說明,或者告訴顧客他或她自己的姓名。

但是如果應(yīng)用程序有一個ProductSearch類,它就是以Itembean列表的形式返回搜索結(jié)果,那么在Item的XML表示中包含說明可能會有幫助。

而且,Item類上代表當(dāng)前庫存水平的額外字段,在產(chǎn)品搜索視圖中可能就是需要顯示的有用信息。

但是,不管當(dāng)前的庫存水平是否與當(dāng)前情況相關(guān)(比如對顧客的訂單歷史來說),這個字段都會從包含Item的任何對象圖中序列化出來。

從設(shè)計的角度來看,這是數(shù)據(jù)模型與視圖生成耦合的經(jīng)典問題。

每個bean只能用一種途徑序列化自己,一成不變的方式意味著Ajax交互最終要交換它們不需要交換的數(shù)據(jù),因此造成客戶端代碼要從文檔中找到需要的信息更加困難,而且也會增加帶寬消耗和客戶端的XML解析時間。

這種耦合的另一個后果就是XML的語法不能脫離Java類獨立變化。

例如,對顧客文檔的方案做修改,可能會影響多個Java類,造成它們也不得不做修改和重新編譯。

我稍后會解決這些問題,但是首先來看一個對自行序列化方式的可伸縮性問題的解決方案:

XML綁定框架。

XML綁定框架近些年來,已經(jīng)開發(fā)了多個JavaAPI來簡化XML文檔到Java對象圖的綁定過程。

多數(shù)都提供了XML編排和拆解;也就是說,它們可以在Java對象圖和XML之間執(zhí)行雙向會話。

這些框架封裝了XML處理的全部工作,這意味著應(yīng)用程序代碼只需要處理普通的Java類。

它們還希望提供有用的輔助功能,例如文回頁首檔驗證。

籠統(tǒng)來說,這些框架采用了兩種不同的方式:

代碼生成和對象到XML映射。

我將分別解釋這兩種方式。

代碼生成方式使用代碼生成的框架包括XMLBeans、JAXB、Zeus和JBind。

Castor也能使用這項技術(shù)。

這類框架的起點是描述文檔數(shù)據(jù)類型的XML方案。

使用框架提供的工具,就可以生成代表這些方案定義類型的Java類。

最后,用這些生成的類編寫應(yīng)用程序,表示自己的模型數(shù)據(jù),并通過框架提供的一些輔助機(jī)制把數(shù)據(jù)序列化成XML。

如果應(yīng)用程序要使用大型XML語法,那么代碼生成方式是個很好的方法。

在數(shù)十個類上編寫定制XML序列化代碼的可伸縮性問題由此消除。

另一方面,也不再需要定義自己的JavaBean。

框架生成的Java類通常非常符合XML的結(jié)構(gòu),所以對它們進(jìn)行編碼很難。

而且,生成的類變成啞數(shù)據(jù)容器,因為一般不能向它們添加行為。

一般來說,在應(yīng)用程序代碼中要做些妥協(xié),才能很好地處理方案生成的類型。

另一個缺陷是如果修改方案,會造成生成的類也要修改,所以也就會對圍繞它們編寫的代碼帶來相應(yīng)的影響。

這種類型的XML綁定框架在數(shù)據(jù)拆解時最有用(例如,使用XML文檔并把它們轉(zhuǎn)化成Java對象)。

除非擁有大型數(shù)據(jù)模型而且有可能從生成的類中獲益,否則基于代碼生成的框架對于Ajax應(yīng)用程序來說可能有很大的殺傷力。

映射方式采用映射方式的框架包括Castor和ApacheCommonsBetwixt。

映射通常是比代碼生成更靈活和更輕量的解決方案。

首先,可以像通常一樣編寫JavaBean,包括任何行為以及任何自己喜歡的方便的方法。

然后,在運行時,調(diào)用框架中基于內(nèi)省的編排器,并根據(jù)對象成員的類型、名稱和值生成XML文檔。

通過定義類的映射文件,可以覆蓋默認(rèn)的綁定策略,并就類在XML中的表示方式對編排器提出建議。

這種方法是在可伸縮性與靈活性之間的良好折中。

可以按照自己喜歡的方式編寫Java類,編排器負(fù)責(zé)處理XML。

雖然映射定義文件編寫起來簡單,可伸縮性也足夠好,但是映射規(guī)則最多只能改變標(biāo)準(zhǔn)的綁定行為,而且在對象結(jié)構(gòu)和它們的XML表示之間總要殘留一些耦合。

最終,可能不得不在Java表示或XML格式之間任選一個做些折中,才能讓映射方法起作用。

數(shù)據(jù)綁定總結(jié)DennisSosnoski就XML數(shù)據(jù)綁定API的主題,在代碼生成和代碼映射兩個方面寫了深入的文章。

如果想進(jìn)一步研究這個領(lǐng)域,我推薦他在Castor和代碼生成框架方面的精彩文章(請參閱參考資料中的鏈接)。

總之,代碼生成方式損失了過多的靈活性和方便性,對于典型的Ajax應(yīng)用程序用處不大。

另一方面,基于映射的框架可能工作得很好,但是要恰到好處地調(diào)整它們的映射策略,以便從對象生成需要的XML。

所有的XML綁定API都具有手工序列化技術(shù)的一個主要不足:

模型和視圖的耦合。

被限制為一個類型一個XML表示,就意味著在網(wǎng)絡(luò)上總要有冗余數(shù)據(jù)傳輸。

更嚴(yán)重的問題是,在情況要求客戶端代碼使用專門視圖時,客戶端代碼卻無法得到它,所以可能要費力地處理給定對象圖的一成不變的視圖。

在傳統(tǒng)的Web應(yīng)用程序開發(fā)中,采用頁面模板系統(tǒng)把視圖生成與控制器邏輯和模型數(shù)據(jù)干凈地分離。

這種方法在Ajax場景中也會有幫助。

頁面模板系統(tǒng)任何通用目的的頁面模板技術(shù)都可以用來生成XML,從而使Ajax應(yīng)用程序根據(jù)自己的數(shù)據(jù)模型生成任何XML響應(yīng)文檔。

額外收獲是:

模板可以用簡單的、表現(xiàn)力強(qiáng)的標(biāo)記語言編寫,而不是用一行行的Java代碼編寫。

清單5是一個JSP頁面,采用了Customerbean并表示出定制的XML視圖,適合客戶端代碼生成訂單歷史組件。

清單4.生成訂單歷史文檔的JSP?xmlversion=1.0?%@pagecontentType=application/xml%%@tagliburi=/jsp/jstl/coreprefix=c%c:setvar=custvalue=${requestScope.customer}/orderhistoryusername=${cust.username}c:forEachvar=orderitems=${cust.orders}orderid=${order.id}cost=${order.formattedCost}date${order.date}/dateitemsc:forEachvar=itemitems=${order.items}itemid=${item.id}回頁首namec:outvalue=${item.name}escapeXml=true//nameprice${item.formattedPrice}/price/item/c:forEach/items/order/c:forEach/orderhistory這個簡潔的模板只輸出訂單歷史視圖需要的數(shù)據(jù),不輸出不相關(guān)的資料(例如商品說明)。

創(chuàng)建產(chǎn)品搜索視圖的定制XML應(yīng)當(dāng)同樣簡單,這個視圖包含每個商品的完整說明和庫存水平。

模板的問題另一方面,現(xiàn)在我需要為每個不同視圖創(chuàng)建一個新JSP,而不能僅僅把需要的對象圖組織起來并序列化它。

從設(shè)計的角度來說,許多人可能會有爭議,認(rèn)為這無論如何是件好事,因為這意味著正式地考慮服務(wù)器要生成的文檔類型。

而且,因為我現(xiàn)在要處理通用的模板環(huán)境,而不是特定于XML的API,所以確保標(biāo)記匹配、元素和屬性的順序正確以及XML實體(例如或)正確轉(zhuǎn)義就成了我的責(zé)任。

JSP的核心out標(biāo)記使后面這項工作變得很容易,但是不是所有的模板技術(shù)都提供了這樣的機(jī)制。

最后,沒有方便的途徑可以在服務(wù)器端根據(jù)方案檢驗生成的XML文檔的正確性,但這畢竟不是要在生產(chǎn)環(huán)境中做的事,可以方便地在開發(fā)期間處理它。

不用XML的響應(yīng)數(shù)據(jù)迄今為止,我介紹的所有技術(shù)都用XML文檔的形式生成服務(wù)器響應(yīng)。

但是,XML有一些問題。

其中一個就是延遲。

瀏覽器不能立即解析XML文檔并生成DOM模型,所以這會降低某些Ajax組件需要的迅捷感,特別是在較慢的機(jī)器上解析大型文檔的時候更是如此。

現(xiàn)場搜索就是一個示例,在這種搜索中,當(dāng)用戶輸入搜索術(shù)語時,就會從服務(wù)器提取搜索結(jié)果并顯示給用戶。

對于現(xiàn)場搜索組回頁首件來說,迅速地響應(yīng)輸入是非常重要的,但是同時它還需要迅速而持續(xù)地解析服務(wù)器的響應(yīng)。

延遲是一個重要的考慮因素,但是避免使用XML的最大原因是差勁的客戶端DOMAPI。

清單5顯示了使用跨瀏覽器兼容的方式通過DOM得到某個值的時候,通常不得不面對的困難。

清單5.在JavaScript中導(dǎo)航XML響應(yīng)文檔//Findnameoffirstitemincustomer’slastordervarorderHistoryDoc=req.responseXML;varorders=orderHistoryDoc.getElementsByTagName(order);varlastOrder=orders[orders.length-1];varfirstItem=lastOrder.getElementsByTagName(item)[0];varitemNameElement=firstItem.firstChild;varitemNameText=itemNameElement.firstChild.data;當(dāng)元素中間存在空白時,情況就變得更加復(fù)雜,因為每個元素的firstChild經(jīng)常是個空白文本節(jié)點。

現(xiàn)在有JavaScript庫可以緩解處理XML文檔的麻煩。

這些庫包括Sarissa(請參閱參考資料)和Google-ajaXSLT,這兩個庫都把XPath功能添加到了大多數(shù)瀏覽器中。

但是,想想替代方案還是值得的。

除了responseXML之外,XMLHttpRequest對象還提供了名為responseText的屬性,這個屬性只是以字符串的方式提供服務(wù)器的響應(yīng)體。

responseText屬性當(dāng)服務(wù)器需要向客戶機(jī)發(fā)送非常簡單的值時,responseText特別方便,它可以避免XML導(dǎo)致的帶寬支出和處理支出。

例如,簡單的true/false響應(yīng)可以由服務(wù)器以純文本方式返回,可以是逗號分隔的簡單的名稱或數(shù)字列表。

但是,一般來說,最好不要在同一個應(yīng)用程序中把XML響應(yīng)和純文本響應(yīng)混合使用;保持單一數(shù)據(jù)格式可以讓代碼抽象和重用更加簡單。

responseText與XML響應(yīng)數(shù)據(jù)結(jié)合時也會有用。

在只需要從響應(yīng)文檔中提取單一值的場景中,欺騙性地把XML當(dāng)作文本字符串,而不把它當(dāng)作結(jié)構(gòu)化的文檔對待,會更方便。

例如,清單6顯示了如何用正則表達(dá)式從顧客的訂單歷史中提取第一筆訂單的日期。

不過,這實際是種花招,一般不應(yīng)當(dāng)依賴XML文檔的詞匯表達(dá)。

清單6.用正則表達(dá)式處理XMLHttpRequest的responseText對象varorderHistoryText=req.responseText;varmatches=orderHistoryText.match(/date(.*?)\/date/);vardate=matches[1];在某些情況下,采用即時方式使用responseText會比較方便。

但是,理想情況下,應(yīng)當(dāng)有種途徑,可以用一種能夠讓JavaScript輕松導(dǎo)航、卻沒有XML處理支出的格式表示復(fù)雜的結(jié)構(gòu)化數(shù)據(jù)。

幸運的是,確實存在這樣一種格式。

JavaScript對象標(biāo)注實際上,JavaScript對象的大部分都由聯(lián)合數(shù)組、數(shù)字索引數(shù)組、字符串、數(shù)字或者這些類型的嵌套組合而成。

因為所有類型都可以用JavaScript直接聲明,所以可以在一條語句中靜態(tài)地定義對象圖。

清單7使用JSON語法聲明了一個對象,并演示了如何訪問這個對象。

大括號表示聯(lián)合數(shù)組(即對象),它的鍵-值組合由逗號分隔。

方括號表示數(shù)字索引數(shù)組。

清單7.用JSON在JavaScript中直接聲明一個簡單對象varband={name:TheBeatles,members:[{name:John,instruments:[Vocals,Guitar,Piano]},{name:Paul,instruments:[Vocals,Bass,Piano,Guitar]},{name:George,instruments:[Guitar,Vocals]回頁首},{name:Ringo,instruments:[Drums,Vocals]}]};//Interrogatethebandobjectvarmusician=band.members[3];alert(musician.name+played+musician.instruments[0]+with+band.name);既然JSON是一個有趣的語言特性,那么它對Ajax有什么意義呢?妙處在于可以用JSON在Ajax服務(wù)器響應(yīng)中通過網(wǎng)絡(luò)發(fā)送JavaScript對象圖。

這意味著在客戶端可以避免使用笨拙的DOMAPI對XML進(jìn)行導(dǎo)航只需要分析JSON響應(yīng),就會立即得到可以訪問的JavaScript對象圖。

但是,首先需要把JavaBean變成JSON。

從Java類產(chǎn)生JSON不同XML生成技術(shù)所具有的優(yōu)缺點也適用于JSON的產(chǎn)生。

而且可以證明,存在需要再次使用表示模板技術(shù)的情況。

但是,使用JSON在理念上更接近于在應(yīng)用層之間傳遞序列化的對象,而不是創(chuàng)建應(yīng)用程序狀態(tài)的視圖。

我將介紹如何用org.json這個JavaAPI在Java類上創(chuàng)建toJSONObject()方法。

然后,就可以把JSONObject簡單地序列化成JSON。

清單8反映了清單1討論的XML,顯示了Order類的toJSONObject()實現(xiàn)。

清單8.Order類的toJSONObject()方法實現(xiàn)publicJSONObjecttoJSONObject(){JSONObjectjson=newJSONObject();json.put(id,id);json.put(cost,getFormattedCost());json.put(date,date);JSONArrayjsonItems=newJSONArray();for(IteratorItemiter=items.iterator();iter.hasNext();){jsonItems.put(iter.next().toJSONObject());}json.put(items,jsonItems);returnjson;}可以看到,org.jsonAPI非常簡單。

JSONObject代表JavaScript對象(即聯(lián)合數(shù)組),有不同的put()方法,方法接受的String鍵和值是原生類型、String類型或其他JSON類型。

JSONArray代表索引數(shù)組,所以它的put()方法只接受一個值。

請注意在清單8中,創(chuàng)建jsonItems數(shù)組,然后再用put()把它附加到j(luò)son對象上;可以用另外一種方法做這項工作,就是對每個項目調(diào)用json.accumulate(items,iter.next().toJSONObject());。

accumulate()方法與put()類似,區(qū)別在于它把值添加到按照鍵進(jìn)行識別的索引數(shù)組。

清單9顯示了如何序列化JSONObject并把它寫入servlet響應(yīng)。

清單9.從JSONObject生成序列化的JSON響應(yīng)publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)throwsjava.io.IOException,ServletException{StringcustId=req.getParameter(username);Customercustomer=getCustomer(custId);res.setContentType(application/x-json);res.getWriter().print(customer.toJSONObject());}可以看到,它實際上什么也沒有做。

在這里隱式調(diào)用的JSONObject的toString()方法做了所有工作。

請注意,application/x-json內(nèi)容類型還有一點不確定在編寫這篇文章的時候,關(guān)于JSON應(yīng)當(dāng)屬于什么MIME類型還沒有定論。

但是,目前application/x-json是合理的選擇。

清單10顯示了這個servlet代碼的示例響應(yīng)。

清單10.Customerbean的JSON表示{orders:[{items:[{price:$49.99,description:512MegabyteType1CompactFlashcard.ManufacturedbyOolongIndustries,name:Oolong512MBCFCard,id:i-55768},{price:$299.99,description:7.2Megapixeldigitalcamerafeaturingsixshootingmodesand3xopticalzoom.Silver.,name:FujakSuperpix72Camera,id:i-74491}],date:08-26-2005,cost:$349.98,id:o-11123}],realname:JamesHyrax,username:jimmy66}在客戶端使用JSON處理的最后一步是把在客戶端把JSON數(shù)據(jù)變成JavaScript對象。

這可以通過對eval()的簡單調(diào)用實現(xiàn),這個函數(shù)可以即時地解釋包含JavaScript表達(dá)式的字符串。

清單11把JSON響應(yīng)轉(zhuǎn)變成JavaScript對象圖,然后執(zhí)行清單5的任務(wù),從顧客的最后一次訂單中得到第一個商品的名稱。

清單11.評估JSON響應(yīng)varjsonExpression=(+req.responseText+);varcustomer=eval(jsonExpression);//Findnameoffirstitemincustomer’slastordervarlastOrder=customer.orders[customer.orders.length-1];varname=lastOrder.items[0].name;比較清單11和清單5可以發(fā)現(xiàn)使用JSON的客戶端的優(yōu)勢。

如果在Ajax項目中要在客戶端對許多復(fù)雜的服務(wù)器響應(yīng)進(jìn)行導(dǎo)航,那么JSON可能適合您的需要。

JSON和XMLHttpRequest結(jié)合還會讓Ajax

溫馨提示

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

評論

0/150

提交評論