《HTML教程》-9.3-9.4教學(xué)材料_第1頁
《HTML教程》-9.3-9.4教學(xué)材料_第2頁
《HTML教程》-9.3-9.4教學(xué)材料_第3頁
《HTML教程》-9.3-9.4教學(xué)材料_第4頁
《HTML教程》-9.3-9.4教學(xué)材料_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本實(shí)例從服務(wù)器請(qǐng)求一幅圖片,并顯示在網(wǎng)頁中,以此說明Ajax的請(qǐng)求處理過程。需要說明的是,接收和發(fā)送二進(jìn)制數(shù)據(jù)是XMLHttpRequestLevel2新增的功能,除了設(shè)置的請(qǐng)求類型和數(shù)據(jù)解析方式不同外,基本過程與其他數(shù)據(jù)——文本、XML和JSON——是一致的。9.3.1創(chuàng)建XMLHttpRequest請(qǐng)求對(duì)象要發(fā)送Ajax請(qǐng)求,首先要?jiǎng)?chuàng)建異步請(qǐng)求對(duì)象。這里我們采取先直接以new關(guān)鍵字創(chuàng)建XMLHttpRequest對(duì)象;如果創(chuàng)建不成功,則再以ActiveX插件的形式創(chuàng)建該異步請(qǐng)求對(duì)象。代碼如下:varxhr=null;try{ xhr=newXMLHttpRequest(); }catch(e){ xhr=newActiveXObject('Microsoft.HTTP');}這種通過try…catch創(chuàng)建對(duì)象的方式,不需要進(jìn)行任何條件判斷,執(zhí)行效率較高。9.3.2建立連接創(chuàng)建異步請(qǐng)求對(duì)象以后,就可以建立與服務(wù)器的連接了。注意:此時(shí)只是建立了與服務(wù)器的連接,但并沒有發(fā)起任何請(qǐng)求。異步請(qǐng)求對(duì)象通過open方法建立與服務(wù)器的連接。open方法的原型及用法前面已經(jīng)介紹(見9.2.2節(jié)),這里再做幾點(diǎn)說明:(1)請(qǐng)求方式HTTP請(qǐng)求方式有8種,每種請(qǐng)求可以實(shí)現(xiàn)的功能不同。但如果要服務(wù)器響應(yīng)某種請(qǐng)求的話,則需要服務(wù)器端對(duì)這種方式進(jìn)行響應(yīng)。也就是說,服務(wù)器必須實(shí)現(xiàn)了對(duì)這種請(qǐng)求方式的處理,當(dāng)然不同的服務(wù)器實(shí)現(xiàn)方式不同。請(qǐng)求方式最為常用的就是GET和POST,為了便于大家的理解,也簡(jiǎn)單的把其他方式[28]列舉如下,僅供參考。◆GET——請(qǐng)求指定的頁面信息,并返回實(shí)體主體?!鬑EAD——類似于get請(qǐng)求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭◆POST——向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。◆PUT——從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容?!鬌ELETE——請(qǐng)求服務(wù)器刪除指定的頁面?!鬋ONNECT

——HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器?!鬙PTIONS——允許客戶端查看服務(wù)器的性能?!鬞RACE——回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。針對(duì)以上請(qǐng)求方式需要特別注意的是,如果Ajax發(fā)送了某種請(qǐng)求,而服務(wù)器沒有實(shí)現(xiàn)對(duì)這種請(qǐng)求的處理,或者服務(wù)器不能識(shí)別這種請(qǐng)求方式,則會(huì)返回相應(yīng)的狀態(tài)碼以告知客戶,如405(不允許執(zhí)行該方法),501(服務(wù)器不識(shí)別或者沒有實(shí)現(xiàn)此方法)等。常用的GET和POST方式的主要區(qū)別:◆GET方式主要用于向服務(wù)器請(qǐng)求數(shù)據(jù),POST請(qǐng)求主要用于向服務(wù)器提交數(shù)據(jù)。◆GET以參數(shù)字符串的方式向服務(wù)器提交數(shù)據(jù),參數(shù)字符串拼接在請(qǐng)求的URL地址之后,可以顯示在瀏覽器的地址欄中,不安全。而POST請(qǐng)求則將請(qǐng)求參數(shù)(或請(qǐng)求數(shù)據(jù))封裝在HTTP請(qǐng)求體中,不在地址欄中顯示,所以比較安全?!鬐ET發(fā)送的數(shù)據(jù)長(zhǎng)度有限制,一般不超過1K,而POST請(qǐng)求發(fā)送的請(qǐng)求則可達(dá)2M。

◆發(fā)送POST請(qǐng)求之前,必須使用setRequestHeader()方法將Content-Type設(shè)置為application/x-www-form-urlencoded,而GET請(qǐng)求則不需要。這里我們要從服務(wù)器請(qǐng)求一幅圖片,并不向服務(wù)器發(fā)送任何數(shù)據(jù),所以可以采用GET請(qǐng)求方式。我們要請(qǐng)求的URL地址是loadImage.jsp,也就是說服務(wù)器端有一個(gè)loadImage.jsp文件,它來響應(yīng)這一請(qǐng)求,并把服務(wù)器上的圖片內(nèi)容讀取出來發(fā)回到客戶端。這里采用異步請(qǐng)求方式。(2)同步和異步所謂異步就是請(qǐng)求者和被請(qǐng)求者可以同時(shí)進(jìn)行各自的工作,這種請(qǐng)求的方式就稱為異步。舉個(gè)例子,假如老師上課時(shí)忘了帶教本,然后就讓班長(zhǎng)去取,之后老師就繼續(xù)講課,班長(zhǎng)去老師辦公室取教本,這樣的方式就是異步(老師講課與班長(zhǎng)取教本互不干涉,各自獨(dú)立進(jìn)行)的。假如老師沒有教本就上不了課,非要等班長(zhǎng)取回教本才能繼續(xù)上課的話,那就稱之為“同步”了。異步請(qǐng)求可以增強(qiáng)客戶體驗(yàn),因?yàn)樵诎l(fā)起請(qǐng)求之后,客戶端繼續(xù)處理需要處理的事件,而沒有必要等待服務(wù)器的響應(yīng)。這里用異步方式請(qǐng)求加載服務(wù)器端的圖片,好處就是發(fā)送請(qǐng)求之后,該干嘛干嘛,喝喝茶或咖啡,圖片就顯示出來了!經(jīng)過上面的分析,得到如下的open方法:xhr.open('GET','loadImage.jsp',true);(3)設(shè)置請(qǐng)求的類型通過open方法建立與服務(wù)器的連接之后,需要設(shè)置請(qǐng)求的類型,也就是說明客戶端(或者XMLHttpRequest對(duì)象)希望接收的數(shù)據(jù)類型,這可以通過對(duì)responseType屬性進(jìn)行賦值實(shí)現(xiàn):xhr.responseType='blob';blob說明希望接收的數(shù)據(jù)類型為Blob類型,也就是二進(jìn)制數(shù)據(jù)類型。二進(jìn)制數(shù)據(jù)類型可以包括任何類型的文件,如文本文件、音頻文件和視頻文件等等,不同類型的數(shù)據(jù)需要的解析方法不同。說明:這一步驟不是必須的,對(duì)于文本和XML類型的數(shù)據(jù),可以不進(jìn)行這一設(shè)置。9.3.3注冊(cè)事件處理程序處理服務(wù)器響應(yīng)通過注冊(cè)事件處理函數(shù),程序員可以決定何時(shí)對(duì)Ajax請(qǐng)求進(jìn)行處理,以及怎樣處理。使用最多的onreadystatechange事件,這個(gè)事件在Ajax請(qǐng)求對(duì)象的狀態(tài)readyState(從0變化到4,共5個(gè)狀態(tài))發(fā)生變化時(shí)觸發(fā),每種readyState狀態(tài)代表的意義在9.2.1節(jié)表9-1中已經(jīng)列出,可以根據(jù)需要選擇要對(duì)哪一狀態(tài)進(jìn)行處理。另外status(或statusText)與readyState配合使用,表示服務(wù)器的響應(yīng)情況,用得較多的條件組合就是:readyState==4&&status==200或者readyState==4&&statusText==‘OK’表示XMLHttpRequest對(duì)象請(qǐng)求已經(jīng)成功,數(shù)據(jù)下載完畢;并且服務(wù)器的響應(yīng)狀態(tài)碼為200(表示響應(yīng)成功,或者狀態(tài)為’OK’),此時(shí)可以對(duì)服務(wù)器返回的數(shù)據(jù)進(jìn)行處理。但在這個(gè)例子中,我們請(qǐng)求的是一幅圖片。通過表9-3可以看到,當(dāng)服務(wù)器數(shù)據(jù)下載成功時(shí)會(huì)觸發(fā)XMLHttpRequest對(duì)象的onload事件,我們可以對(duì)這個(gè)事件進(jìn)行處理。對(duì)事件處理的方法就是注冊(cè)事件處理函數(shù)。事件處理函數(shù)的注冊(cè)代碼如下:xhr.onload=displayPhoto;displayPhoto是顯示服務(wù)器端圖片的函數(shù),這里需要注意的是事件注冊(cè)只是注冊(cè)函數(shù)名,而不是函數(shù)調(diào)用,所以沒有必要加圓括號(hào),以下寫法是錯(cuò)誤的!xhr.onload=displayPhoto();//×錯(cuò)誤的寫法。Ajax程序的主要任務(wù)是處理服務(wù)器端的數(shù)據(jù)。編寫程序的重點(diǎn)就是解析數(shù)據(jù),并且把數(shù)據(jù)顯示在網(wǎng)頁上,并控制它的顯示樣式。這需要用到解析XML的知識(shí)(第10章)、JSON的知識(shí)(第11章)和解析二進(jìn)制文件的知識(shí),本例只是簡(jiǎn)單的把二進(jìn)制文件作為圖片顯示在網(wǎng)頁(對(duì)應(yīng)一個(gè)img標(biāo)記)上。對(duì)于二進(jìn)制數(shù)據(jù)的處理比較復(fù)雜,音頻、視頻和文件有不同的處理方法,還要用到HTML5的音頻和視頻知識(shí),這里只做一般的討論。關(guān)于把二進(jìn)制數(shù)據(jù)作為圖片顯示在網(wǎng)頁的方法,也就是此處的displayPhoto()函數(shù),將在9.3.5節(jié)進(jìn)行講解。9.3.4發(fā)送請(qǐng)求

Ajax請(qǐng)求的最后一步就是發(fā)送請(qǐng)求了,發(fā)送請(qǐng)求很簡(jiǎn)單,只需要調(diào)用send()方法就可以了。send()方法可以向服務(wù)器發(fā)送數(shù)據(jù)(GET方式以URL請(qǐng)求參數(shù)的方式發(fā)送;POST在請(qǐng)求體中發(fā)送)。發(fā)送的數(shù)據(jù)可以是ArrayBuffer(二進(jìn)制緩沖數(shù)組)、Blob(二進(jìn)制大對(duì)象)、Document(類似XML格式的數(shù)據(jù))、DOMString(字符串)、FormData(表單)等,這些內(nèi)容已經(jīng)在9.2.2節(jié)進(jìn)行了介紹。在以POST方式發(fā)送請(qǐng)求時(shí),還要設(shè)置請(qǐng)求頭,代碼如下:xhr.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);這一設(shè)置對(duì)于POST請(qǐng)求來說是必須的,否則服務(wù)器將不能正確解析Ajax發(fā)送的數(shù)據(jù)。在本例中使用的GET請(qǐng)求方式,所以可以不進(jìn)行此設(shè)置。本例發(fā)送的請(qǐng)求只需要調(diào)用send()方法:xhr.send();創(chuàng)建Ajax請(qǐng)求對(duì)象、建立連接、設(shè)置請(qǐng)求類型(可選)、注冊(cè)事件處理程序和發(fā)送請(qǐng)求,是Ajax請(qǐng)求的標(biāo)準(zhǔn)例程,任何程序都要經(jīng)過這些步驟。為了方便大家理解,把整個(gè)請(qǐng)求代碼顯示在清單9-1中。9.3.5解析數(shù)據(jù)

前面已經(jīng)說過,Ajax除了基本的請(qǐng)求例程(步驟)之外,最重要的就是解析服務(wù)器的響應(yīng)數(shù)據(jù),并顯示給用戶。Ajax可以接收的數(shù)據(jù)類型包括:

◆純文本?!鬤ML數(shù)據(jù)?!鬔SON數(shù)據(jù)(也是文本類型,只不過是符合JSON語法格式的文本)。

◆二進(jìn)制數(shù)據(jù)。純文本只適用于數(shù)據(jù)量小,沒有格式要求的文本內(nèi)容,通過XMLHttpRequest對(duì)象的responseText屬性接收服務(wù)器的返回?cái)?shù)據(jù)。此種類型的數(shù)據(jù)只是簡(jiǎn)單的顯示在網(wǎng)頁中,并添加一定的樣式就可以。XML是數(shù)據(jù)傳輸?shù)母袷?,可以傳送結(jié)構(gòu)復(fù)雜的數(shù)據(jù),并有一定的自明性(自我說明的能力),并且XML數(shù)據(jù)解析有完善的接口和處理函數(shù),解析比較容易。但XML數(shù)據(jù)本身比較龐大,占用機(jī)器的內(nèi)存較多,對(duì)機(jī)器壓力較大。所以,一般情況下以JSON數(shù)據(jù)格式代替。JSON數(shù)據(jù)是符合JSON格式要求的,通過XMLHttpRequest對(duì)象的responseText屬性接收服務(wù)器端的數(shù)據(jù)。得到的數(shù)據(jù)只是符合JSON格式的字符串,還必須把這個(gè)字符串包裝成JSON對(duì)象才可以進(jìn)行解析。JSON數(shù)據(jù)解析的例子在第11章介紹。二進(jìn)制數(shù)據(jù)是XMLHttpRequestLevel2新增的數(shù)據(jù)類型,可以支持音頻、視頻和圖像的上傳與下載。但此種類型的數(shù)據(jù)與文件處理有關(guān),所以不能簡(jiǎn)單的一概而論,要根據(jù)不同的內(nèi)容類型(音頻、視頻和文件)采用不同的處理方式。還可能用到HTML5的音頻處理、視頻處理和文件處理的內(nèi)容。本節(jié)給出的例子只是把二進(jìn)制數(shù)據(jù)(表示一幅圖片)顯示在網(wǎng)頁上。處理服務(wù)器端圖片顯示的displayPhoto()函數(shù)已經(jīng)注冊(cè)給了異步請(qǐng)求對(duì)象XMLHttpRequest的onload事件,下面詳細(xì)介紹這個(gè)函數(shù)的實(shí)現(xiàn)過程。這里將用到如下的知識(shí)點(diǎn):

◆獲取事件對(duì)象——標(biāo)準(zhǔn)模型中的事件對(duì)象以參數(shù)的方式進(jìn)行傳遞,而IE模型的事件以window的全局屬性的方式出現(xiàn)(見7.3節(jié)事件對(duì)象)。

◆獲取事件的事件源——標(biāo)準(zhǔn)模型中事件源為target,而IE模型中事件源為srcElement(見7.3.1節(jié)Event對(duì)象)。

◆獲取服務(wù)器的響應(yīng)數(shù)據(jù)——二進(jìn)制數(shù)據(jù)使用異步請(qǐng)求對(duì)象XMLHttpRequest的response屬性獲得(見9.2.1節(jié)XMLHttpRequest對(duì)象的屬性)。

◆把二進(jìn)制數(shù)據(jù)作為圖片顯示在網(wǎng)頁上——使用URL對(duì)象的createObjectURL()方法將二進(jìn)制數(shù)據(jù)顯示為<img>的資源路徑,從而顯示圖片。(1)獲取事件對(duì)象在9.3.3節(jié)中我們已經(jīng)通過xhr.onload=displayPhoto;語句將displayPhoto()函數(shù)注冊(cè)給了XMLHttpRequest對(duì)象的onload事件。事件發(fā)生時(shí)會(huì)產(chǎn)生事件對(duì)象,這個(gè)事件對(duì)象在標(biāo)準(zhǔn)模型中以參數(shù)的形式傳遞給被調(diào)函數(shù),即此處的displayPhoto()。而在IE中以全局屬性的方式記錄事件對(duì)象,所以displayPhoto函數(shù)的原型如下:displayPhoto(xhrEvt);其中,xhrEvt即傳遞給該函數(shù)的實(shí)際對(duì)象,這里是XMLHttpRequestProgressEvent事件對(duì)象。如果在IE瀏覽器中執(zhí)行的話,調(diào)用此函數(shù)時(shí),將不會(huì)傳遞任何參數(shù),此時(shí)xhrEvt為undefined。由于存在這樣的差異,所以要取得觸發(fā)事件的事件對(duì)象,需要考慮這兩種情況,可以通過JavaScript的邏輯或運(yùn)算符對(duì)兩種對(duì)象作邏輯或運(yùn)算,保留存在的那個(gè)(要么是傳遞的xhrEvt,要么是window.event)參數(shù),代碼如下://取得事件對(duì)象 varevt=xhrEvt||window.event;上述方法對(duì)于兼容不同情況的需求很有效。這是JavaScript中邏輯運(yùn)算特有的性質(zhì):如果xhrEvt存在(標(biāo)準(zhǔn)模型的瀏覽器),則evt的值為xhrEvt;否則為window.event。但是,如果這兩種情況都不是的話,evt則為undefined。(2)獲取事件源

獲取事件對(duì)象之后,還需要知道觸發(fā)事件的事件源(這里觸發(fā)事件的是XMLHttpRequest對(duì)象),因?yàn)槲覀冃枰褂肵MLHttpRequest對(duì)象的response屬性來接收服務(wù)器返回的響應(yīng)數(shù)據(jù),所以要得到事件源對(duì)象。由于兩種事件模型的差異,取得事件源的方法與獲取事件對(duì)象類似,用邏輯||對(duì)兩種情況進(jìn)行運(yùn)算,取存在的那個(gè)作為事件源對(duì)象,代碼如下:varxhr=evt.srcElement||evt.target;其中,srcElement為IE模型中的事件源,而target為標(biāo)準(zhǔn)模型中的事件源。(3)獲取服務(wù)器數(shù)據(jù)并顯示在網(wǎng)頁上在異步請(qǐng)求對(duì)象XMLHttpRequest對(duì)象的響應(yīng)狀態(tài)status為200時(shí),表示服務(wù)器已經(jīng)成功響應(yīng),可以接收服務(wù)器的數(shù)據(jù)了。接收服務(wù)器數(shù)據(jù)非常簡(jiǎn)單,只需要根據(jù)數(shù)據(jù)的類型分別使用responseText、responseXML和response屬性接收數(shù)據(jù)即可,這里接收的是二進(jìn)制數(shù)據(jù)。使用response進(jìn)行接收,代碼如下:varblob=xhr.response;執(zhí)行上述語句后,變量blob中就保存了服務(wù)器傳回的響應(yīng)數(shù)據(jù)(二進(jìn)制的圖片流)。接下的任務(wù)就是把這個(gè)代表圖片的二進(jìn)制流轉(zhuǎn)換成圖片顯示在網(wǎng)頁上。這可以通過URL對(duì)象的createObjectURL()來實(shí)現(xiàn)。說明:這個(gè)URL對(duì)象目前還處在實(shí)驗(yàn)階段,對(duì)它的支持并不完善,有些瀏覽器并不支持這個(gè)對(duì)象。IE瀏覽器自少是10以上的版本才可以支持這個(gè)對(duì)象。所以想獲得這個(gè)URL對(duì)象,也需要使用邏輯或運(yùn)算,對(duì)于不同的瀏覽器使用不同的前綴,代碼如下:varURL=window.URL||window.webkitURL;獲取URL對(duì)象之后就可以通過createObjectURL()函數(shù)將二進(jìn)制數(shù)據(jù)blob轉(zhuǎn)換成網(wǎng)頁元素img的資源路徑了,就可以將圖片顯示在網(wǎng)頁上了,代碼如下:img.src=URL.createObjectURL(blob);注意:這個(gè)資源路徑在不需要時(shí)要?jiǎng)h除,刪除資源路徑的方法是revokeObjectURL(),以節(jié)約資源。刪除的時(shí)機(jī)是圖片加載完成之后,所以可以通過向img的onload事件注冊(cè)事件處理函數(shù)完成資源路徑的刪除:img.onload=function(){

//圖片加載完畢,釋放創(chuàng)建的URL對(duì)象,以節(jié)約資源 URL.revokeObjectURL(img.src); };完整的二進(jìn)制數(shù)據(jù)解析代碼如清單9-2所示。9.3.6服務(wù)器端響應(yīng)

Ajax的響應(yīng)可以是任何Web應(yīng)用,如ASP、PHP等。其實(shí)不論何種腳本過程都是一樣的,概括起來有以下幾個(gè)步驟:

◆定位客戶端要訪問的文件;

◆讀取客戶要訪問的文件,并作為輸入流;

◆以流的形式將文件寫入到客戶端。JSP為例說明服務(wù)器端如何響應(yīng)第1步:定位客戶端要訪問的文件在本例中,客戶端并沒有特別指明要顯示哪個(gè)文件,所以只在讀取服務(wù)器上的指定文件夾,比如images文件夾中的圖片文件就可以了。首先,要查找服務(wù)器上的images文件夾,在JSP中可以通過application對(duì)象的getRealPath()方法進(jìn)行查找和定位,該方法返回images文件夾在服務(wù)器磁盤上的絕對(duì)路徑,然后通過這個(gè)絕對(duì)路徑定位文件,代碼如下:Stringpath=application.getRealPath("images");第2步:讀取定位到的文件在JSP中,application對(duì)象提供了一個(gè)名為getResourceAsStream()的方法,可以將指定的文件以流的形式讀?。ɑ蚍祷兀?,方便了文件的讀取操作,可以用這個(gè)返回的流作為向客戶端的輸入流,代碼如下:InputStreamin=application.getResourceAsStream("images/flower.jpg");第3步:以文件流的形式將文件定入到客戶端在Java中讀寫文件需要用到輸入和輸出流,向客戶端輸出內(nèi)容也不例外,需要一個(gè)指向客戶端的輸出流。這個(gè)輸出流可以通過JSP的response對(duì)象獲得,代碼如下:OutputStreamwrite=response.getOutputStream();得到了文件的輸出流和輸出流以后,就很容易的,剩下的事情只不是過從輸入流中讀出內(nèi)容,寫入到輸出流中,直到把輸入流中的內(nèi)容全部讀取完成。讀取文件時(shí)需要用到一個(gè)緩沖區(qū),由于是圖像文件,所以需要二進(jìn)制數(shù)組作為緩沖區(qū)。讀取并輸出文件內(nèi)容的代碼如下所示:byte[]buff=newbyte[1024]; inti=-1; while((i=in.read(buff))!=-1){ write.write(buff,0,i); }在以上代碼中:首先聲明了二進(jìn)制數(shù)組緩沖區(qū)buff,大小為1024字節(jié)。然后聲明記錄每次讀取內(nèi)容長(zhǎng)度的變量i,然后在while循環(huán)中通過輸入流(in)的read()方法分次讀取輸入流中的內(nèi)容,然后通過輸入流write的write()方法,將讀取到的內(nèi)容寫入輸入流(即客戶端)。寫到這里,這個(gè)例子就完成了,但還有一些工作要做。首先就是要把打開的文件關(guān)閉,否則會(huì)出現(xiàn)意想不到的后果,關(guān)閉輸入/輸出流的代碼很簡(jiǎn)單:in.close(); write.flush(); write.close(); write=null;只需要調(diào)用輸入/輸出流的close()方法即可關(guān)閉。說明:對(duì)于輸出流對(duì)象write,由于是我們自己聲明使用的,所以使用完畢后將其置為null,也就是write=null;等待JVM垃圾回收器把它回收。注意,如果多次運(yùn)行該程序的話,會(huì)出現(xiàn)getOutputStream()hasalreadybeencalledforthisresponse異常,解決方法就是在JSP文件的末尾添加以下代碼:out.clear(); out=pageContext.pushBody();出現(xiàn)這個(gè)問題的原因是文件下載完畢,out對(duì)象也就結(jié)束。如果不把它清理掉,下次再回送結(jié)果時(shí),會(huì)發(fā)現(xiàn)out已經(jīng)響應(yīng)完畢了,無法進(jìn)行該次請(qǐng)求,所以需要把上次的out對(duì)象清除,并重新創(chuàng)建一個(gè)out對(duì)象就可以了。完整的服務(wù)器端響應(yīng)代碼如清單9-3

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論