專利名稱::用于網(wǎng)絡(luò)高速緩存的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及改進(jìn)的數(shù)據(jù)處理系統(tǒng),尤其涉及具有改進(jìn)的網(wǎng)絡(luò)資源分配的數(shù)據(jù)處理系統(tǒng)。更具體地,本發(fā)明提供了用于在計(jì)算機(jī)網(wǎng)絡(luò)內(nèi)高速緩存數(shù)據(jù)對(duì)象的方法和系統(tǒng)。
背景技術(shù):
:因特網(wǎng)上發(fā)送的數(shù)據(jù)量以超過(guò)因特網(wǎng)用戶數(shù)量增長(zhǎng)或其交易數(shù)量增長(zhǎng)的速度持續(xù)增長(zhǎng)。這種增長(zhǎng)的主要因素是萬(wàn)維網(wǎng)站點(diǎn)本身的不斷變化的性質(zhì)。在萬(wàn)維網(wǎng)的早期階段,Web頁(yè)面主要包括靜態(tài)內(nèi)容,例如文本,圖象和到其它站點(diǎn)的鏈接。用戶與Web站點(diǎn)交互的范圍是下載HTML頁(yè)面及其元素。由于不管誰(shuí)請(qǐng)求了頁(yè)面,內(nèi)容通常均相同,Web服務(wù)器支持許多用戶的工作相對(duì)簡(jiǎn)單。然而當(dāng)前趨勢(shì)是走向交互式Web站點(diǎn),其中Web站點(diǎn)的內(nèi)容和外觀隨特定用戶和/或用戶輸入而改變。這對(duì)于支持在線產(chǎn)品選擇和購(gòu)買(mǎi)的電子商務(wù)站點(diǎn)尤其如此。這種站點(diǎn)與較早的Web站點(diǎn)的區(qū)別在于其更多的動(dòng)態(tài)內(nèi)容。這種站點(diǎn)的一個(gè)常見(jiàn)的例子是在許多因特網(wǎng)商業(yè)站點(diǎn)上提供的“在線目錄”。每個(gè)登錄到站點(diǎn)以進(jìn)行購(gòu)買(mǎi)的客戶有機(jī)會(huì)瀏覽目錄,甚至細(xì)讀數(shù)千種產(chǎn)品的詳細(xì)信息。表面上,Web服務(wù)器必須為每個(gè)購(gòu)物者維護(hù)和更新唯一的Web頁(yè)面。因特網(wǎng)用戶因這種可定制的交互式Web站點(diǎn)而得到方便,并且客戶預(yù)期無(wú)疑為在Web頁(yè)面中進(jìn)一步使用動(dòng)態(tài)內(nèi)容提供了動(dòng)力。因特網(wǎng)Web頁(yè)面中動(dòng)態(tài)內(nèi)容使用的增長(zhǎng)為Web站點(diǎn)的操作人員帶來(lái)某些實(shí)施保障問(wèn)題。今天的電子商務(wù)站點(diǎn)的特征在于非常高的“瀏覽-購(gòu)買(mǎi)比率”。對(duì)于購(gòu)物站點(diǎn),典型的比率是每60次不更新持久商業(yè)記錄的交互(“請(qǐng)求”或“查詢”)才有一次更新該記錄的交互(“交易”)-瀏覽產(chǎn)品說(shuō)明是請(qǐng)求的例子,而購(gòu)買(mǎi)是交易的例子。動(dòng)態(tài)內(nèi)容越來(lái)越流行的一個(gè)結(jié)果是,雖然交易數(shù)量以可預(yù)測(cè)和可管理的速度增長(zhǎng),然而請(qǐng)求數(shù)量的增長(zhǎng)是爆發(fā)式的。包含動(dòng)態(tài)內(nèi)容的Web頁(yè)面的高用戶交互性質(zhì)導(dǎo)致每次交易的大量請(qǐng)求。那些Web頁(yè)面內(nèi)的動(dòng)態(tài)內(nèi)容通常是在每當(dāng)用戶請(qǐng)求瀏覽這些Web頁(yè)面中的一個(gè)時(shí)產(chǎn)生的。這導(dǎo)致在單次會(huì)話期間必須為用戶準(zhǔn)備和傳送巨大數(shù)量的內(nèi)容。用戶的期望促使站點(diǎn)提供方響應(yīng)其請(qǐng)求而迅速提供動(dòng)態(tài)Web內(nèi)容。如果潛在客戶感到Web站點(diǎn)反應(yīng)過(guò)慢,他們可能終止訪問(wèn)站點(diǎn),從而導(dǎo)致業(yè)務(wù)的喪失。然而,處理巨大量的因特網(wǎng)業(yè)務(wù)可能對(duì)電子商務(wù)施加過(guò)度的財(cái)務(wù)負(fù)擔(dān)。使電子商務(wù)滿足潛在客戶日益增長(zhǎng)的信息要求的最直接方式是通過(guò)增加更多計(jì)算機(jī)、存儲(chǔ)器和帶寬來(lái)加強(qiáng)其服務(wù)器端的硬件。這個(gè)解決方案昂貴且低效,因而使人望而卻步。更節(jié)省成本的方案是高速緩存,這是一種通常在數(shù)字計(jì)算機(jī)中用來(lái)增強(qiáng)性能的技術(shù)。計(jì)算機(jī)中用于數(shù)據(jù)存儲(chǔ)的主存儲(chǔ)器通常比處理器慢得多。為在數(shù)據(jù)訪問(wèn)期間適應(yīng)較慢的存儲(chǔ)器,通常向處理器的正常指令時(shí)序加入等待狀態(tài)。如果需要處理器始終從主存儲(chǔ)器訪問(wèn)數(shù)據(jù),其性能將受到顯著損害。高速緩存技術(shù)使用較小但非??焖俚拇鎯?chǔ)緩沖器(被稱作“高速緩存”)來(lái)利用被稱為“數(shù)據(jù)局部性”的統(tǒng)計(jì)特性,以克服主存儲(chǔ)器訪問(wèn)瓶頸。數(shù)據(jù)局部性是指連續(xù)數(shù)據(jù)訪問(wèn)涉及相同的通用存儲(chǔ)器區(qū)域的常見(jiàn)傾向。這個(gè)特性有時(shí)被表述為“80/20”規(guī)則,其中80%的數(shù)據(jù)訪問(wèn)將針對(duì)相同的20%的存儲(chǔ)器。以下例子雖然與Web無(wú)關(guān),卻一般地說(shuō)明了高速緩存的有益效果。假定有一個(gè)計(jì)算機(jī)程序?qū)蓚€(gè)大數(shù)組相乘,并且希望考慮到可能修改計(jì)算機(jī)以允許其更快速地運(yùn)行程序的方式。最直接的修改是增加處理器速度,然而這種方式是有局限的。程序中每個(gè)單獨(dú)的乘運(yùn)算需要處理器從存儲(chǔ)器獲取兩個(gè)操作數(shù),計(jì)算乘積,并且接著將結(jié)果回寫(xiě)到存儲(chǔ)器。當(dāng)處理器速度較高時(shí),由于計(jì)算所需的時(shí)間大大減少,限制因素變成處理器與存儲(chǔ)器交互所需的時(shí)間。雖然可以使用更快速的存儲(chǔ)器,然而使用大量非常高速的存儲(chǔ)器以滿足所有的計(jì)算機(jī)存儲(chǔ)器需求會(huì)非常不切實(shí)際和昂貴。有幸的是,矩陣乘法程序表現(xiàn)出高數(shù)據(jù)局部性,因?yàn)閮蓚€(gè)輸入數(shù)組中的每個(gè)的元素占據(jù)某個(gè)存儲(chǔ)器范圍內(nèi)的連續(xù)地址。因此,不是使用大量的非常高速的存儲(chǔ)器,而是使用少量的這種存儲(chǔ)器作為高速緩存。在程序開(kāi)始時(shí),來(lái)自主存儲(chǔ)器的輸入數(shù)組被傳遞到該高速緩存緩沖區(qū)。當(dāng)程序執(zhí)行時(shí),處理器從高速緩存獲取操作數(shù)并且將相應(yīng)結(jié)果回寫(xiě)到高速緩存。由于數(shù)據(jù)訪問(wèn)使用高速度的高速緩存,處理器能夠比使用主存儲(chǔ)器時(shí)更加快速地執(zhí)行程序。事實(shí)上,高速緩存的使用導(dǎo)致速度提高的程度幾乎就象升級(jí)了全部主存儲(chǔ)器一樣,不過(guò)是以顯著降低的成本。注意,僅當(dāng)數(shù)據(jù)局部性的假定成立時(shí)高速緩存系統(tǒng)才會(huì)見(jiàn)效;如果處理器必須頻繁地到高速緩存外部訪問(wèn)數(shù)據(jù),則高速緩存的速度優(yōu)勢(shì)會(huì)喪失。使用數(shù)據(jù)高速緩存的另一個(gè)問(wèn)題是“高速緩存一致性”。如上所述,數(shù)據(jù)通常被復(fù)制到高速緩存以允許進(jìn)行更快速訪問(wèn)。高速緩存中的每個(gè)數(shù)據(jù)是主存儲(chǔ)器中原始版本的相同副本。如果計(jì)算機(jī)內(nèi)的一個(gè)應(yīng)用程序訪問(wèn)主存儲(chǔ)器中的變量,同時(shí)另一個(gè)應(yīng)用程序訪問(wèn)高速緩存中的副本,則可能出現(xiàn)問(wèn)題。如果變量的任一版本以和另一個(gè)版本無(wú)關(guān)的方式發(fā)生改變,則高速緩存失去一致性,這可能產(chǎn)生有害結(jié)果。例如,如果變量是指向關(guān)鍵操作系統(tǒng)數(shù)據(jù)的指針,則可能發(fā)生致命錯(cuò)誤。為避免出現(xiàn)這種情況,必須監(jiān)視高速緩存的狀態(tài)。當(dāng)修改高速緩存中的數(shù)據(jù)時(shí),使主存儲(chǔ)器中的“陳舊”副本臨時(shí)無(wú)效,直到它們能夠被更新。因此,任何配備高速緩存的系統(tǒng)的一個(gè)重要方面是保持高速緩存一致性的過(guò)程。鑒于這些公知問(wèn)題和有益效果,已經(jīng)在因特網(wǎng)或?qū)S镁W(wǎng)絡(luò),包含所謂的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)中的各個(gè)位置上的數(shù)據(jù)處理系統(tǒng)內(nèi)實(shí)施了高速緩存。事實(shí)表明,Web業(yè)務(wù)非常適于高速緩存。大多數(shù)電子商務(wù)因特網(wǎng)業(yè)務(wù)包括從服務(wù)器發(fā)送到用戶而不是從用戶發(fā)送到服務(wù)器的數(shù)據(jù)。在大多數(shù)情況下,用戶向Web站點(diǎn)請(qǐng)求信息,而用戶向Web站點(diǎn)發(fā)送信息的情況相對(duì)很少。例如,用戶頻繁請(qǐng)求Web頁(yè)面,而相對(duì)很少提交存儲(chǔ)在Web站點(diǎn)上的個(gè)人信息或交易信息。因此,大多數(shù)的數(shù)據(jù)業(yè)務(wù)顯示出良好的高速緩存一致性特性。此外,因?yàn)橛脩敉谵D(zhuǎn)移到不同Web站點(diǎn)之前瀏覽和重新瀏覽單個(gè)Web站點(diǎn)的內(nèi)容達(dá)一定時(shí)間,大多數(shù)的數(shù)據(jù)業(yè)務(wù)顯示出良好的數(shù)據(jù)局部性特性。另外,許多用戶往往請(qǐng)求相同的信息,因而在某個(gè)位置高速緩存信息會(huì)比重復(fù)地從數(shù)據(jù)庫(kù)檢索該信息更加高效。另外,大多數(shù)Web應(yīng)用對(duì)數(shù)據(jù)的最新程度的要求相對(duì)寬松。例如,當(dāng)產(chǎn)品價(jià)格改變時(shí),此改變滯后幾分鐘生效是可接受的,即高速緩存一致性可以是不那么完美的,這一點(diǎn)也使高速緩存更有價(jià)值。下面的討論能夠大略說(shuō)明高速緩存Web內(nèi)容的有益效果。來(lái)自客戶端瀏覽器的每個(gè)請(qǐng)求可能流經(jīng)位于整個(gè)因特網(wǎng)中的多個(gè)數(shù)據(jù)處理系統(tǒng),例如防火墻、路由器和各種服務(wù)器,所述服務(wù)器的例子有中間服務(wù)器、呈現(xiàn)服務(wù)器(例如讀取靜態(tài)內(nèi)容、建立動(dòng)態(tài)頁(yè)面)、應(yīng)用服務(wù)器(例如檢索頁(yè)面數(shù)據(jù)、執(zhí)行更新)和后端服務(wù)器(例如數(shù)據(jù)庫(kù)、服務(wù)和傳統(tǒng)應(yīng)用)。所有這些處理階段具有相關(guān)的成本和性能考慮。如果根本沒(méi)有高速緩存,則所有請(qǐng)求一直流到呈現(xiàn)服務(wù)器,呈現(xiàn)服務(wù)器能夠滿足某些請(qǐng)求,因?yàn)樗鼈儾恍枰獎(jiǎng)討B(tài)內(nèi)容。不幸的是,許多請(qǐng)求還需要應(yīng)用服務(wù)器和后端服務(wù)器進(jìn)行處理以進(jìn)行更新或獲得動(dòng)態(tài)內(nèi)容頁(yè)面的數(shù)據(jù)。然而,請(qǐng)求只需要傳播其得到滿足所需要的那么遠(yuǎn),因而使用高速緩存,尤其是在應(yīng)用提供方的站點(diǎn)內(nèi),能夠提高性能。例如,中間服務(wù)器中的高速緩存可以滿足大多數(shù)請(qǐng)求,這樣只有少數(shù)請(qǐng)求傳播到呈現(xiàn)服務(wù)器。呈現(xiàn)服務(wù)器中的高速緩存可以處理某些到達(dá)呈現(xiàn)服務(wù)器的請(qǐng)求,這樣只有少數(shù)請(qǐng)求傳播到應(yīng)用服務(wù)器。由于應(yīng)用服務(wù)器通常是事務(wù)處理型的,在應(yīng)用服務(wù)器內(nèi)可以實(shí)現(xiàn)有限的高速緩存。然而總體上說(shuō),通過(guò)在應(yīng)用提供方的站點(diǎn)內(nèi)適度使用高速緩存,可以大大節(jié)省成本??紤]到高速緩存的優(yōu)勢(shì),可以使用高速緩存技術(shù)改進(jìn)包含動(dòng)態(tài)Web內(nèi)容的Web站點(diǎn)的響應(yīng)特性,而無(wú)需對(duì)服務(wù)器和其它硬件進(jìn)行如上所述的大的投資。然而,有關(guān)高速緩存適用性的主要考慮因素是Web內(nèi)容改變的頻率。一般地,當(dāng)訪問(wèn)速度增加而更新速度降低時(shí),高速緩存的實(shí)施變得可行。更具體地,當(dāng)用戶頻繁地從Web站點(diǎn)檢索靜態(tài)內(nèi)容并且很少發(fā)送要存儲(chǔ)在Web站點(diǎn)上的數(shù)據(jù)時(shí),Web內(nèi)容的高速緩存是可行的。然而,如果Web站點(diǎn)包括大量動(dòng)態(tài)內(nèi)容,則Web站點(diǎn)被內(nèi)在地構(gòu)造成其內(nèi)容頻繁改變。在這種情況下,Web站點(diǎn)內(nèi)高速緩存的更新速度顯著增加,從而消除了嘗試高速緩存Web站點(diǎn)的內(nèi)容的優(yōu)勢(shì)。已經(jīng)提出和/或?qū)崿F(xiàn)了用于高效高速緩存企業(yè)內(nèi)的動(dòng)態(tài)內(nèi)容的各種解決方案。這些在Web應(yīng)用服務(wù)器內(nèi)高速緩存Web內(nèi)容的技術(shù)明顯提高了吞吐量和響應(yīng)時(shí)間方面的性能。當(dāng)獲得在電子商務(wù)Web站點(diǎn)內(nèi)高速緩存動(dòng)態(tài)內(nèi)容的顯著優(yōu)點(diǎn)之后,在整個(gè)網(wǎng)絡(luò)本身實(shí)現(xiàn)協(xié)作高速緩存,即所謂的“分布式高速緩存”,會(huì)是有利的,因?yàn)樵诟咏脩舻奈恢酶咚倬彺鎯?nèi)容可在響應(yīng)時(shí)間或時(shí)延方面產(chǎn)生更加遠(yuǎn)為顯著的有益效果。然而,分布式高速緩存解決方案必須考慮公知的高速緩存問(wèn)題。不加選擇的布置和實(shí)施高速緩存會(huì)以不利于節(jié)省成本的方式提高性能。決定高速緩存效率的重要因素包括高速緩存大小、高速緩存命中路徑長(zhǎng)度(cachehitpathlength)、維護(hù)高速緩存內(nèi)容所需的工作量、以及數(shù)據(jù)請(qǐng)求方和數(shù)據(jù)位置之間的距離。在高速緩存的大小方面,存儲(chǔ)器和盤(pán)空間的大小不斷提高,但是它們從未大到不需要考慮其限制的程度。換言之,分布式高速緩存技術(shù)不應(yīng)該假定大量存儲(chǔ)器和盤(pán)空間可用于高速緩存,需要小的高速緩存通常比需要大的高速緩存更為可取。另外,存儲(chǔ)器和盤(pán)帶寬的提高速度慢于其大小的提高速度,并且任何高速緩存越來(lái)越大量的數(shù)據(jù)的嘗試均會(huì)最終受到帶寬因素的限制。在高速緩存命中路徑長(zhǎng)度方面,分布式高速緩存解決方案最好應(yīng)當(dāng)包括輕型運(yùn)行時(shí)應(yīng)用,該運(yùn)行時(shí)應(yīng)用可以被容易地部署,然而以最小處理量確定高速緩存命中,使得高速緩存命中的吞吐量非常大。分布式高速緩存應(yīng)用的期望形式不應(yīng)該與同樣在接近最終用戶的位置“高速緩存”數(shù)據(jù)的分布式應(yīng)用的其它形式相混淆。換言之,存在其它形式的、受益于將應(yīng)用的各個(gè)部分及其相關(guān)數(shù)據(jù)分布到整個(gè)因特網(wǎng)的許多方式中的一個(gè)的應(yīng)用。例如,整個(gè)應(yīng)用及其相關(guān)數(shù)據(jù)庫(kù)可以被復(fù)制到不同位置,并且進(jìn)行部署的企業(yè)隨后可以根據(jù)需要同步數(shù)據(jù)庫(kù)和維護(hù)應(yīng)用。在其它情況下,可以使用插件、JavaScriptTM或類似機(jī)制將應(yīng)用的只讀顯示部分及其相關(guān)數(shù)據(jù)分布到基于客戶端的瀏覽器,同時(shí)將業(yè)務(wù)邏輯保留在受保護(hù)的主機(jī)站點(diǎn)上。在維護(hù)高速緩存內(nèi)容所需的工作量方面,服務(wù)企業(yè)內(nèi)的高速緩存改進(jìn)了吞吐量或成本,即每秒處理的請(qǐng)求數(shù)量或所需服務(wù)器硬件的數(shù)量,因?yàn)槊總€(gè)請(qǐng)求需要完成的工作得到減少。在服務(wù)企業(yè)內(nèi),高速緩存的位置最好更接近企業(yè)的入口點(diǎn),因?yàn)檫@會(huì)降低企業(yè)內(nèi)任何系統(tǒng)的處理量,從而增加任何改進(jìn)。例如,接近分配器的高速緩存能夠比應(yīng)用服務(wù)器內(nèi)的高速緩存遠(yuǎn)為更加有效。服務(wù)企業(yè)內(nèi)的高速緩存在某種程度上增加了時(shí)延,但是這通常是次要的,因?yàn)榉?wù)企業(yè)內(nèi)的時(shí)延通常遠(yuǎn)小于因特網(wǎng)上的時(shí)延。對(duì)服務(wù)企業(yè)外部的健壯分布式高速緩存技術(shù)的考慮與這個(gè)和其它問(wèn)題相糾纏。在數(shù)據(jù)請(qǐng)求方和數(shù)據(jù)位置之間的距離方面,因特網(wǎng)中的用戶可見(jiàn)時(shí)延主要由用戶和內(nèi)容之間的距離決定。這個(gè)距離更大程度上由路由跳數(shù)而不是物理距離來(lái)確定。當(dāng)在諸如因特網(wǎng)服務(wù)提供商(ISP)的因特網(wǎng)的“邊界”上高速緩存內(nèi)容時(shí),顯著降低了用戶可見(jiàn)時(shí)延。對(duì)于大的內(nèi)容,例如多媒體文件,也可以顯著降低帶寬要求。健壯的分布式高速緩存解決方案應(yīng)當(dāng)嘗試在接近用戶的位置高速緩存數(shù)據(jù)。由于用戶在地理上是分散的,在接近用戶的位置高速緩存內(nèi)容意味著必須在整個(gè)因特網(wǎng)中的ISP和交換點(diǎn)(exchangepoint)的多個(gè)高速緩存中復(fù)制內(nèi)容。一般說(shuō)來(lái),這可以降低高速緩存機(jī)制對(duì)內(nèi)容安全性和內(nèi)容更新方式,即高速緩存一致性的控制。由于服務(wù)企業(yè)內(nèi)的高速緩存機(jī)制表面上在單個(gè)組織的控制下,所以能夠相對(duì)容易地維護(hù)服務(wù)企業(yè)內(nèi)的一致性高速緩存。然而,同時(shí)維護(hù)服務(wù)企業(yè)內(nèi)部和外部的高速緩存顯著增加了保證高速緩存一致性的難度和所需的工作量。雖然使用例如CDN的內(nèi)容發(fā)布商(其中在遠(yuǎn)為更加受控的網(wǎng)絡(luò)環(huán)境而不是公共因特網(wǎng)內(nèi)出租和維護(hù)高速緩存空間)能夠使安全性和一致性問(wèn)題最小化,然而這種解決方案事實(shí)上取消了在公共因特網(wǎng)中使用開(kāi)放式標(biāo)準(zhǔn)而獲得的某些優(yōu)勢(shì)。分布式高速緩存技術(shù)最好應(yīng)當(dāng)能夠適當(dāng)考慮企業(yè)邊界而實(shí)現(xiàn),并且還能夠以協(xié)作的方式在整個(gè)因特網(wǎng)中實(shí)現(xiàn)。另外,高速緩存應(yīng)當(dāng)可部署在可能被確定為必要的各種重要位置,例如在最終用戶附近(例如在客戶端瀏覽器中),在服務(wù)企業(yè)的分配器附近,在Web應(yīng)用服務(wù)器內(nèi),或它們之間的任何地方。此外,該技術(shù)應(yīng)當(dāng)遵從規(guī)范,使得不同組織能夠根據(jù)本地系統(tǒng)要求構(gòu)造分布式高速緩存規(guī)范的不同實(shí)現(xiàn)。以片段的形式編寫(xiě)和發(fā)布Web內(nèi)容的趨勢(shì)使有關(guān)任何可能健壯的分布式高速緩存解決方案的問(wèn)題復(fù)雜化了。一部分內(nèi)容被放置到一片段中,并且較大的內(nèi)容實(shí)體,例如Web頁(yè)面或其它文檔,由一些片段組成,盡管內(nèi)容實(shí)體也可以由單個(gè)片段組成。片段可以分別存儲(chǔ),并且隨后在需要時(shí)裝配到較大內(nèi)容實(shí)體中。這些運(yùn)行時(shí)的優(yōu)點(diǎn)被維護(hù)和使用片段的其它方面的復(fù)雜度所抵消。可以為片段分配不同的生存期,從而需要一致性無(wú)效機(jī)制。另外,雖然片段可以被用來(lái)分離內(nèi)容的靜態(tài)部分和內(nèi)容的動(dòng)態(tài)部分,使得靜態(tài)內(nèi)容可以被有效高速緩存,然而必須面臨上述涉及動(dòng)態(tài)內(nèi)容的高速緩存的問(wèn)題。最重要的是,片段裝配一直限于企業(yè)邊界內(nèi)的位置。因此,擁有支持片段和其它對(duì)象的高速緩存的健壯的分布式高速緩存技術(shù)會(huì)是有利的。此外,這樣的方式尤其有利,其中在整個(gè)網(wǎng)絡(luò)的諸高速緩存站點(diǎn)上協(xié)同定位片段裝配,并根據(jù)需要或多或少地考慮企業(yè)邊界,從而降低服務(wù)企業(yè)上的處理負(fù)載,并且在需要時(shí)實(shí)現(xiàn)分布式計(jì)算的附加益處。另外,這樣的方式會(huì)是有利的,其中使用一致的命名技術(shù),使得能夠在整個(gè)因特網(wǎng)中唯一地標(biāo)識(shí)片段,即能夠一致地維護(hù)分布式高速緩存。作為健壯分布式高速緩存解決方案的另一個(gè)問(wèn)題,任何可能的解決方案均應(yīng)當(dāng)考慮現(xiàn)有編程模型的問(wèn)題。例如,可能提出一種分布式高速緩存技術(shù),其需要用與該分布式高速緩存技術(shù)協(xié)同工作的新編程模型來(lái)替換現(xiàn)有的Web應(yīng)用服務(wù)器的編程模型。最好是分布式高速緩存技術(shù)的實(shí)現(xiàn)會(huì)適應(yīng)各種編程模型,從而避免在編程模型中間有任何偏袒。這樣的方式會(huì)是有利的,其中分布式高速緩存技術(shù)的實(shí)現(xiàn)導(dǎo)致降低的片段高速緩存大小,這種降低的高速緩存大小可以由輕型過(guò)程在整個(gè)因特網(wǎng)中以標(biāo)準(zhǔn)方式極少考慮高速緩存位置地維護(hù)。另外,分布式高速緩存技術(shù)兼容于現(xiàn)有編程模型和因特網(wǎng)標(biāo)準(zhǔn)會(huì)尤其有利,這樣分布式高速緩存技術(shù)的實(shí)現(xiàn)能夠與還沒(méi)有實(shí)施分布式高速緩存技術(shù)的其它系統(tǒng)互操作。
發(fā)明內(nèi)容根據(jù)第一方面,本發(fā)明提供了一種用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)上處理對(duì)象的方法,該方法包括在計(jì)算設(shè)備上接收第一消息;和確定第一消息中的消息頭指示第一消息涉及一片段。根據(jù)第二方面,本發(fā)明提供了一種用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)上處理對(duì)象的設(shè)備,該設(shè)備包括用于在計(jì)算設(shè)備上接收第一消息的裝置;和用于確定第一消息中的消息頭指示第一消息涉及片段的裝置。根據(jù)第三方面,本發(fā)明提供了計(jì)算機(jī)可讀介質(zhì)中的用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)中處理對(duì)象的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括用于在計(jì)算設(shè)備上接收第一消息的指令;和用于確定第一消息中的消息頭指示第一消息涉及片段的指令。最好還確定第一消息中的消息頭指示第一消息的消息體部分是片段。來(lái)自第一消息的片段最好被存儲(chǔ)在由計(jì)算設(shè)備內(nèi)的高速緩存管理單元維護(hù)的高速緩存中,其中高速緩存管理單元同等地運(yùn)行來(lái)支持片段高速緩存操作,無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)中的客戶機(jī)、服務(wù)器還是集線器。最好還確定第一消息中的消息頭指示片段是可高速緩存的。在這種情況下,可選地,第一消息具有表明片段不可高速緩存到不支持片段的高速緩存管理單元的指示,和表明片段可高速緩存到支持片的段高速緩存管理單元的指示。例如,第一消息具有HTTPCache-Control(高速緩存控制)頭,此Cache-Control頭具有針對(duì)不支持片段的高速緩存管理單元的不高速緩存指令和針對(duì)支持片段的高速緩存管理單元的進(jìn)行片段高速緩存的指令。如果在計(jì)算設(shè)備上接收到第二消息,其中第二消息包括對(duì)所述片段的請(qǐng)求,則最好搜索高速緩存并且從高速緩存獲取片段。接著通過(guò)第三消息向第二消息的發(fā)起方發(fā)送片段,而無(wú)需向其目的地址發(fā)送第二消息??蛇x地,第二消息包含指示在返回第三消息之前不必在計(jì)算設(shè)備上進(jìn)行頁(yè)面裝配操作的信息??蛇x地,第二消息具有這樣的消息頭,其具有指示第三消息會(huì)被具有支持片段的高速緩存管理單元的第二計(jì)算設(shè)備接收的指令。最好在發(fā)送第三消息之前在計(jì)算設(shè)備上執(zhí)行頁(yè)面裝配操作。最好在計(jì)算設(shè)備上執(zhí)行頁(yè)面裝配操作以形成裝配的片段。例如,確定片段是否是包含針對(duì)下一級(jí)片段的鏈接的最高級(jí)片段。接著在確定片段是包含針對(duì)下一級(jí)片段的鏈接的最高級(jí)片段時(shí)獲取下一級(jí)片段。最終,最高級(jí)片段和下一級(jí)片段被合并成裝配的片段??蛇x地,下一級(jí)片段的內(nèi)容被嵌入到最高級(jí)片段的內(nèi)容中。此外,可以根據(jù)最高級(jí)片段的屬性值和下一級(jí)片段的屬性值產(chǎn)生裝配的片段的屬性值。另外,可以根據(jù)最高級(jí)片段的頭值或指令和下一級(jí)片段的頭值或指令計(jì)算裝配的片段的頭值或指令。最好產(chǎn)生包含裝配的片段的第四消息,其中第四消息是HTTP(超文本傳輸協(xié)議)應(yīng)答消息。最好為最高級(jí)片段和下一級(jí)片段確定最短到期時(shí)間,并且在第四消息中將“Expires”(到期)頭設(shè)定為該最短到期時(shí)間。可選地,為最高級(jí)片段和下一級(jí)片段確定它們中最小的最大有效期,并且在第四消息中將“Cache-Control:max-age”(高速緩存控制最大有效期)指令設(shè)定為該最小的最大有效期??蛇x地,為最高級(jí)片段和下一級(jí)片段計(jì)算內(nèi)容長(zhǎng)度值的和,并且在第四消息中將“Content-Length”(內(nèi)容長(zhǎng)度)頭設(shè)定為該內(nèi)容長(zhǎng)度值的和。可選地,為最高級(jí)片段和下一級(jí)片段確定最近修改時(shí)間,并且在第四消息中將“Last-Modified”(最近修改)頭設(shè)定為該最近修改時(shí)間??蛇x地,從第一消息獲取一組依賴關(guān)系標(biāo)識(shí)符,其中依賴關(guān)系標(biāo)識(shí)符是由發(fā)出片段的服務(wù)器產(chǎn)生的,并且以和該片段的源標(biāo)識(shí)符相關(guān)聯(lián)的方式存儲(chǔ)該組依賴關(guān)系標(biāo)識(shí)符。在這種情況下,可選地,可以接收一無(wú)效請(qǐng)求消息,從該無(wú)效請(qǐng)求消息中獲得一依賴關(guān)系標(biāo)識(shí)符。這使得能夠確定與該依賴關(guān)系標(biāo)識(shí)符相關(guān)的一組片段,并且因此可以從高速緩存中清除所確定的該組片段。最好可根據(jù)第一消息確定一組片段高速緩存規(guī)則,并且根據(jù)片段高速緩存規(guī)則產(chǎn)生片段的高速緩存標(biāo)識(shí)符。在這種情況下,例如,可以使用高速緩存標(biāo)識(shí)符來(lái)唯一標(biāo)識(shí)片段。進(jìn)一步地,可以使用所產(chǎn)生的、片段的高速緩存標(biāo)識(shí)符執(zhí)行存儲(chǔ)操作??蛇x地,獲得與片段相關(guān)的URI(統(tǒng)一資源標(biāo)識(shí)符)的至少一路徑部分以形成基礎(chǔ)高速緩存標(biāo)識(shí)符,并且一片段高速緩存規(guī)則被施加到基礎(chǔ)高速緩存標(biāo)識(shí)符以形成片段的高速緩存標(biāo)識(shí)符,其中片段高速緩存規(guī)則包括一組被用來(lái)獲得附加到基礎(chǔ)高速緩存標(biāo)識(shí)符上的名稱-值對(duì)的查詢參數(shù)名和/或cookie名。根據(jù)第四方面,本發(fā)明提供了一種用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)上處理對(duì)象的方法,該方法包括在服務(wù)器上接收請(qǐng)求消息,其中請(qǐng)求消息包括片段的源標(biāo)識(shí)符;產(chǎn)生包括片段的應(yīng)答消息;以及在應(yīng)答消息中插入指示請(qǐng)求消息涉及片段的消息頭。根據(jù)第五方面,本發(fā)明提供了一種用于在網(wǎng)絡(luò)的數(shù)據(jù)處理系統(tǒng)上處理對(duì)象的設(shè)備,該設(shè)備包括用于在服務(wù)器上接收請(qǐng)求消息的裝置,其中請(qǐng)求消息包括片段的源標(biāo)識(shí)符;用于產(chǎn)生包括片段的應(yīng)答消息的裝置;以及用于在應(yīng)答消息中插入指示請(qǐng)求消息涉及片段的消息頭的裝置。根據(jù)第六方面,本發(fā)明提供了計(jì)算機(jī)可讀介質(zhì)中的用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)中處理對(duì)象的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括用于在服務(wù)器上接收請(qǐng)求消息的指令,其中該請(qǐng)求消息包括片段的源標(biāo)識(shí)符;用于產(chǎn)生包括片段的應(yīng)答消息的指令;以及用于在應(yīng)答消息中插入指示第一消息涉及片段的消息頭的指令。指示應(yīng)答消息的消息體部分是片段的消息頭最好被插入到應(yīng)答消息中,以作為指示應(yīng)答消息的消息體部分是片段的消息頭。指示片段可高速緩存的消息頭最好被插入到應(yīng)答消息中。指示片段不可高速緩存到不支持片段的高速緩存管理單元,以及指示片段可以高速緩存到支持片段的高速緩存管理單元的消息頭最好被插入到應(yīng)答消息中。根據(jù)第七方面,本發(fā)明提供一種被計(jì)算設(shè)備用來(lái)定義通過(guò)網(wǎng)絡(luò)發(fā)送的消息的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包括表明消息是請(qǐng)求消息或應(yīng)答消息的指示符;和片段頭,其包括指示消息將被支持片段的高速緩存管理單元處理的關(guān)鍵字,和指示處理消息的方式的一或多個(gè)片段頭指令。無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)中的客戶機(jī)、服務(wù)器還是集線器,支持片段的高速緩存管理單元最好位于計(jì)算設(shè)備內(nèi),并且同等地運(yùn)行來(lái)支持片段高速緩存操作。所要求保護(hù)的數(shù)據(jù)結(jié)構(gòu)最好還具有這樣的片段頭指令,其用于包含在請(qǐng)求消息中,以指示處理了請(qǐng)求消息的計(jì)算設(shè)備具有支持片段的高速緩存管理單元。該數(shù)據(jù)結(jié)構(gòu)最好具有這樣的片段頭指令,其用于包含在應(yīng)答消息中以指示一組依賴關(guān)系標(biāo)識(shí)符,該組依賴關(guān)系標(biāo)識(shí)符被原始服務(wù)器用來(lái)從由支持片段的高速緩存管理單元所維護(hù)的高速緩存中清除應(yīng)答消息內(nèi)的片段。數(shù)據(jù)結(jié)構(gòu)最好具有這樣的片段頭指令,其用于包含在應(yīng)答消息中以指示一組片段高速緩存規(guī)則,所述規(guī)則被用來(lái)形成唯一標(biāo)識(shí)應(yīng)答消息中的片段的高速緩存標(biāo)識(shí)符。可選地,請(qǐng)求消息或應(yīng)答消息是HTTP(超文本傳送協(xié)議)請(qǐng)求消息或HTTP應(yīng)答消息。根據(jù)第八方面,本發(fā)明提供了被計(jì)算設(shè)備用來(lái)定義內(nèi)容對(duì)象的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包括用于一標(biāo)記語(yǔ)言元素的一組定界符;用于指示該標(biāo)記語(yǔ)言元素是針對(duì)一片段的鏈接的關(guān)鍵字;和該片段的源標(biāo)識(shí)符,其中該源標(biāo)識(shí)符被支持片段的高速緩存管理單元用來(lái)獲得該片段。無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)的客戶機(jī)、服務(wù)器還是集線器,支持片段的高速緩存管理單元最好位于計(jì)算設(shè)備內(nèi),并且同等地運(yùn)行來(lái)支持片段高速緩存操作。該數(shù)據(jù)結(jié)構(gòu)最好具有該片段的一替代源標(biāo)識(shí)符,其中該替代源標(biāo)識(shí)符可以被支持片段的高速緩存管理單元用來(lái)獲得該片段。數(shù)據(jù)結(jié)構(gòu)最好具有一組附加到源標(biāo)識(shí)符上的查詢參數(shù)。標(biāo)記語(yǔ)言最好是SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)。標(biāo)記語(yǔ)言元素最好兼容于HTML(超文本標(biāo)記語(yǔ)言)。提供了用于片段高速緩存的一種方法、系統(tǒng)、設(shè)備和計(jì)算機(jī)程序產(chǎn)品。當(dāng)在包含高速緩存管理單元的計(jì)算設(shè)備上接收到消息之后,高速緩存該消息的消息體中的片段。對(duì)高速緩存管理單元上片段的后續(xù)請(qǐng)求產(chǎn)生高速緩存命中。無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)中的客戶機(jī)、服務(wù)器還是集線器,高速緩存管理單元同等地運(yùn)行來(lái)支持片段高速緩存操作。換言之,片段高速緩存技術(shù)在整個(gè)網(wǎng)絡(luò)中是統(tǒng)一的。定義了FRAGMENT(片段)頭,以被用于例如HTTP的網(wǎng)絡(luò)協(xié)議內(nèi);該頭使元數(shù)據(jù)與片段相關(guān)聯(lián),以用于涉及片段的處理和高速緩存的各種目的。高速緩存ID(標(biāo)識(shí)符)規(guī)則伴隨來(lái)自原始服務(wù)器的片段;高速緩存ID規(guī)則描述用于形成片段的唯一高速緩存ID,以使動(dòng)態(tài)內(nèi)容能夠在遠(yuǎn)離原始服務(wù)器的位置被高速緩存的方法。高速緩存ID可以基于片段的URI(統(tǒng)一資源標(biāo)識(shí)符),但是高速緩存ID也可以基于查詢參數(shù)和/或cookie??梢詫⒉煌谄蔚母咚倬彺鍵D或URI的依賴關(guān)系ID與片段相關(guān)聯(lián),使得服務(wù)器可以啟動(dòng)從高速緩存中清除片段的無(wú)效操作。FRAGMENTLINK(片段鏈接)標(biāo)簽被用來(lái)規(guī)定在頁(yè)面裝配或頁(yè)面呈現(xiàn)期間將插入的所包含片段在頁(yè)面中的位置?,F(xiàn)在參照本發(fā)明的如附圖所示的優(yōu)選實(shí)施例僅僅示例性地描述本發(fā)明,其中圖1A描述了其中可以實(shí)現(xiàn)本發(fā)明的優(yōu)選實(shí)施例的典型分布式數(shù)據(jù)處理系統(tǒng);圖1B描述了可以在能夠?qū)崿F(xiàn)本發(fā)明的優(yōu)選實(shí)施例的數(shù)據(jù)處理系統(tǒng)中使用的典型計(jì)算機(jī)體系結(jié)構(gòu);圖1C描述了其中在該整個(gè)分布式數(shù)據(jù)處理系統(tǒng)中實(shí)現(xiàn)了高速緩存的典型分布式數(shù)據(jù)處理系統(tǒng);圖2圖解了由片段組成的典型Web頁(yè)面;圖3是根據(jù)本發(fā)明優(yōu)選實(shí)施例的FRAGMENTLINK標(biāo)簽的形式化標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言(SGML)定義;圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例的FRAGMENT頭的形式定義;圖5A-5G描述了對(duì)象獲取路徑上的一組支持片段和不支持片段的代理;圖6A描述了計(jì)算設(shè)備內(nèi)用于支持片段的高速緩存的高速緩存管理單元;圖6B的流程圖描述了可以被支持片段的高速緩存管理單元在處理包含片段的應(yīng)答消息時(shí)使用的過(guò)程;圖6C的流程圖步驟描述了用于確定消息體是否包含片段對(duì)象的優(yōu)選方法;圖6D的流程圖步驟描述了用于確定片段對(duì)象是否可高速緩存的更加具體的方法;圖6E的流程圖步驟描述了用于確定片段對(duì)象是否可高速緩存的優(yōu)選方法;圖6F的流程圖描述了用于確定在特定計(jì)算設(shè)備上是否應(yīng)當(dāng)高速緩存一片段對(duì)象的方法;圖6G的流程圖步驟描述了用于確定下游設(shè)備是否具有支持片段的高速緩存的優(yōu)選方法;圖6H的流程圖步驟描述了用于確定當(dāng)前正在處理的片段對(duì)象是否應(yīng)當(dāng)只高速緩存在最接近目標(biāo)用戶/客戶端設(shè)備的支持片段的高速緩存中的更加特定的方法;圖6I的流程圖步驟描述了用于確定當(dāng)前正在處理的片段對(duì)象是否應(yīng)當(dāng)只高速緩存在接近目標(biāo)用戶/客戶端設(shè)備的支持片段的高速緩存中的優(yōu)選方法;圖6J的流程圖描述了用于確定在從當(dāng)前計(jì)算設(shè)備返回應(yīng)答消息之前是否需要進(jìn)行頁(yè)面裝配的方法;圖6K的流程圖步驟描述了用于確定當(dāng)前正在處理的片段對(duì)象是否具有針對(duì)另一個(gè)片段的鏈接的更加具體的方法;圖6L的流程圖步驟描述了用于確定當(dāng)前正在處理的片段對(duì)象是否具有針對(duì)另一個(gè)片段的鏈接的另一方法;圖6M的流程圖描述了用于執(zhí)行頁(yè)面裝配的過(guò)程;圖6N的流程圖描述了用于可選地將片段鏈接擴(kuò)展為多個(gè)片段鏈接的過(guò)程;圖6O的流程圖步驟描述了用于確定來(lái)自應(yīng)答消息的當(dāng)前片段中的片段鏈接是否指示其應(yīng)當(dāng)擴(kuò)展為多個(gè)片段鏈接的優(yōu)選方法;圖6P的流程圖描述了用于根據(jù)與片段鏈接相關(guān)的信息將片段鏈接擴(kuò)展為多個(gè)片段鏈接的過(guò)程;圖6Q的流程圖描述了用于使用片段的源標(biāo)識(shí)符獲得片段的過(guò)程;圖6R的流程圖描述了當(dāng)在支持片段的高速緩存管理單元內(nèi)高速緩存片段時(shí)執(zhí)行的某些處理;圖6S的流程圖描述了在片段被高速緩存在包含支持片段的高速緩存管理單元的計(jì)算設(shè)備上的情況下由該高速緩存管理單元用來(lái)獲得該片段的過(guò)程;圖6T的流程圖描述了用于組合與多個(gè)片段相關(guān)的頭值和屬性值的過(guò)程;圖6U的流程圖描述了代表一系列針對(duì)頭類型和屬性值的組合函數(shù)的一組步驟;圖6V的流程圖描述了可以由支持片段的高速緩存管理單元在處理請(qǐng)求消息時(shí)使用的過(guò)程;圖6W的流程圖描述了可以由支持片段的高速緩管理單元在根據(jù)本發(fā)明優(yōu)選實(shí)施例的實(shí)施方式處理無(wú)效消息時(shí)使用的過(guò)程;圖7A的方塊圖描述了Web應(yīng)用服務(wù)器和客戶機(jī)之間的某些數(shù)據(jù)流,以說(shuō)明某些高速緩存執(zhí)行片段裝配的時(shí)機(jī);圖7B的方塊圖描述了Web應(yīng)用服務(wù)器和客戶機(jī)之間的某些數(shù)據(jù)流,以說(shuō)明一組設(shè)備如何能夠被命令將片段高速緩存在最接近最終用戶或客戶端設(shè)備的高速緩存中;圖8A-8D的數(shù)據(jù)流圖例描述了在客戶機(jī)、中間的支持片段的高速緩存或服務(wù)器內(nèi)發(fā)生的某些處理步驟,以說(shuō)明能夠使用本發(fā)明的優(yōu)選實(shí)施例實(shí)現(xiàn)特定于角色或特定于類別的動(dòng)態(tài)內(nèi)容的高速緩存;圖9A的流程圖描述了能夠用來(lái)在單個(gè)請(qǐng)求消息中指定多個(gè)片段并且隨后處理所述片段的過(guò)程;圖9B的流程圖描述了能夠用來(lái)在中間高速緩存管理單元處接收并且隨后處理單個(gè)請(qǐng)求消息的過(guò)程;圖9C的流程圖描述了Web應(yīng)用服務(wù)器上用于處理多個(gè)片段的批請(qǐng)求消息的過(guò)程;圖10A-10D是一組例子,其示出了能夠通過(guò)本發(fā)明的優(yōu)選實(shí)施例實(shí)現(xiàn)的高速緩存大小的有利降低;以及圖11A-11H是一系列圖例,其說(shuō)明了本發(fā)明優(yōu)選實(shí)施例的技術(shù)構(gòu)造和使用唯一高速緩存標(biāo)識(shí)符以存儲(chǔ)和處理片段的方式。具體實(shí)施例方式本發(fā)明涉及分布式片段高速緩存技術(shù)。通常,可以包括或涉及本發(fā)明優(yōu)選實(shí)施例的設(shè)備包含多種數(shù)據(jù)處理技術(shù)。因此,在更詳細(xì)地描述本發(fā)明優(yōu)選實(shí)施例之前,作為背景資料,描述分布式數(shù)據(jù)處理系統(tǒng)內(nèi)的硬件和軟件部件的典型組織?,F(xiàn)在參照附圖,圖1A描述了數(shù)據(jù)處理系統(tǒng)的典型網(wǎng)絡(luò),每個(gè)數(shù)據(jù)處理系統(tǒng)可以實(shí)現(xiàn)本發(fā)明優(yōu)選實(shí)施例的某個(gè)方面。分布式數(shù)據(jù)處理系統(tǒng)100包含網(wǎng)絡(luò)101,網(wǎng)絡(luò)101是可以被用來(lái)在一起連接到分布式數(shù)據(jù)處理系統(tǒng)100內(nèi)的各種設(shè)備和計(jì)算機(jī)之間提供通信鏈路的介質(zhì)。網(wǎng)絡(luò)101可以包含例如電線或光纖光纜的固定連接,或通過(guò)電話或無(wú)線通信連接建立的臨時(shí)連接。在描述的例子中,服務(wù)器102、服務(wù)器103和存儲(chǔ)部件104一起被連接到網(wǎng)絡(luò)101。另外,客戶機(jī)105-107也連接到網(wǎng)絡(luò)101??蛻魴C(jī)105-107和服務(wù)器102-103可以表現(xiàn)為各種計(jì)算設(shè)備,例如大型機(jī)、個(gè)人計(jì)算機(jī)、個(gè)人數(shù)字助理(PDA)等等。分布式數(shù)據(jù)處理系統(tǒng)100可以包含其他的服務(wù)器、客戶機(jī)、路由器、其它設(shè)備和端到端體系結(jié)構(gòu)(未示出)。應(yīng)當(dāng)注意,圖1A示出的分布式數(shù)據(jù)處理系統(tǒng)被考慮成完全能夠支持各種端到端子網(wǎng)和端到端服務(wù)。在描述的例子中,分布式數(shù)據(jù)處理系統(tǒng)100可以包含因特網(wǎng),其中網(wǎng)絡(luò)101代表使用各種協(xié)議彼此通信的網(wǎng)絡(luò)和網(wǎng)關(guān)的全球集合,所述協(xié)議例如是輕量級(jí)目錄訪問(wèn)協(xié)議(LDAP)、傳送控制協(xié)議/網(wǎng)際協(xié)議(TCP/IP)、超文本傳輸協(xié)議(HTTP)、無(wú)線應(yīng)用協(xié)議(WAP)等等。當(dāng)然,分布式數(shù)據(jù)處理系統(tǒng)100也可以包含若干不同類型的網(wǎng)絡(luò),例如內(nèi)部網(wǎng)、局域網(wǎng)(LAN)、無(wú)線LAN或廣域網(wǎng)(WAN)。例如,服務(wù)器102直接支持客戶機(jī)109和引入無(wú)線通信鏈路的網(wǎng)絡(luò)110。啟用網(wǎng)絡(luò)的電話111通過(guò)無(wú)線鏈路112連接到網(wǎng)絡(luò)110,并且PDA113通過(guò)無(wú)線鏈路114連接到網(wǎng)絡(luò)110。電話111和PDA113也可以使用適當(dāng)?shù)募夹g(shù),例如BluetoothTM無(wú)線技術(shù),通過(guò)無(wú)線鏈路115直接在其之間傳遞數(shù)據(jù),以創(chuàng)建所謂的個(gè)人局域網(wǎng)(PAN)或個(gè)人臨時(shí)網(wǎng)絡(luò)(personalad-hocnetwork)。以類似的方式,PDA113可以通過(guò)無(wú)線通信鏈路116向PDA107傳遞數(shù)據(jù)。本發(fā)明的優(yōu)選實(shí)施例可以在各種硬件平臺(tái)上實(shí)現(xiàn);圖1A被作為異類計(jì)算環(huán)境的一個(gè)例子并且不作為對(duì)本發(fā)明的結(jié)構(gòu)限制。應(yīng)當(dāng)注意,后續(xù)例子具體參照了與服務(wù)器類型的功能相對(duì)的客戶機(jī)類型的功能。然而如所公知的那樣,某些計(jì)算設(shè)備同時(shí)表現(xiàn)出客戶機(jī)類型的功能和服務(wù)器類型的功能,例如對(duì)等網(wǎng)絡(luò)內(nèi)的集線器或計(jì)算設(shè)備,即對(duì)等設(shè)備。本發(fā)明的優(yōu)選實(shí)施例能夠根據(jù)需要在客戶機(jī)、服務(wù)器、對(duì)等設(shè)備或集線器上實(shí)現(xiàn)?,F(xiàn)在參照?qǐng)D1B,該圖例描述了如圖1A所示的、可以實(shí)現(xiàn)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)處理系統(tǒng)的典型計(jì)算機(jī)體系結(jié)構(gòu)。數(shù)據(jù)處理系統(tǒng)120包含連接到內(nèi)部系統(tǒng)總線123的一或多個(gè)中央處理單元(CPU)122,所述內(nèi)部系統(tǒng)總線123互連了隨機(jī)存取存儲(chǔ)器(RAM)124、只讀存儲(chǔ)器126和輸入/輸出適配器128,輸入/輸出適配器128支持各種I/O設(shè)備,例如打印機(jī)130、盤(pán)單元132或諸如音頻輸出系統(tǒng)等未示出的其它設(shè)備。系統(tǒng)總線123還連接提供對(duì)通信鏈路136的訪問(wèn)的通信適配器134。用戶接口適配器148連接各種用戶設(shè)備,例如鍵盤(pán)140、鼠標(biāo)或諸如觸摸屏、輸入筆或話筒等未示出的其它設(shè)備。顯示適配器144將系統(tǒng)總線123連接到顯示器146。本領(lǐng)域的普通技術(shù)人員會(huì)理解,可以根據(jù)系統(tǒng)實(shí)現(xiàn)方式改變圖1B中的硬件。例如,系統(tǒng)可以具有一或多個(gè)處理器,例如基于IntelPentium的處理器和數(shù)字信號(hào)處理器(DSP),以及一或多個(gè)類型的易失和非易失存儲(chǔ)器。也可以使用其它外圍設(shè)備補(bǔ)充或取代圖1B中描述的硬件。換言之,本領(lǐng)域的普通技術(shù)人員會(huì)期望在啟用Web的或啟用網(wǎng)絡(luò)的電話內(nèi)以及在全功能的臺(tái)式工作站內(nèi)發(fā)現(xiàn)某些類似部件或體系結(jié)構(gòu)。所描述的例子并不意味著對(duì)本發(fā)明的優(yōu)選實(shí)施例有結(jié)構(gòu)性限制。除了能夠在各種硬件平臺(tái)上實(shí)現(xiàn)之外,本發(fā)明的優(yōu)選實(shí)施例可以在各種軟件環(huán)境中實(shí)現(xiàn)。典型的操作系統(tǒng)可以被用來(lái)在每個(gè)數(shù)據(jù)處理系統(tǒng)內(nèi)控制程序執(zhí)行。例如,一個(gè)設(shè)備可以運(yùn)行Linux操作系統(tǒng),而另一個(gè)設(shè)備包含簡(jiǎn)單的Java運(yùn)行時(shí)環(huán)境。典型的計(jì)算機(jī)平臺(tái)可以包含瀏覽器,瀏覽器是公知的軟件應(yīng)用,用于訪問(wèn)具有各種格式和編碼的文件、文檔、對(duì)象或其它數(shù)據(jù)項(xiàng),所述格式和編碼例如是圖形文件、字處理文件、可擴(kuò)展標(biāo)記語(yǔ)言(XML)、超文本標(biāo)記語(yǔ)言(HTML)、手持設(shè)備標(biāo)記語(yǔ)言(HDML)、無(wú)線標(biāo)記語(yǔ)言(WML)。通常使用統(tǒng)一資源標(biāo)識(shí)符(URI)尋址這些對(duì)象。URI的集合包括統(tǒng)一資源定位符(URL)和統(tǒng)一資源名稱(URN)。現(xiàn)在參照?qǐng)D1C,該圖例描述了如圖1A所示的典型分布式數(shù)據(jù)處理系統(tǒng),其中在整個(gè)分布式數(shù)據(jù)處理系統(tǒng)中實(shí)現(xiàn)了高速緩存。分布式數(shù)據(jù)處理系統(tǒng)150包含產(chǎn)生對(duì)內(nèi)容的請(qǐng)求的請(qǐng)求實(shí)體152。請(qǐng)求實(shí)體152可以是ISP,其服務(wù)于將所請(qǐng)求的內(nèi)容用于各種目的的各種個(gè)人或機(jī)構(gòu)客戶或企業(yè)。當(dāng)數(shù)據(jù),例如一個(gè)請(qǐng)求從請(qǐng)求實(shí)體(使用實(shí)體)傳送到應(yīng)答實(shí)體(服務(wù)實(shí)體,例如原始服務(wù)器)時(shí),數(shù)據(jù)被描述為“上行”傳送。當(dāng)數(shù)據(jù),例如一個(gè)應(yīng)答從應(yīng)答實(shí)體傳送到接收實(shí)體,數(shù)據(jù)被描述為“下行”傳送。來(lái)自客戶端瀏覽器154的請(qǐng)求被分配器156路由,分配器156通過(guò)一組中間服務(wù)器158均勻地分配請(qǐng)求,以求在因特網(wǎng)交換點(diǎn)160處將請(qǐng)求轉(zhuǎn)發(fā)通過(guò)因特網(wǎng)之前滿足請(qǐng)求。每個(gè)瀏覽器154可以維持本地高速緩存,而每個(gè)服務(wù)器158支持正向代理高速緩存機(jī)制。因特網(wǎng)交換點(diǎn)160也包含中間服務(wù)器162和164,其每個(gè)可以維護(hù)高速緩存。在瀏覽器154或中間服務(wù)器158、160、162和164中實(shí)現(xiàn)高速緩存的各種考慮因素包含改進(jìn)響應(yīng)時(shí)間和/或降低帶寬。請(qǐng)求接著被從因特網(wǎng)交換點(diǎn)160路由到服務(wù)企業(yè)168中的分配器166。分配器166通過(guò)中間服務(wù)器170均勻分配傳入請(qǐng)求,其中,中間服務(wù)器170嘗試在轉(zhuǎn)遞請(qǐng)求到分配器172之前滿足請(qǐng)求;每個(gè)中間服務(wù)器170支持反向代理高速緩存機(jī)制。由分配器172在Web應(yīng)用服務(wù)器174中均勻分配未滿足的請(qǐng)求,Web應(yīng)用服務(wù)器174能夠結(jié)合數(shù)據(jù)庫(kù)服務(wù)或訪問(wèn)數(shù)據(jù)庫(kù)176的其它應(yīng)用來(lái)最終滿足請(qǐng)求。在中間服務(wù)器170或Web應(yīng)用服務(wù)器174中實(shí)現(xiàn)高速緩存的各種考慮因素包含提高吞吐量和/或降低成本。在從服務(wù)企業(yè)到客戶端設(shè)備的相反方向路由應(yīng)答。應(yīng)當(dāng)注意,可以在使用企業(yè)內(nèi)、整個(gè)因特網(wǎng)中、或服務(wù)企業(yè)內(nèi)部署類似的中間服務(wù)器。還應(yīng)當(dāng)注意,離開(kāi)客戶機(jī)的、借以傳遞請(qǐng)求的每個(gè)相繼階段均增加了所感知的響應(yīng)時(shí)間。本發(fā)明的優(yōu)選實(shí)施例可以在各種如上所述的硬件和軟件平臺(tái)上實(shí)現(xiàn)。然而更具體地,本發(fā)明的優(yōu)選實(shí)施例是針對(duì)分布式片段高速緩存技術(shù)。但在更詳細(xì)地描述本發(fā)明的優(yōu)選實(shí)施例之前,簡(jiǎn)要提供有關(guān)靜態(tài)和動(dòng)態(tài)Web內(nèi)容的某些背景信息。包含靜態(tài)文本和圖形內(nèi)容的Web頁(yè)面的格式通常使用標(biāo)記語(yǔ)言例如HTML來(lái)規(guī)定。標(biāo)記由特殊代碼或標(biāo)簽構(gòu)成,這些代碼或標(biāo)簽在因特網(wǎng)瀏覽器讀取頁(yè)面時(shí)控制文字和圖象的顯示。然而,Java服務(wù)器頁(yè)面(JSP)和小服務(wù)程序(servlet)更適于包含動(dòng)態(tài)內(nèi)容的Web頁(yè)面?;旧希琂SP是具有嵌入指令的標(biāo)記語(yǔ)言文檔,所述指令描述如何處理頁(yè)面請(qǐng)求以產(chǎn)生包含該頁(yè)面的應(yīng)答。該描述混合了靜態(tài)模板內(nèi)容和被實(shí)現(xiàn)為單個(gè)文檔內(nèi)的Java代碼的動(dòng)態(tài)操作。通過(guò)使用JSP,也可以將Java代碼內(nèi)嵌(in-line)到頁(yè)面中以作為服務(wù)器端小腳本(scriptlet)。換言之,Java標(biāo)簽被在Web頁(yè)面上指定,并且在Web服務(wù)器上運(yùn)行以便在Web頁(yè)面被發(fā)送到發(fā)出請(qǐng)求的用戶之前修改它。當(dāng)編程邏輯相對(duì)較小時(shí),這種方案是適當(dāng)?shù)?。只要在?biāo)記語(yǔ)言文檔內(nèi)有超過(guò)微小數(shù)量的編程邏輯,就會(huì)喪失JSP的優(yōu)勢(shì)將文檔的呈現(xiàn)與和文檔相關(guān)的業(yè)務(wù)邏輯相分離。為避免在標(biāo)記語(yǔ)言文檔中直接內(nèi)嵌過(guò)量的代碼,JSP啟用了將業(yè)務(wù)邏輯隔離到能夠在運(yùn)行時(shí)使用簡(jiǎn)單的JSP標(biāo)簽訪問(wèn)的JavaBean中的能力。更具體地,JSP使用類似標(biāo)記的標(biāo)簽和使用Java編程語(yǔ)言編寫(xiě)的小腳本來(lái)封裝產(chǎn)生頁(yè)面的某些或所有內(nèi)容的邏輯。應(yīng)用邏輯可以駐留在基于服務(wù)器的資源,例如JavaBean組件中,其中頁(yè)面通過(guò)這些標(biāo)簽和小腳本訪問(wèn)該資源。標(biāo)記語(yǔ)言標(biāo)簽的使用允許以方便的、也可以由例如HTML頁(yè)面構(gòu)造器/編輯器的工具進(jìn)行操縱的形式在標(biāo)記語(yǔ)言文檔內(nèi)封裝有用的功能。通過(guò)分離業(yè)務(wù)邏輯和呈現(xiàn),支持了基于可重用組件的設(shè)計(jì)。JSP允許Web頁(yè)面作者將動(dòng)態(tài)內(nèi)容模塊插入到靜態(tài)HTML模板中,于是大大簡(jiǎn)化了Web內(nèi)容的創(chuàng)建。JSP是Sun公司的Java企業(yè)版(J2EE)編程模型的不可分割的部分。應(yīng)當(dāng)注意,下面討論的本發(fā)明優(yōu)選實(shí)施例的例子可以使用JSP。然而也可以使用其它類型的服務(wù)器頁(yè)面,例如微軟公司的活動(dòng)服務(wù)器頁(yè)面(ASP)。產(chǎn)品顯示JSP呈現(xiàn)關(guān)于產(chǎn)品的數(shù)據(jù)。對(duì)特定產(chǎn)品例如扳手的請(qǐng)求將標(biāo)識(shí)該JSP以及作為查詢參數(shù)的產(chǎn)品ID。使用產(chǎn)品ID參數(shù)執(zhí)行JSP會(huì)輸出HTML的頁(yè)面。當(dāng)關(guān)于該產(chǎn)品的作為基礎(chǔ)的數(shù)據(jù)改變,例如扳手價(jià)格增加時(shí),該頁(yè)面應(yīng)當(dāng)被無(wú)效。為此,必須通過(guò)將代表數(shù)據(jù)的依賴關(guān)系ID和頁(yè)面相關(guān)聯(lián)而在頁(yè)面和數(shù)據(jù)之間建立依賴關(guān)系。粒度是對(duì)于高效的高速緩存策略很重要的Web頁(yè)面特性。Web頁(yè)面的內(nèi)容包括若干組件,其中一些組件可以頻繁改變,而另一些是相對(duì)靜態(tài)的??梢园凑兆鳛閮?nèi)容組成部分的“片段”來(lái)描述Web頁(yè)面的粒度??梢酝ㄟ^(guò)各種方式,包括滿足對(duì)JSP文件的HTTP請(qǐng)求,來(lái)創(chuàng)建片段。在上述例子中,產(chǎn)品顯示頁(yè)面是單個(gè)片段的頁(yè)面?,F(xiàn)在參照?qǐng)D2,其中的方塊圖示出了由片段組成的Web頁(yè)面。這個(gè)例子示出了片段粒度允許高速緩存頁(yè)面的各個(gè)部分,即使某些片段是易失性的,并且已知是被時(shí)時(shí)更新的。換言之,各種Web內(nèi)容從高速緩存而得到不同程度的益處。產(chǎn)品顯示W(wǎng)eb頁(yè)面包括動(dòng)態(tài)內(nèi)容片段200。最高級(jí)片段是Java服務(wù)器頁(yè)面(JSP)204,其包含5個(gè)子片段206-214。片段208和212被高速緩存。應(yīng)當(dāng)注意,如附圖中的時(shí)間線所示,從左到右地按照其基礎(chǔ)數(shù)據(jù)變化速率的升序排列子片段。產(chǎn)品URI206是針對(duì)產(chǎn)品的圖形交換格式(GIF或gif)圖像文件的統(tǒng)一資源標(biāo)識(shí)符(URI)鏈接。一帶格式表格可以保存詳細(xì)產(chǎn)品說(shuō)明208。顯示個(gè)性化問(wèn)候語(yǔ)的片段210可以使用購(gòu)物者名字。這個(gè)問(wèn)候語(yǔ)經(jīng)常改變,例如對(duì)于每個(gè)用戶均不同,但是它仍然值得進(jìn)行高速緩存,因?yàn)樵诮o定購(gòu)物者的會(huì)話過(guò)程中會(huì)重用其名字。JSP212創(chuàng)建簡(jiǎn)化的購(gòu)物車(chē)。購(gòu)物車(chē)JSP212可以創(chuàng)建HTML表格以顯示數(shù)據(jù)。這個(gè)內(nèi)容會(huì)比個(gè)性化問(wèn)候語(yǔ)210改變得甚至更頻繁,因?yàn)樗鼞?yīng)當(dāng)在購(gòu)物者每次向其車(chē)中加入物品時(shí)進(jìn)行更新。然而如果購(gòu)物車(chē)出現(xiàn)在每個(gè)返回給購(gòu)物者的頁(yè)面上,則高速緩存JSP212比每當(dāng)顯示購(gòu)物車(chē)時(shí)檢索相同數(shù)據(jù)更加高效。JSP204也可以包含在顯示股票監(jiān)視列表(stockwatchlist)的Web頁(yè)面上出現(xiàn)的廣告214。由于廣告每當(dāng)請(qǐng)求頁(yè)面時(shí)發(fā)生改變,更新速度會(huì)過(guò)高,以致不能從高速緩存中得到益處。圖1A-2示出各種分布式數(shù)據(jù)處理系統(tǒng)和動(dòng)態(tài)內(nèi)容的一例子以作為討論本發(fā)明優(yōu)選實(shí)施例的背景。如上所述,高效地高速緩存片段可能是困難的。本發(fā)明的優(yōu)選實(shí)施例涉及這樣一種技術(shù),其使用對(duì)HTML和HTTP的擴(kuò)展來(lái)高效地高速緩存片段,并特別關(guān)注于克服與高速緩存動(dòng)態(tài)片段和個(gè)性化片段即動(dòng)態(tài)內(nèi)容相關(guān)的困難。應(yīng)當(dāng)注意,下面提供的例子提及特定的協(xié)議規(guī)范,例如HTTP/1.1和HTML4.1。然而,本領(lǐng)域的普通技術(shù)人員會(huì)理解,也可以使用其它提供了如本發(fā)明優(yōu)選實(shí)施例所需的同等的特性和功能的最小集合的協(xié)議。術(shù)語(yǔ)“靜態(tài)片段”被定義成無(wú)需使用查詢參數(shù)或cookie便能夠獲得的片段??梢砸谩⒏咚倬彺婧?或完全從其URI獲取靜態(tài)片段。“動(dòng)態(tài)片段”是作為根據(jù)請(qǐng)求方提供的參數(shù)或cookie在服務(wù)器上的進(jìn)行計(jì)算的結(jié)果而產(chǎn)生的片段。動(dòng)態(tài)片段的一例子可以是體育比賽結(jié)果。動(dòng)態(tài)片段的特征在于包括特定于站點(diǎn)的用戶請(qǐng)求數(shù)據(jù)子集?!皞€(gè)性化片段”也是作為根據(jù)請(qǐng)求方的參數(shù)或cookie進(jìn)行計(jì)算的結(jié)果而產(chǎn)生的。個(gè)性化片段是動(dòng)態(tài)片段的特例,因?yàn)槠鋬?nèi)容取決于用戶。個(gè)性化片段可以是非易失的,例如帳號(hào),也可以是易失的,例如購(gòu)物籃(shoppingbasket)。對(duì)于定義和管理片段的目的來(lái)說(shuō),動(dòng)態(tài)片段和個(gè)性化片段呈現(xiàn)出同等的問(wèn)題;因此,術(shù)語(yǔ)“動(dòng)態(tài)”和“個(gè)性化”將被可互換地使用。“最高級(jí)片段”是沒(méi)有嵌入任何其他片段中,但是本身可以將其它片段嵌入的片段。“頁(yè)面裝配器”是從片段組成頁(yè)面的程序。收集片段并組成頁(yè)面的過(guò)程被稱作“頁(yè)面裝配”。檢查片段以確定是否應(yīng)當(dāng)獲取附加片段并將其裝配到文檔中的過(guò)程此后被稱作“分析”(parsing),即使沒(méi)有執(zhí)行字面意義上的分析。例如,片段可以伴隨有元信息,該元信息指出了應(yīng)當(dāng)獲取以進(jìn)行裝配的附加片段,并且指定了附加片段應(yīng)當(dāng)插入的精確位置;為了附加片段而檢查這種片段不一定是正式的計(jì)算機(jī)科學(xué)意義上的分析。FRAGMENTLINK標(biāo)簽的定義現(xiàn)在參照?qǐng)D3,根據(jù)本發(fā)明優(yōu)選實(shí)施例提供了FRAGMENTLINK標(biāo)簽的標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言(SGML)形式定義。FRAGMENTLINK標(biāo)簽被用來(lái)規(guī)定將在頁(yè)面裝配或頁(yè)面呈現(xiàn)期間插入到文檔中的片段的位置。新對(duì)象被分析為父文檔的一部分,并且可以包含其自身的FRAGMENTLINK標(biāo)簽。下面討論FRAGMENTLINK標(biāo)簽的屬性的定義。(應(yīng)當(dāng)注意,標(biāo)記語(yǔ)言通常使用角括號(hào)(“<”和“>”)作為定界符。為了避免本文檔的標(biāo)記語(yǔ)言版本的可能的格式化問(wèn)題或電子解釋問(wèn)題,已經(jīng)在整個(gè)這個(gè)文檔中使用花括號(hào)(“{”和“}”)作為替換定界符。作為另一個(gè)格式注解,某些長(zhǎng)文本串的例子在這個(gè)文檔中占據(jù)不止一個(gè)文本行;本領(lǐng)域的普通技術(shù)人員能夠確定哪些文本例子被打算顯示為單行文本,即使它們?cè)诒疚臋n中看起來(lái)跨過(guò)了行邊界。)src=URISRC屬性指定將被插入文檔的片段的源位置;SRC屬性充當(dāng)用于獲得片段的源標(biāo)識(shí)符。如果該URI是相對(duì)URI,則絕對(duì)URI來(lái)自于父的路徑和任何相關(guān)的BASE(基)標(biāo)簽。應(yīng)當(dāng)注意,如果在兩個(gè)不同頁(yè)面內(nèi)包含單個(gè)共同的片段,這可以導(dǎo)致混亂。建議文檔作者只編碼片段URI的絕對(duì)路徑名。URI的協(xié)議部分可以指定“cookie”,在這種情況下所插入的文本值是從所指出的cookie得到的。alt=stringALT屬性指定在不能獲取來(lái)自SRC屬性的URI時(shí)將起替換作用的替換HTML文本。如果沒(méi)有指定ALT屬性并且不能獲取SRC屬性指定的片段,則不獲取片段。parms=%parmlistPARMS屬性指定空格定界的名字列表。每個(gè)名字對(duì)應(yīng)于父片段的URI中可能存在的查詢參數(shù)。當(dāng)指定了PARMS屬性時(shí),認(rèn)為SRC屬性中指定的URI是不完整的。為了完成SRC屬性,在PARMS屬性中指出的每個(gè)查詢參數(shù)的值應(yīng)當(dāng)從父文檔獲取,并且用來(lái)創(chuàng)建一名稱-值對(duì)。這個(gè)名稱-值對(duì)將被附加到SRC屬性的URI上作為查詢參數(shù),以便完成SRC屬性。如果指出的參數(shù)不存在于父URI中,則該參數(shù)不附加到片段的URI中。每個(gè)參數(shù)應(yīng)當(dāng)按照其在PARMS屬性中出現(xiàn)的相同順序附加到SRC屬性的URI中。foreach=quoted-stringFOREACH屬性指定一引號(hào)中的串。該引號(hào)中的串的值最好是cookie的名字,該cookie的值是以空格定界的名稱-值對(duì)的列表,其中名字和值被等號(hào)(“=”)或某種其它類型的等價(jià)定界符分隔。對(duì)于cookie中的每個(gè)名稱-值對(duì),產(chǎn)生一個(gè)新的FRAGMENTLINK標(biāo)簽,其SRC屬性是添加了該名稱-值對(duì)以作為查詢參數(shù)的URI。這提供了用于自動(dòng)產(chǎn)生僅在一個(gè)查詢參數(shù),例如用戶股票監(jiān)視列表的值方面有所不同的多個(gè)FRAGMENTLINK標(biāo)簽的簡(jiǎn)略的方法。換言之,F(xiàn)OREACH屬性將針對(duì)一個(gè)片段的單個(gè)鏈接擴(kuò)展成針對(duì)多個(gè)片段的一組多個(gè)鏈接。每個(gè)名稱-值對(duì)變成一對(duì)擴(kuò)展參數(shù)名和擴(kuò)展參數(shù)值。showlink=(no|comment|CDATA)SHOWLINK屬性指定被用來(lái)包裝所包含的片段數(shù)據(jù)的標(biāo)簽的名字。如果指定為“no”,則以沒(méi)有包裝標(biāo)簽的方式包含數(shù)據(jù)。如果指定為“comment”,則FRAGMENTLINK標(biāo)簽被改寫(xiě)為HTML注釋。如果指定為任何其他值,則FRAGMENTLINK標(biāo)簽被改寫(xiě)為指定標(biāo)簽。不進(jìn)行檢查以驗(yàn)證CDATA是否為有效標(biāo)簽,于是留給頁(yè)面作者來(lái)確切決定如何表示片段。如果省略SHOWLINK屬性,則不進(jìn)行包裝。id=ID如果指定ID屬性,則根據(jù)這里參考引用的、可在www.w3c.org處從環(huán)球網(wǎng)聯(lián)盟(W3C)得到的“HTML4.01規(guī)范”(W3C推薦,1999年12月24日),其標(biāo)識(shí)符值作為唯一名字被分配給所產(chǎn)生的表示這個(gè)片段的DOM元素內(nèi)的該片段。class=CDATA如果指定CLASS屬性,則根據(jù)HTML規(guī)范,它向表示這個(gè)片段的DOM元素分配一個(gè)類名字或一組類名字。當(dāng)裝配頁(yè)面時(shí),頁(yè)面裝配器獲取指定片段并且將其插入父對(duì)象中。SHOWLINK屬性可被用來(lái)允許將插入數(shù)據(jù)包裝在標(biāo)簽或HTML注釋內(nèi)。提供了嵌套片段,但是沒(méi)有片段能夠直接或間接地包含其本身。一片段空間內(nèi)的所有片段的嵌套結(jié)構(gòu)應(yīng)當(dāng)形成有向無(wú)環(huán)圖(DAG)。任何伴隨的HTTP應(yīng)答頭不被認(rèn)為是文檔部分,并且應(yīng)當(dāng)在插入到文檔之前清除。高速緩存應(yīng)當(dāng)象對(duì)任何其他文檔所做的那樣保留這些頭??梢灾付ㄌ娲蜺RI。如果不能獲取SRC片段,則獲取和插入由ALT屬性指定的片段。如果不能獲取SRC屬性的片段和ALT屬性的片段二者,則可以象沒(méi)有FRAGMENTLINK標(biāo)簽包含在原始文檔中那樣繼續(xù)進(jìn)行呈現(xiàn)。使用動(dòng)態(tài)或個(gè)性化片段的難處在于應(yīng)當(dāng)根據(jù)父頁(yè)面所在的環(huán)境或上下文計(jì)算用來(lái)獲取它們的URI。換言之,可能需要根據(jù)伴隨父文檔的查詢參數(shù)動(dòng)態(tài)創(chuàng)建URI;PARMS屬性支持這個(gè)特性。PARMS屬性包括來(lái)自父文檔的將在獲取片段時(shí)使用的查詢參數(shù)名字列表。對(duì)于在PARMS屬性中指出的每個(gè)參數(shù)形成名稱-值對(duì),并且將其作為(可能是另外的)查詢參數(shù)附加到在FRAGMENTLINK標(biāo)簽的SRC屬性中指定的URI上。這些名稱-值對(duì)應(yīng)當(dāng)按照與其在PARMS屬性中的出現(xiàn)相同的順序被附加。另外,可能需要與父相關(guān)的cookie以正確獲取或計(jì)算該片段。應(yīng)當(dāng)隨同對(duì)片段的請(qǐng)求提供伴隨父文檔的所有cookie。例如在使用股票監(jiān)視列表時(shí),經(jīng)常需要許多FRAGMENTLINK標(biāo)簽,它們僅在一個(gè)查詢參數(shù)值方面有所不同??梢允褂肍OREACH屬性作為快速方法,以簡(jiǎn)化頁(yè)面的編碼,降低傳輸片段時(shí)的帶寬要求,并且降低高速緩存中片段的大小。例如,假設(shè)產(chǎn)生了如下FRAGMENTLINK標(biāo)簽{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jsp″alt=″ErroroccurredtryingtofindstockQuote.jsp″foreach=″issues″/}并且假如存在如下cookie:Cookie:issues=″stock=IBMstock=CSCOstock=DELL″這會(huì)導(dǎo)致將FRAGMENTLINK標(biāo)簽擴(kuò)展為一系列FRAGMENTLINK標(biāo)簽,這轉(zhuǎn)而導(dǎo)致計(jì)算每個(gè)新產(chǎn)生的FRAGMENTLINK標(biāo)簽{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspstock=IBM″alt=″AnerroroccurredtryingtofindstockQuote.jsp″/}{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspstock=CSCO″alt=″AnerroroccurredtryingtofindstockQuote.jsp″/}{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspstock=DELL″alt=″AnerroroccurredtryingtofindstockQuote.jsp″/}通常片段的文本較小,并且可以作為cookie的值而包含,從而導(dǎo)致頁(yè)面裝配期間較大的性能增益。為此,在URI的協(xié)議中設(shè)置關(guān)鍵字COOKIE,例如{fragmentlinksrc=″cookie://cookiename″/}FRAGMENT頭的定義現(xiàn)在參照?qǐng)D4,根據(jù)本發(fā)明優(yōu)選實(shí)施例提供了FRAGMENT頭的形式定義。本發(fā)明的實(shí)施例可以使用新的HTTP頭和對(duì)現(xiàn)有“Cache-Control”頭的擴(kuò)展。FRAGMENT頭兼容于HTTP規(guī)范,“超文本傳送協(xié)議-HTTP/1.1”(意見(jiàn)征集2616(RFC2616),互聯(lián)網(wǎng)工程任務(wù)組,1999年6月),這里參考引用了該規(guī)范,并且可在www.ietf.org處從互聯(lián)網(wǎng)工程任務(wù)組得到該規(guī)范。涉及作為片段的對(duì)象的所有信息被封裝在稱作FRAGMENT的頭中。這個(gè)頭被用來(lái)標(biāo)識(shí)客戶機(jī)、服務(wù)器或某個(gè)中間高速緩存是否具有頁(yè)面裝配能力。該頭還規(guī)定用于形成片段的高速緩存標(biāo)識(shí)符的規(guī)則(根據(jù)URI的查詢參數(shù)和伴隨對(duì)象的cookie)。另外,該頭規(guī)定了用于支持主機(jī)啟動(dòng)的無(wú)效的、對(duì)象對(duì)其基礎(chǔ)數(shù)據(jù)的依賴關(guān)系。僅當(dāng)“Cache-Control:fragmentrules”(高速緩存控制片段規(guī)則)指令生效時(shí)才使用FRAGMENT頭。圖4中示出了FRAGMENT頭的完整語(yǔ)法。下面討論FRAGMENT頭的屬性的定義。contains-fragments(包含片段)這個(gè)屬性規(guī)定應(yīng)答的主體包含可以被頁(yè)面裝配器使用的片段指令。supports-fragments(支持片段)這個(gè)屬性規(guī)定原始請(qǐng)求方或數(shù)據(jù)流中的高速緩存支持頁(yè)面裝配。這個(gè)指令可以被任何完全支持頁(yè)面裝配的高速緩存或客戶機(jī)插入。dependencies(依賴關(guān)系)這個(gè)屬性規(guī)定應(yīng)答主體所依賴的依賴關(guān)系名列表。cacheid(高速緩存ID)這個(gè)屬性規(guī)定將用于形成對(duì)象的高速緩存ID的規(guī)則列表。如果一規(guī)則被規(guī)定為“URI”,則應(yīng)答的完整URI將被用作高速緩存ID。如果高速緩存ID被規(guī)定為一規(guī)則,則如下面更詳細(xì)地描述的,規(guī)則被應(yīng)用于請(qǐng)求URI以形成高速緩存ID。在本發(fā)明的優(yōu)選實(shí)施例中,用于片段的高速緩存規(guī)則不同于用于其它類型的對(duì)象的高速緩存規(guī)則,如果高速緩存支持頁(yè)面裝配的話。因此,“Cache-Control”頭被擴(kuò)展以指示適用片段高速緩存規(guī)則。這將通過(guò)覆蓋不高速緩存指令的一擴(kuò)展來(lái)實(shí)現(xiàn)。實(shí)現(xiàn)稱作“fragmentrules”(片段規(guī)則)的新的高速緩存請(qǐng)求指令,作為對(duì)HTTP/1.1規(guī)范的14.9.6節(jié)中規(guī)定的“Cache-Control”通用頭字段的擴(kuò)展。這個(gè)擴(kuò)展的意圖是修改在支持片段裝配的高速緩存中的不高速緩存指令的行為。不支持片段裝配的高速緩存將忽略“fragmentrules”指令,這是HTTP/1.0和HTTP/1.1的基本缺省行為。支持片段裝配的高速緩存將忽略伴隨有“fragmentrules”指令的“no-cache”(不高速緩存)指令(和任何“Pragma:no-cache”(附注不高速緩存)頭,如果存在的話),并且根據(jù)伴隨應(yīng)答的任何其他頭應(yīng)用高速緩存規(guī)則?!癈ache-Control”頭的一個(gè)例子是Cache-Control:no-cache,fragmentrules確定頁(yè)面裝配能力和責(zé)任本發(fā)明優(yōu)選實(shí)施例提供的優(yōu)點(diǎn)是能夠定義片段包含,使得可以在從頁(yè)面編寫(xiě)到瀏覽器呈現(xiàn)的事件鏈中的任意點(diǎn)處,包括片段可能存在的所有高速緩存(包括瀏覽器高速緩存)上,實(shí)現(xiàn)頁(yè)面裝配??梢赃M(jìn)行頁(yè)面裝配的軟件實(shí)體被定義為裝配點(diǎn)。該特性提供以下可能的情景1.沒(méi)有比提供頁(yè)面的HTTP服務(wù)器更接近瀏覽器的裝配點(diǎn)。在這種情況下,服務(wù)器應(yīng)當(dāng)自己進(jìn)行裝配并且提供完全裝配的頁(yè)面。2.存在某種代理,其能夠?yàn)樵挤?wù)器執(zhí)行頁(yè)面裝配。這個(gè)代理能夠變成站點(diǎn)的裝配點(diǎn)。原始服務(wù)器可以向這個(gè)代理提供片段,并且不需要進(jìn)行任何頁(yè)面裝配。3.用戶的瀏覽器可以執(zhí)行頁(yè)面裝配。在這種情況下,沒(méi)有網(wǎng)絡(luò)高速緩存或服務(wù)器需要執(zhí)行頁(yè)面裝配。為了確定如何提供一個(gè)片段,即提供完全裝配的片段還是提供未裝配的片段,服務(wù)器和高速緩存應(yīng)當(dāng)能夠確定是否上行代理中的至少一個(gè)正充當(dāng)裝配點(diǎn)。本發(fā)明的優(yōu)選實(shí)施例使用HTTP請(qǐng)求頭,使得有能力充當(dāng)服務(wù)器的裝配點(diǎn)的任何代理可以使用該頭指示其能夠接受片段,因而不需接收完整的頁(yè)面。FRAGMENT頭的“supports-fragments”指令可以由任何客戶機(jī)或高速緩存插入以向下行高速緩存指示其為裝配點(diǎn)?!皊upports-fragments”指令的一個(gè)例子是fragment:supports-fragments僅僅處理器支持頁(yè)面裝配這一事實(shí)并不意味著其應(yīng)當(dāng)對(duì)從服務(wù)器接收的所有對(duì)象進(jìn)行頁(yè)面裝配。分析從服務(wù)器接收的每個(gè)文檔并且嘗試對(duì)其進(jìn)行裝配,這既是對(duì)資源的浪費(fèi),又是潛在的問(wèn)題源。因此,服務(wù)器應(yīng)當(dāng)在提供對(duì)象前指示對(duì)象需要裝配。FRAGMENT頭的“contains-fragments”包含片段指令應(yīng)當(dāng)由需要在高速緩存或?yàn)g覽器中進(jìn)行頁(yè)面裝配的任何服務(wù)器插入。“contains-fragments”指令的一個(gè)例子是fragment:contains-fragments多數(shù)當(dāng)前的HTTP高速緩存,包含瀏覽器高速緩存,均假定具有查詢參數(shù)的所有對(duì)象均是不可高速緩存的。HTTP/1.1擴(kuò)展和普遍化了高速緩存能力以允許高速緩存對(duì)其成功獲取的任何對(duì)象進(jìn)行高速緩存。然而,甚至HTTP1.1高速緩存通常也被構(gòu)造成不高速緩存其認(rèn)為是動(dòng)態(tài)的對(duì)象,其根據(jù)的假設(shè)是高速緩存動(dòng)態(tài)對(duì)象是對(duì)資源的不良使用。這個(gè)假定無(wú)效的情況的一個(gè)例子是個(gè)性化數(shù)據(jù)。個(gè)性化頁(yè)面的創(chuàng)建方法是將查詢參數(shù)或cookie與頁(yè)面相關(guān)聯(lián),借此將頁(yè)面確定為更通用頁(yè)面的特定的個(gè)性化實(shí)例。頁(yè)面為個(gè)性化頁(yè)面的事實(shí)并未使頁(yè)面內(nèi)在地是不可高速緩存的。僅當(dāng)頁(yè)面所基于的數(shù)據(jù)是非常易失的情況下,頁(yè)面才是不可高速緩存的。在僅僅高速緩存特定企業(yè)的Web內(nèi)容的企業(yè)服務(wù)器中尤其是這樣。反對(duì)高速緩存這種頁(yè)面的通常理由是這種頁(yè)面的重用的發(fā)生率過(guò)低,以致不應(yīng)當(dāng)占用高速緩存中的空間。這個(gè)理由因若干理由而是不充分的。1.文檔從首先創(chuàng)建到最終在瀏覽器中呈現(xiàn)的成本僅僅在極小的程度上是文檔大小的函數(shù)。如果文檔在某種程度上是“動(dòng)態(tài)”的,則大部分成本發(fā)生在起初創(chuàng)建文檔時(shí)。因此,即使很低的重用也可導(dǎo)致服務(wù)器上顯著的成本節(jié)省。2.高速緩存的容量已顯著增加,并且繼續(xù)以非常高的速度增加。3.片段技術(shù)的采用可通過(guò)消除相同HTML內(nèi)容的冗余實(shí)例來(lái)實(shí)際減少高速緩存的數(shù)據(jù)量。片段的引入有可能使規(guī)定高速緩存策略極大地復(fù)雜化,尤其是在頁(yè)面裝配器要被構(gòu)造于高速緩存內(nèi)的情況下。頁(yè)面的每個(gè)片段可能需要不同的高速緩存策略。本發(fā)明的優(yōu)選實(shí)施例使用HTTP應(yīng)答頭來(lái)增加高速緩存策略的粒度,以超過(guò)現(xiàn)有技術(shù)可得到的粒度。有兩個(gè)影響高速緩存、必須傳送給所實(shí)現(xiàn)的頁(yè)面裝配器的因素(1)片段生存期;和(2)對(duì)象的顯式的服務(wù)器啟動(dòng)的無(wú)效。在沒(méi)有服務(wù)器啟動(dòng)的無(wú)效的情況下,用于規(guī)定其它對(duì)象在高速緩存中的對(duì)象生存期的相同機(jī)制能夠應(yīng)用于片段。如果重要的是防止片段被高速緩存在不顯式支持片段的高速緩存中,則在應(yīng)答中應(yīng)當(dāng)包含具有指令“no-cache”和“fragmentrules”的“Cache-Control”頭?!皀o-cache”指令防止未實(shí)現(xiàn)片斷支持的高速緩存對(duì)片段進(jìn)行高速緩存,而“fragmentrules”指令允許實(shí)現(xiàn)片斷支持的高速緩存覆蓋“no-cache”指令。服務(wù)器啟動(dòng)的無(wú)效可以通過(guò)來(lái)自服務(wù)器的顯式控制來(lái)通知支持服務(wù)器啟動(dòng)的無(wú)效的高速緩存哪些片段將被無(wú)效。為了保持與不識(shí)別或支持服務(wù)器啟動(dòng)的無(wú)效的現(xiàn)有的和更舊的高速緩存的兼容性,這種被服務(wù)器無(wú)效的片段應(yīng)當(dāng)被提供有HTTP/1.1“Cache-Control”頭和“no-cache”指令。如果希望高速緩存覆蓋“no-cache”指令并且應(yīng)用特定于片段的規(guī)則,則這些片段應(yīng)當(dāng)被提供有擴(kuò)展指令“fragmentrules”。實(shí)現(xiàn)本發(fā)明優(yōu)選實(shí)施例的片段高速緩存技術(shù)的任何高速緩存還應(yīng)當(dāng)實(shí)現(xiàn)基于如HTTP/1.1規(guī)范中描述的HTTP/1.1可高速緩存性規(guī)則的功能。被服務(wù)器無(wú)效的片段可以依賴于多個(gè)數(shù)據(jù)源,并且多個(gè)片段可以依賴于相同數(shù)據(jù)。非常希望能夠通過(guò)向高速緩存發(fā)送單個(gè)無(wú)效命令來(lái)找到基于共同數(shù)據(jù)的所有片段,從而無(wú)效多個(gè)片段。為高效地達(dá)到此目的,服務(wù)器將向一片段分配一或多個(gè)無(wú)效ID。實(shí)現(xiàn)高速緩存使用無(wú)效ID為高速緩存的項(xiàng)提供次級(jí)索引。當(dāng)服務(wù)器啟動(dòng)的無(wú)效命令到達(dá)時(shí),通過(guò)該無(wú)效ID索引的所有高速緩存的項(xiàng)被無(wú)效。無(wú)效ID是通過(guò)FRAGMENT頭的“dependencies”指令指定的?!癲ependencies”指令的用法的一個(gè)例子是fragment:dependencies=″dep1dep2″實(shí)現(xiàn)服務(wù)器使用“dependencies”指令指示服務(wù)主機(jī)將顯式無(wú)效對(duì)象。如在HTTP/1.1規(guī)范中定義的正常時(shí)效和可高速緩存性不受這個(gè)指令的影響,所以可以在沒(méi)有服務(wù)器啟動(dòng)的無(wú)效的情況下,從高速緩存中清除很少被無(wú)效的對(duì)象。如果指定“dependencies”頭,則高速緩存可以忽略任何“Cache-Control:no-cache”頭。無(wú)效ID、URI和高速緩存ID具有各自的作用。提供用于指定這些中的每個(gè)的分立機(jī)制防止了可能難以解決的不必要的應(yīng)用設(shè)計(jì)沖突。動(dòng)態(tài)片段高速緩存標(biāo)識(shí)符可以在不同于其URI的標(biāo)識(shí)符下高速緩存一個(gè)對(duì)象。也可以根據(jù)URI自身的內(nèi)容對(duì)形成高速緩存ID的精確方式施加約束。這是由于通常使用不應(yīng)該被用作唯一高速緩存ID的一部分的查詢參數(shù)來(lái)形成動(dòng)態(tài)對(duì)象的URI。如果在高速緩存之前不從URI中清除這些參數(shù),則能夠出現(xiàn)虛假的高速緩存未命中,從而導(dǎo)致相同對(duì)象的多個(gè)副本被存儲(chǔ)在多個(gè)ID下。為避免這個(gè)問(wèn)題,一組用于形成高速緩存ID的規(guī)則應(yīng)當(dāng)被設(shè)置在其URI不能直接被用作高速緩存ID的動(dòng)態(tài)對(duì)象的應(yīng)答頭中。每個(gè)規(guī)則包括查詢參數(shù)名和cookie名的一列表。在現(xiàn)有技術(shù)中,cookie不被用作高速緩存ID的一部分,但是在許多應(yīng)用中,使一個(gè)請(qǐng)求區(qū)別于其它請(qǐng)求的信息是cookie內(nèi)的數(shù)據(jù)。因此,cookie的值能夠被指定為高速緩存ID的一部分。將被用作高速緩存ID的一部分的任何cookie應(yīng)當(dāng)具有名稱-數(shù)值對(duì)的形式。換言之,CACHEID指令由一或多個(gè)規(guī)則集構(gòu)成。規(guī)則集由一或多個(gè)規(guī)則構(gòu)成。一個(gè)規(guī)則由一個(gè)串列表構(gòu)成,其中每個(gè)串是來(lái)自請(qǐng)求URI的查詢參數(shù)或伴隨的cookie的名稱。CACHEID指令的一個(gè)例子是fragment:cacheid=″(pl[p2],c4)(p3,c4[c5])URI″這個(gè)指令包括3個(gè)規(guī)則(p1[p2],c4);(p3,c4[c5]);和URI。規(guī)則中的“p_”項(xiàng)是查詢參數(shù)的參數(shù)名,而“c_”項(xiàng)是cookie的cookie名。為產(chǎn)生高速緩存ID,高速緩存從片段的URI的路徑名部分開(kāi)始。然后它嘗試應(yīng)用一個(gè)規(guī)則列表內(nèi)的每個(gè)規(guī)則。如果能夠應(yīng)用規(guī)則列表內(nèi)的每個(gè)規(guī)則,則來(lái)自這個(gè)操作的串被用作高速緩存ID。如果規(guī)則列表的某個(gè)規(guī)則不能應(yīng)用,則跳過(guò)該規(guī)則列表,應(yīng)用下一個(gè)規(guī)則列表,以此類推。如果不存在能夠應(yīng)用其每個(gè)非可選規(guī)則的規(guī)則列表,則對(duì)象不可高速緩存;否則,成功應(yīng)用的第一個(gè)規(guī)則集被用于形成高速緩存ID。方括弧(“[”和“]”)中包括的規(guī)則是應(yīng)當(dāng)盡可能應(yīng)用的可選規(guī)則,但是可選規(guī)則的失敗不造成規(guī)則列表的失敗。如果沒(méi)有CACHEID指令伴隨對(duì)象,則在其包含查詢參數(shù)的完整的URI下高速緩存對(duì)象。為應(yīng)用規(guī)則,高速緩存應(yīng)當(dāng)首先通過(guò)從原始URI中清除全部查詢參數(shù)來(lái)形成基礎(chǔ)高速緩存ID。為應(yīng)用參數(shù)規(guī)則,高速緩存尋找具有參數(shù)名中指定的名稱的查詢參數(shù)。如果名稱存在,則來(lái)自原始URI的相應(yīng)名稱-數(shù)值對(duì)被附加到基礎(chǔ)高速緩存ID以形成新的基礎(chǔ)高速緩存ID。這個(gè)過(guò)程繼續(xù)進(jìn)行,直到全部規(guī)則已經(jīng)成功應(yīng)用。如果不能應(yīng)用一個(gè)非可選規(guī)則,則將基礎(chǔ)高速緩存ID恢復(fù)到其初始狀態(tài)并且應(yīng)用下一個(gè)規(guī)則列表。為應(yīng)用cookie規(guī)則,高速緩存尋找具有cookie名參數(shù)中指定的名稱的名稱-數(shù)值對(duì)形式的cookie。如果它存在,則名稱-數(shù)值對(duì)被附加到基礎(chǔ)高速緩存ID以形成新的基礎(chǔ)高速緩存ID。這個(gè)過(guò)程繼續(xù)進(jìn)行,直到全部規(guī)則已經(jīng)成功應(yīng)用。如果不能應(yīng)用一個(gè)非可選規(guī)則,則將基礎(chǔ)高速緩存ID恢復(fù)到其初始狀態(tài)并且應(yīng)用下一個(gè)規(guī)則列表。如果規(guī)則列表包括串“URI”,則應(yīng)答的整個(gè)URI被用作高速緩存ID。在上述例子中,如果其它兩個(gè)規(guī)則列表均不能被成功應(yīng)用,則使用請(qǐng)求的完整URI。當(dāng)對(duì)一個(gè)對(duì)象的請(qǐng)求到達(dá)高速緩存時(shí),高速緩存,即高速緩存管理單元或高速緩存的維護(hù)者,首先進(jìn)行檢查以確定對(duì)象是否被高速緩存在其完整URI下。如果是,則返回對(duì)象;如果不是,則根據(jù)片段的URI的路徑部分形成基礎(chǔ)高速緩存ID,并且再次執(zhí)行查找。如果沒(méi)有發(fā)現(xiàn)對(duì)象,則在與高速緩存相關(guān)的規(guī)則表中搜索基礎(chǔ)高速緩存ID。如果基礎(chǔ)高速緩存ID已注冊(cè)在高速緩存的規(guī)則表中,則如前面描述的那樣應(yīng)用該URI的規(guī)則。如果一規(guī)則列表被成功應(yīng)用,則再次在新高速緩存ID下尋找對(duì)象。如果沒(méi)有找到,則高速緩存認(rèn)為這是一次未命中,并且請(qǐng)求被轉(zhuǎn)發(fā)給服務(wù)器;否則,如果找到對(duì)象,則對(duì)象被返回到請(qǐng)求方。繼續(xù)上述例子,假定對(duì)象的完整URI是http://foo.bar.com/buymep1=parm1&p3=parm3并且應(yīng)答具有值為“cookie4”、名為“c4”的伴隨的cookie。在這種情況下,高速緩存ID可被形成為http://foo.bar.com/buyme/p1=parm1/c4=cookie4因?yàn)榈谝粋€(gè)規(guī)則適用,即“(p1[P2],c4)”。通過(guò)多個(gè)高速緩存進(jìn)行的頁(yè)面裝配現(xiàn)在參照?qǐng)D5A-5G,對(duì)象獲取路徑上的一組支持片段和不支持片段的代理被示出,作為關(guān)于能夠在各種處理環(huán)境中成功實(shí)現(xiàn)本發(fā)明優(yōu)選實(shí)施例的片段高速緩存技術(shù)的方式的討論的基礎(chǔ)。當(dāng)在客戶端瀏覽器和服務(wù)器之間的路徑上存在多個(gè)高速緩存,其中某些高速緩存聲明支持頁(yè)面裝配而某些高速緩存未聲明支持頁(yè)面裝配時(shí),會(huì)出現(xiàn)某些復(fù)雜因素。對(duì)于例如圖象或多媒體的其它類型的嵌入對(duì)象則不出現(xiàn)這些問(wèn)題,因?yàn)楦咚倬彺婧蜑g覽器始終將這些對(duì)象視作獨(dú)立無(wú)關(guān)的對(duì)象。甚至當(dāng)在瀏覽器中呈現(xiàn)之后,初始對(duì)象在瀏覽器的高速緩存中仍然是分立的。然而如果頁(yè)面包括最高級(jí)片段“p”和子片段“c”,則使用“p”的URI來(lái)請(qǐng)求對(duì)象可能返回片段“p”或者完整組合的頁(yè)面“P”,這取決于開(kāi)始于瀏覽器并且終止于目標(biāo)服務(wù)器的代理鏈中頁(yè)面裝配的支持水平。圖5A-5G圖示了代理的各種配置,其具有不同的能力和本發(fā)明的優(yōu)選實(shí)施例能夠處理它們的方式。在每個(gè)附圖中,第一高速緩存“高速緩存1”和第二高速緩存“高速緩存2”位于客戶端瀏覽器和服務(wù)器之間。在這些例子中,“f”表示支持片段的代理;“nf”表示不支持片段的代理;“p”表示父片段;“c”表示子片段;而“P(p,c)”表示通過(guò)將子片段“c”嵌入父片段“p”而組成的頁(yè)面。圖5A表示最簡(jiǎn)單的情況。在這個(gè)例子中,服務(wù)器支持片段,2個(gè)高速緩存和瀏覽器可以支持或不支持片段。有一個(gè)包含子片段“c”的最高級(jí)片段“p”。服務(wù)器分別地存儲(chǔ)“p”和“c”,但是知道它們是相關(guān)的。對(duì)于針對(duì)“p”的特定請(qǐng)求,如果瀏覽器和服務(wù)器之間的任何代理(在任何級(jí)數(shù)上的)支持片段,則返回分立的片段;否則,服務(wù)器裝配片段并且返回完整裝配的頁(yè)面。參照?qǐng)D5B,瀏覽器支持片段,但是高速緩存1和高速緩存2不支持。在瀏覽器請(qǐng)求p(并且在嘗試裝配p之后,接著請(qǐng)求c)之后,每個(gè)代理高速緩存了“p”和“c”的副本。服務(wù)器返回了分立的片段,因?yàn)闉g覽器會(huì)已指示了其支持片段。然而高速緩存1和高速緩存2的表現(xiàn)就好象它們正高速緩存2個(gè)獨(dú)立HTTP對(duì)象那樣,尤其因?yàn)樗鼈兪潜粸g覽器分別地請(qǐng)求的,而瀏覽器和服務(wù)器知道“p”和“c”的副本是相關(guān)的。瀏覽器分別地高速緩存它們,但是當(dāng)需要時(shí)組合它們。參照?qǐng)D5C,瀏覽器不支持片段,但是高速緩存1和高速緩存2支持片段。在這種情況下,服務(wù)器返回了分立的片段,因?yàn)楦咚倬彺?會(huì)已指示了片段支持。高速緩存2返回了分立的片段,因?yàn)楦咚倬彺?會(huì)已指示了片段支持。高速緩存1根據(jù)“p”和“c”組成最終頁(yè)面“p(p,c)”,然后將該最終頁(yè)面返回到瀏覽器,因?yàn)闉g覽器未指示片段支持。參照?qǐng)D5D,瀏覽器和高速緩存2不支持片段,但是高速緩存1支持片段。服務(wù)器返回了分立的片段,因?yàn)楦咚倬彺?會(huì)已指示了片段支持,并且會(huì)已在HTTP頭中攜帶了該指示通過(guò)高速緩存2。高速緩存2的表現(xiàn)就好象其正高速緩存2個(gè)獨(dú)立HTTP對(duì)象那樣,但是瀏覽器、高速緩存1和服務(wù)器知道分立片段是相關(guān)的。高速緩存2傳遞分立的片段,因?yàn)樗鼈儽环謩e存儲(chǔ),并且它不知道它們是相關(guān)的。高速緩存1根據(jù)“p”和“c”組成最終頁(yè)面“p(p,c)”,然后將該最終頁(yè)面返回到瀏覽器,因?yàn)闉g覽器未指示片段支持。參照?qǐng)D5E,瀏覽器和高速緩存1不支持片段,但是高速緩存2支持片段。服務(wù)器返回了分立的片段,因?yàn)楦咚倬彺?指示了片段支持。高速緩存2根據(jù)“p”和“c”組成最終頁(yè)面“p(p,c)”,然后將該最終頁(yè)面?zhèn)鬟f到高速緩存1,因?yàn)闉g覽器和高速緩存1均未指示片段支持。高速緩存1和瀏覽器將組合成的片段存儲(chǔ)為單個(gè)HTTP對(duì)象,即最終頁(yè)面“P(p,c)”。參照?qǐng)D5F,單個(gè)瀏覽器被兩個(gè)瀏覽器“瀏覽器1”和“瀏覽器2”替換。瀏覽器2發(fā)出將映射到父片段“p”的頁(yè)面請(qǐng)求。高速緩存1向高速緩存2轉(zhuǎn)遞請(qǐng)求,該請(qǐng)求會(huì)攜帶瀏覽器2發(fā)出的“supports-fragments”頭。高速緩存2向高速緩存1返回具有針對(duì)片段“c”的片段鏈接的片段“p”;高速緩存1將其返回到瀏覽器2。瀏覽器2分析片段“p”并且接著發(fā)出針對(duì)子片段“c”的請(qǐng)求。如果不是為片段處理而設(shè)置的瀏覽器1現(xiàn)在發(fā)出針對(duì)該頁(yè)面的請(qǐng)求,則會(huì)出現(xiàn)潛在的問(wèn)題。瀏覽器1發(fā)出包含的URI與瀏覽器2發(fā)出的相同的請(qǐng)求,并且這個(gè)URI會(huì)匹配于片段″p″的高速緩存ID。如果高速緩存1已將p片段高速緩存,則高速緩存1會(huì)發(fā)送包含用于片段″c″的FRAGMENTLINK標(biāo)簽的高速緩存片段到瀏覽器1。由于瀏覽器1不理解FRAGMENTLINK標(biāo)記,瀏覽器1會(huì)忽略它,從而導(dǎo)致呈現(xiàn)不完整的頁(yè)面。這種情況可推及到網(wǎng)絡(luò)內(nèi)的任何這樣的配置,其中支持片段的代理和不支持片段的另一個(gè)代理連接到不支持片段的高速緩存,如圖5G更一般地所示的。如果瀏覽器2請(qǐng)求片段“p”,則支持片段的高速緩存1會(huì)接收片段“p”和“c”并且裝配它們,之后高速緩存1將頁(yè)面“P(p,c)”傳送到瀏覽器2。來(lái)自瀏覽器1的通過(guò)高速緩存1的針對(duì)片段“p”的后續(xù)請(qǐng)求會(huì)導(dǎo)致傳送未裝配的頁(yè)面。為解決這個(gè)潛在問(wèn)題,來(lái)自支持頁(yè)面裝配的服務(wù)器的任何最高級(jí)片段應(yīng)當(dāng)將最高級(jí)片段標(biāo)記為不可高速緩存,例如使用“Cache-Control:no-cachefragmentrules”。支持頁(yè)面裝配的高速緩存會(huì)識(shí)別指令中的“fragmentrules”,從而覆蓋“no-cache”指令并且對(duì)對(duì)象應(yīng)用正確的行為。應(yīng)當(dāng)注意,為處理這種情況,只有最高級(jí)片段應(yīng)當(dāng)被標(biāo)記為不可高速緩存的。其原因在于由于全頁(yè)面的URI與最高級(jí)片段的URI相同而可能導(dǎo)致的歧義;也就是說(shuō),URI會(huì)指兩個(gè)不同的對(duì)象。嵌入的片段從不以不止一種形式存在,因此對(duì)于嵌入的片段不會(huì)出現(xiàn)這種歧義。關(guān)于防止不適當(dāng)?shù)母咚倬彺娴目紤]如緊接著的上面所述,來(lái)自支持頁(yè)面裝配的服務(wù)器的任何最高級(jí)片段應(yīng)當(dāng)將最高級(jí)片段標(biāo)記為不可高速緩存的。這防止了出現(xiàn)不支持片段的高速緩存試圖高速緩存包含其它片段的最高級(jí)片段的潛在問(wèn)題;如果出現(xiàn)此問(wèn)題,如圖5G所示,則可能從不包含支持片段的高速緩存的瀏覽器沿著一個(gè)路徑訪問(wèn)最高級(jí)片段,從而不適當(dāng)?shù)爻尸F(xiàn)具有FRAGMENTLINK標(biāo)簽、而不是由FRAGMENTLINK標(biāo)簽指定的內(nèi)容的頁(yè)面。另外,不支持片段的高速緩存通常會(huì)使用與對(duì)象相關(guān)的URI或URI路徑作為高速緩存索引/關(guān)鍵字;不為高速緩存所知地,對(duì)象可以是片段。由于對(duì)象是片段,有可能不適當(dāng)?shù)刂皇褂肬RI或URI路徑作為不支持片段的高速緩存中的高速緩存ID;在支持片段的高速緩存中,會(huì)根據(jù)與對(duì)象,即片段相關(guān)的片段高速緩存規(guī)則形成高速緩存ID。換言之,不支持片段的高速緩存繼續(xù)根據(jù)其針對(duì)所有高速緩存的對(duì)象的高速緩存ID算法形成其高速緩存索引,然而本發(fā)明優(yōu)選實(shí)施例的技術(shù)旨在在產(chǎn)生用于在高速緩存內(nèi)放置片段的高速緩存索引之前,使用片段高速緩存規(guī)則來(lái)形成可高速緩存片段的高速緩存ID。因此,不支持片段的高速緩存有可能在作為高速緩存命中的結(jié)果的應(yīng)答中返回其實(shí)際為片段的對(duì)象。然后就可能在下游出現(xiàn)各種偏差或呈現(xiàn)錯(cuò)誤。為了防止這種錯(cuò)誤,應(yīng)當(dāng)在不適合進(jìn)行高速緩存時(shí)防止進(jìn)行高速緩存。通常,通過(guò)包含“Cache-Control:no-cachefragmentrules”頭和通過(guò)包含“Pragma:no-cache”頭,能夠防止在不支持片段的高速緩存中進(jìn)行高速緩存。第二個(gè)頭告訴不支持HTTP/1.1的高速緩存不要高速緩存片段;支持片段的高速緩存也應(yīng)當(dāng)支持HTTP/1.1。如以上參照?qǐng)D5G所簡(jiǎn)述的,第一個(gè)頭中的“no-cache”指令告訴支持HTTP/1.1但不支持片段的高速緩存不要高速緩存片段,而“fragmentrules”指令告訴支持片段的高速緩存應(yīng)當(dāng)根據(jù)片段高速緩存規(guī)則來(lái)高速緩存片段。有關(guān)高效高速緩存的考慮對(duì)于由多個(gè)用戶共享的片段,例如產(chǎn)品說(shuō)明或股票行情,最高效的方式是允許在瀏覽器和Web應(yīng)用服務(wù)器之間的大多數(shù)或所有高速緩存中進(jìn)行高速緩存。片段可以被視作分布于一個(gè)樹(shù)結(jié)構(gòu)上,在該樹(shù)結(jié)構(gòu)中,每個(gè)高速緩存扇出到其它高速緩存。針對(duì)特定片段的第一請(qǐng)求會(huì)填充用戶和Web應(yīng)用服務(wù)器之間的路徑上的諸高速緩存。其它用戶針對(duì)相同片段的后續(xù)請(qǐng)求會(huì)在這些高速緩存中找到該片段,而不必一直被傳送到Web應(yīng)用服務(wù)器。對(duì)于特定于用戶的片段,例如諸如股票監(jiān)視列表的個(gè)性化片段,最高效的方式是允許只在最接近最終用戶的支持片段的高速緩存中進(jìn)行高速緩存,因?yàn)獒槍?duì)相同片段的所有后續(xù)請(qǐng)求都將沿著相同的路徑。否則,中間高速緩存會(huì)填充以這些特定于用戶的片段,即使這些中間高速緩存永遠(yuǎn)不會(huì)看見(jiàn)針對(duì)這些特定于用戶的片段的后續(xù)請(qǐng)求,因?yàn)檫@些片段由遠(yuǎn)為更接近用戶的高速緩存提供了,從而從中間高速緩存排擠出了共享片段。具有“private”(私有)指令的HTTP“Cache-Control”頭先前已經(jīng)被用來(lái)為頁(yè)面指定這個(gè)相同的特定于用戶的特性,使得只有瀏覽器高速緩存才會(huì)高速緩存這種頁(yè)面。這個(gè)相同的頭被本發(fā)明的優(yōu)選實(shí)施例用來(lái)指示支持片段的高速緩存在最接近用戶的支持片段的高速緩存中高速緩存內(nèi)容。應(yīng)當(dāng)注意,在特定于用戶的片段中包含“Cache-Control:private”是一項(xiàng)可選的性能優(yōu)化。關(guān)于復(fù)合文檔的考慮當(dāng)獲取用于片段裝配的片段時(shí),應(yīng)當(dāng)形成HTTP請(qǐng)求。用于該應(yīng)答的頭的大部分可以從最高級(jí)片段中的應(yīng)答頭繼承。然而某些應(yīng)答頭涉及正被獲取的特定對(duì)象,因而當(dāng)從父片段繼承它們時(shí)應(yīng)當(dāng)注意。類似地,可以丟棄多數(shù)應(yīng)答頭,并且當(dāng)向客戶機(jī)返回應(yīng)答時(shí)可以使用伴隨最高級(jí)片段的應(yīng)答頭。再次地,某些應(yīng)答頭是特定于單個(gè)對(duì)象的,并且可以影響整個(gè)文檔的狀態(tài)。本節(jié)討論有關(guān)在片段裝配中處理HTTP請(qǐng)求/應(yīng)答頭的問(wèn)題。術(shù)語(yǔ)“向下傳播”被用來(lái)表示針對(duì)嵌入對(duì)象的請(qǐng)求從父或最高級(jí)片段繼承請(qǐng)求頭。術(shù)語(yǔ)“向上傳播”被用來(lái)表示從嵌入對(duì)象到父或最高級(jí)片段的應(yīng)答頭解析。對(duì)于cookie,涉及復(fù)合文檔的一個(gè)特殊問(wèn)題是在頁(yè)面裝配期間,不能得到原始的“set-cookie”(設(shè)置cookie)應(yīng)答頭。只能從客戶機(jī)得到作為結(jié)果的cookie請(qǐng)求頭。特別,實(shí)際的“path”(路徑)、“domain”(域)或“expires”(過(guò)期)值均不能得到。如果嵌套層次較淺的片段中嵌入了另一個(gè)片段,而該另一個(gè)片段不滿足施加在伴隨請(qǐng)求而來(lái)的cookie上的限制,則將該cookie傳遞到該子片段是不適當(dāng)?shù)?。因?yàn)椴淮嬖谒械脑夹畔?,所以通常不可能確定是否傳遞cookie是適當(dāng)?shù)?。類似地,嵌套的片段可以具有伴隨的“set-cookie”頭??赡苄枰揷ookie的實(shí)際值來(lái)計(jì)算該片段的高速緩存ID。另外,可能需要該cookie的值以獲取嵌套層次更深的片段。然而某些信息是可以推斷出來(lái)的。可以假定cookie的“expires”部分還沒(méi)有生效;如果已生效,則請(qǐng)求中不會(huì)存在該cookie??梢约俣ㄓ蚴钦?qǐng)求中的域的某個(gè)部分,并且也可以假定路徑是請(qǐng)求中的路徑的某個(gè)部分。通常,瀏覽器檢查對(duì)cookie的約束,如果請(qǐng)求不滿足約束,則cookie不被包含在請(qǐng)求頭中。然而在頁(yè)面裝配高速緩存中,具有伴隨的cookie的文檔中包含的FRAGMENTLINK標(biāo)簽有可能引用不滿足該原始cookie的約束的URI。因?yàn)镕RAGMENTLINK標(biāo)簽中引用的對(duì)象可能需要父的cookie才能被適當(dāng)?shù)厍笾?,所以?yīng)當(dāng)從嵌套層次較淺的片段向嵌套層次較深的片段傳送cookie。為保證頁(yè)面裝配器不以違反對(duì)cookie的約束的不適當(dāng)方式傳遞該cookie,指導(dǎo)原則是嵌套片段的URI的路徑和域應(yīng)當(dāng)滿足最高級(jí)片段的路徑和域的最保守部分。換言之,嵌套片段的URI中的域應(yīng)當(dāng)匹配其父的域或?yàn)槠涑?,并且URI的路徑部分應(yīng)當(dāng)匹配其父的路徑或?yàn)槠涑_@可以被稱作“cookie的向下傳播”。相反,下面描述了“cookie的向上傳播”。當(dāng)從主機(jī)獲取片段時(shí),應(yīng)答有可能包含“set-cookie”頭。這個(gè)cookie本身可能是為正確求值新返回的片段內(nèi)的嵌套層次更深的片段所需要的。因此,頁(yè)面裝配器應(yīng)當(dāng)將“set-cookie”頭轉(zhuǎn)換成“cookie”頭以便獲取嵌套層次更深的片段??赡芤蛑辽賰蓚€(gè)目的而需要這個(gè)新的cookie(1)在服務(wù)器上對(duì)嵌套層次更深的片段的求值;和(2)為該最近獲取的片段或嵌套層次更深的片段生成高速緩存ID。在為高速緩存ID的生成而需要cookie的情況下,需要將新cookie與所裝配的頁(yè)面一起發(fā)回到請(qǐng)求方。這是由于該cookie應(yīng)當(dāng)伴隨下一個(gè)針對(duì)該頁(yè)面、或針對(duì)引用高速緩存的該片段的任何頁(yè)面的請(qǐng)求,以便在嘗試從服務(wù)器獲取該頁(yè)面之前根據(jù)請(qǐng)求計(jì)算高速緩存ID。將“set-cookie”頭中的cookie轉(zhuǎn)換成對(duì)嵌套片段的請(qǐng)求中的“cookie”頭構(gòu)成了隱含地代表用戶接受cookie的動(dòng)作。處理這種情況的指導(dǎo)原則包括(1)最高級(jí)片段應(yīng)當(dāng)已經(jīng)具有具有該名稱的cookie;和(2)片段的路徑和域應(yīng)當(dāng)符合最高級(jí)片段的路徑和域的最保守部分。如果滿足這些約束,新“set-cookie”頭的效果將是簡(jiǎn)單地改變現(xiàn)有cookie的值。從應(yīng)用的角度看,這只是意味著可能需要“啞”cookie來(lái)伴隨最高級(jí)片段。在獲取嵌套片段的過(guò)程中,以及當(dāng)片段的″set-cookie″頭被傳送回到用戶時(shí),這些“啞”cookie將使其值得到更新。復(fù)合文檔的除cookie以外的另一個(gè)特殊考慮涉及“if-modified-since”(如果自…時(shí)已修改)頭?!癷f-modified-since”頭被請(qǐng)求方用來(lái)指示僅當(dāng)自特定日期與時(shí)間后對(duì)象已被修改時(shí)才返回該對(duì)象。如果自該時(shí)間后對(duì)象沒(méi)有被修改,則認(rèn)為該對(duì)象是“新鮮”的,并且通常從服務(wù)器返回HTTP304“NotModified”(未修改)應(yīng)答,從而節(jié)省傳送較大應(yīng)答體將會(huì)需要的帶寬。在復(fù)合文檔中,某些組件可以是“新鮮的”,而其它組件則是“陳舊的”,并且其它組件的狀態(tài)可能是不確定的。如果任何組件不能被確定為“新鮮的”,則應(yīng)當(dāng)返回整個(gè)文件以作為完整的應(yīng)答(HTTP200)。如果所有組件已經(jīng)確定為“新鮮的”,則可以返回HTTP304應(yīng)答。然而,為確定片段是否是新鮮的,可能需要執(zhí)行頁(yè)面裝配,從而注意到組件的HTTP應(yīng)答代碼。如果一個(gè)組件是“新鮮的”,則在組件不是葉節(jié)點(diǎn)的情況下仍然需要其內(nèi)容,以找到和獲取被嵌套的組件。因此,會(huì)返回HTTP304應(yīng)答的對(duì)高速緩存的請(qǐng)求應(yīng)當(dāng)也返回片段的文本,以使得頁(yè)面裝配可以繼續(xù)。例如作為高速緩存未命中的結(jié)果的對(duì)服務(wù)器的請(qǐng)求應(yīng)當(dāng)以沒(méi)有“if-modified-since”頭的方式發(fā)出,因?yàn)榉駝t的話,當(dāng)需要片段的文本以繼續(xù)頁(yè)面裝配時(shí)服務(wù)器可能返回HTTP304應(yīng)答。換言之,對(duì)于復(fù)合文件不能向下傳播“if-modified-since”頭,因?yàn)镠TTP304應(yīng)答會(huì)導(dǎo)致對(duì)客戶機(jī)的無(wú)效應(yīng)答。針對(duì)復(fù)合文件的另一個(gè)特殊考慮類似于“if-modified-since”頭的問(wèn)題,但是不同的是涉及“l(fā)ast-modified”(最后修改)頭。頁(yè)面裝配器也應(yīng)當(dāng)理解哪些片段返回“l(fā)ast-modified”頭,并且將結(jié)果合并成一個(gè)用于組合成的頁(yè)面的、具有最近日期的、合并的“l(fā)ast-modified”頭。如果有任何片段不返回“l(fā)ast-modified”頭,則整體裝配頁(yè)面必須不返回“l(fā)ast-modified”頭。這一點(diǎn)是重要的,因?yàn)槿绻麨g覽器發(fā)現(xiàn)“l(fā)ast-modifed”頭與其本地高速緩存中的文件相同,則它將會(huì)忽略內(nèi)容。例如,考慮包含一段動(dòng)態(tài)內(nèi)容(沒(méi)有“l(fā)ast-modifed”頭)和一段具有“l(fā)ast-modifed”頭的靜態(tài)內(nèi)容(來(lái)自HTML)的頁(yè)面。如果返回具有靜態(tài)頁(yè)面的“l(fā)ast-modifed”頭的頁(yè)面,則瀏覽器會(huì)忽略對(duì)相同頁(yè)面的后續(xù)請(qǐng)求,并且會(huì)顯示來(lái)自瀏覽器高速緩存的舊頁(yè)面。換言之,如果所有片段都包含“l(fā)ast-modifed”頭,則其應(yīng)當(dāng)被向上傳播并且調(diào)整以反映任何組成片段的最近修改時(shí)間。如果有任何片段不包含“l(fā)ast-modifed”頭,則不可以返回“l(fā)ast-modifed”頭。對(duì)于編程模型的考慮本發(fā)明的優(yōu)選實(shí)施例描述了用于分布式片段高速緩存的技術(shù)。然而,本發(fā)明的優(yōu)選實(shí)施例旨在盡可能是與編程模型無(wú)關(guān)的,以便任何Web應(yīng)用服務(wù)器編程模型均可以用其向例如中間服務(wù)器和瀏覽器委派高速緩存功能。本發(fā)明的優(yōu)選實(shí)施例使用對(duì)HTML的擴(kuò)展,即FRAGMENTLINK標(biāo)簽,以及對(duì)HTTP的擴(kuò)展,即新的片段高速緩存頭,這些也是與編程模型無(wú)關(guān)的。當(dāng)對(duì)片段編程時(shí),Web應(yīng)用開(kāi)發(fā)人員應(yīng)當(dāng)規(guī)定下面兩種信息1.包含機(jī)制。這規(guī)定包含哪個(gè)片段以及將其包含在另一個(gè)片段內(nèi)的何處。因?yàn)槠湓陧?yè)面上的位置是重要的,此信息必須嵌入在諸如JSP模板或小服務(wù)程序類等代碼內(nèi)。2.高速緩存控制元數(shù)據(jù)。這規(guī)定片段的條件,例如時(shí)間限制。此信息可以嵌入在代碼中,也可以通過(guò)使其與諸如JSP文件名等模板名稱或servlet類相關(guān)來(lái)單獨(dú)地規(guī)定。如果使用J2EE編程模型來(lái)實(shí)現(xiàn)本發(fā)明的優(yōu)選實(shí)施例,則可以通過(guò)下面的機(jī)制支持這兩個(gè)特性1.對(duì)于包含機(jī)制,J2EE編程模型已經(jīng)具有Web應(yīng)用服務(wù)器內(nèi)的用于規(guī)定所包含片段的包含構(gòu)造,例如“jsp:include”標(biāo)簽或“RequestDispatcher.include”方法??梢孕薷腏2EE運(yùn)行時(shí)程序以在適當(dāng)時(shí)將J2EE包含構(gòu)造改寫(xiě)成FRAGMENTLINK標(biāo)簽。2.高速緩存控制信息可以從系統(tǒng)管理控制臺(tái)規(guī)定,并且與每個(gè)片段模板/類相關(guān),而不是嵌入在代碼中。Web應(yīng)用服務(wù)器可以將此信息插入適當(dāng)?shù)念^中。與將此信息放到代碼中相比,此方案具有以下優(yōu)點(diǎn)A.它允許通過(guò)管理控制臺(tái)進(jìn)行動(dòng)態(tài)改變,而不是因其被編程到代碼中而必須使程序員介入。B.它避免了向J2EE編程模型添加新機(jī)制。將J2EE包含構(gòu)造改寫(xiě)為FRAGMENTLINK標(biāo)簽需要以下考慮。用于查詢參數(shù)的J2EE語(yǔ)義規(guī)定從父片段向子片段遞歸傳遞所有查詢參數(shù)。當(dāng)J2EEWeb應(yīng)用服務(wù)器產(chǎn)生FRAGMENTLINK標(biāo)簽時(shí),SRC屬性應(yīng)當(dāng)是附加有父的查詢參數(shù)的、J2EE包含構(gòu)造的URI。非J2EEWeb應(yīng)用服務(wù)器會(huì)產(chǎn)生符合其編程模型的SRC屬性。通過(guò)這種方式,不管是否存在代理(surrogate)均會(huì)出現(xiàn)相同語(yǔ)義,因?yàn)閼?yīng)用程序代碼看見(jiàn)的請(qǐng)求在任一情況下均是相同的。FRAGMENTLINK標(biāo)簽具有的若干屬性,例如ALT、FOREACH、SHOWLINK、ID和CLASS,不具有相應(yīng)的“jsp:include”屬性。為用于J2EE環(huán)境,這些特性需要對(duì)“jsp:include”的擴(kuò)展。不同Web應(yīng)用服務(wù)器可以支持其它編程模型(例如ASP),這些編程模型具有類似但是不同的、用于包含嵌套片段的機(jī)制。對(duì)于這些編程模型中的每個(gè),Web應(yīng)用服務(wù)器應(yīng)當(dāng)產(chǎn)生符合該編程模型的規(guī)則的FRAGMENTLINK標(biāo)簽。關(guān)于無(wú)效的考慮為保持高速緩存是最新的,當(dāng)其內(nèi)容不再有效時(shí),高速緩存項(xiàng)需要被無(wú)效或蓋寫(xiě)。無(wú)效可以是基于時(shí)間的,也可以由外部事件觸發(fā)。時(shí)間可以是在高速緩存中的最大生存期,例如不長(zhǎng)于10分鐘,也可以是絕對(duì)時(shí)間,例如不超過(guò)02/05/2001中午。最大生存期是使用具有標(biāo)準(zhǔn)HTTP“max-age”指令的標(biāo)準(zhǔn)HTTP“Cache-Control”頭規(guī)定的。絕對(duì)時(shí)間是使用標(biāo)準(zhǔn)HTTP“Expires”頭規(guī)定的。作為一個(gè)例子,可能可接受產(chǎn)品說(shuō)明過(guò)期最高達(dá)10分鐘。這會(huì)被規(guī)定為“Cache-Control:max-age=600”,意味著這個(gè)片段將保持高速緩存不超過(guò)600秒。作為另一個(gè)例子,銷售可以持續(xù)到東部時(shí)間12/24/2001,星期一,11:00pm。這會(huì)被規(guī)定為“Expires=Mon,24Dec200123:00:00EST”。在任一情況下,可以通過(guò)高速緩存的替換算法從高速緩存中清除片段,以為新片段讓出空間。對(duì)于事件觸發(fā)的無(wú)效,應(yīng)用服務(wù)器啟動(dòng)無(wú)效。應(yīng)用服務(wù)器可以使用數(shù)據(jù)庫(kù)觸發(fā)器、由更新HTTP請(qǐng)求調(diào)用的應(yīng)用編程接口(API)或任何其他機(jī)制來(lái)確定內(nèi)容已變得過(guò)時(shí)。本發(fā)明優(yōu)選實(shí)施例的技術(shù)對(duì)于多種無(wú)效機(jī)制均是開(kāi)放的。類似地,本發(fā)明優(yōu)選實(shí)施例的技術(shù)不規(guī)定應(yīng)用服務(wù)器用于向支持片段的高速緩存發(fā)送無(wú)效消息的協(xié)議。片段的依賴關(guān)系是被用來(lái)產(chǎn)生片段的某些基礎(chǔ)數(shù)據(jù)的標(biāo)識(shí)符。作為依賴關(guān)系的一個(gè)例子,幾個(gè)頁(yè)面可能使用相同的基礎(chǔ)用戶簡(jiǎn)檔,但是使用不同的片段,因?yàn)槭褂昧嗽撚脩艉?jiǎn)檔的不同子集,或以不同方式對(duì)它們進(jìn)行了格式化。應(yīng)用程序可以確定用戶簡(jiǎn)檔和使用該用戶簡(jiǎn)檔的所有片段之間的映射,并且每當(dāng)用戶簡(jiǎn)檔改變時(shí)建立這些片段的高速緩存ID。然而,更好的軟件工程是將作為每個(gè)依賴關(guān)系的源的這種映射設(shè)置在每個(gè)片段中。這允許應(yīng)用程序簡(jiǎn)單地通過(guò)使用與用戶簡(jiǎn)檔相關(guān)的用戶ID進(jìn)行無(wú)效,并且使高速緩存將所有依賴于該用戶ID的片段無(wú)效。當(dāng)添加使用用戶簡(jiǎn)檔的新片段或清除一個(gè)片段時(shí),依賴關(guān)系是局部于該片段的,并且應(yīng)用程序的無(wú)效機(jī)制不變。例如,可以按照下面的方式針對(duì)特定用戶簡(jiǎn)檔聲明這種依賴關(guān)系fragment:dependency=″http://www.acmeStore.com_userID=@($*!%″多個(gè)依賴關(guān)系被規(guī)定為以空格分隔的列表。依賴關(guān)系是大小寫(xiě)敏感的。支持片段的高速緩存將允許根據(jù)這些依賴關(guān)系進(jìn)行無(wú)效。為使用蓋寫(xiě)方法將高速緩存項(xiàng)無(wú)效,不需要新的頭信息。支持片段的高速緩存需要允許添加新高速緩存項(xiàng)的協(xié)議。類似于上述無(wú)效協(xié)議,這種蓋寫(xiě)協(xié)議也不由本發(fā)明優(yōu)選實(shí)施例的技術(shù)規(guī)定。關(guān)于安全問(wèn)題的考慮支持片段的高速緩存應(yīng)當(dāng)遵守潛在的安全要求。當(dāng)用戶操作瀏覽器型的應(yīng)用并且點(diǎn)擊URI時(shí),用戶信任應(yīng)用設(shè)計(jì)人員根據(jù)應(yīng)用的安全策略來(lái)處理要使用的URI或用戶的cookie中提供的任何信息。對(duì)于FRAGMENTLINK標(biāo)簽,應(yīng)用設(shè)計(jì)人員向高速緩存委派了適當(dāng)使用這種信息的某些責(zé)任;根據(jù)本發(fā)明優(yōu)選實(shí)施例實(shí)現(xiàn)的高速緩存應(yīng)當(dāng)執(zhí)行FRAGMENTLINK標(biāo)簽不能鏈接到不同于其父的域的域的規(guī)則。包含其它片段的頁(yè)面最終被裝配成完全擴(kuò)展的頁(yè)面,并且這可以在瀏覽器和應(yīng)用服務(wù)器之間的路徑上的任何地方發(fā)生。為了確保安全,應(yīng)用開(kāi)發(fā)人員應(yīng)當(dāng)遵從以下規(guī)則如果一個(gè)片段包含另一個(gè)要求HTTPS的片段,則該片段要求HTTPS。這個(gè)規(guī)則應(yīng)當(dāng)遞歸應(yīng)用,使得其一直傳播到最高級(jí)片段。這個(gè)規(guī)則防止從無(wú)保護(hù)片段內(nèi)看到受保護(hù)片段。對(duì)于HTTPS請(qǐng)求,僅在高速緩存能夠終結(jié)HTTPS會(huì)話的情況下,才應(yīng)當(dāng)包含具有“supports-fragments”指令的FRAGMENT頭。否則,它不能看見(jiàn)FRAGMENTLINK以處理它們。不終結(jié)HTTPS的高速緩存仍然可以針對(duì)HTTP請(qǐng)求支持片段。有關(guān)用于支持片段的高速緩存的高速緩存管理單元的說(shuō)明現(xiàn)在參照?qǐng)D6A,其中的方塊圖描述了根據(jù)本發(fā)明的優(yōu)選實(shí)施例的計(jì)算設(shè)備內(nèi)用于支持片段的高速緩存的高速緩存管理單元??梢允强蛻魴C(jī)、服務(wù)器或者可能同時(shí)具有客戶機(jī)和服務(wù)器功能的計(jì)算設(shè)備600包含支持片段的高速緩存管理單元602,該高速緩存管理單元602包含代表計(jì)算設(shè)備600高速緩存對(duì)象的功能。例如,高速緩存管理單元602可以充當(dāng)其它支持高速緩存的設(shè)備之間的數(shù)據(jù)路徑上的中間高速緩存;在其它情況下,高速緩存管理單元602可以代表最終用戶在客戶端設(shè)備中高速緩存對(duì)象。支持片段的高速緩存管理單元602包括用于存儲(chǔ)/高速緩存對(duì)象的對(duì)象數(shù)據(jù)庫(kù)604,其可以包含與對(duì)象相關(guān)的元數(shù)據(jù)和與對(duì)象一起接收到的網(wǎng)絡(luò)頭。支持片段的高速緩存管理單元602也包括用于存儲(chǔ)與高速緩存管理操作的有關(guān)的信息的數(shù)據(jù)庫(kù),這里提及了所述操作,并在下面參照?qǐng)D6B-6D更詳細(xì)地對(duì)其進(jìn)行描述。規(guī)則列表數(shù)據(jù)庫(kù)606存儲(chǔ)URI路徑608及其相關(guān)的規(guī)則列表610。高速緩存ID數(shù)據(jù)庫(kù)612存儲(chǔ)高速緩存ID614及其相關(guān)的高速緩存索引616。依賴關(guān)系數(shù)據(jù)庫(kù)618存儲(chǔ)依賴關(guān)系ID和高速緩存ID之間的映射。多個(gè)高速緩存ID可以與單個(gè)依賴關(guān)系相關(guān),多個(gè)依賴關(guān)系可以與單個(gè)高速緩存ID相關(guān)。有關(guān)用于支持片段的高速緩存的高速緩存管理單元內(nèi)的某些過(guò)程的說(shuō)明現(xiàn)在參照?qǐng)D6B,其中的流程圖描述了根據(jù)本發(fā)明優(yōu)選實(shí)施例當(dāng)處理包含片段的應(yīng)答消息時(shí)支持片段的高速緩存管理單元可以使用的過(guò)程。換言之,圖6B描述了可以被用來(lái)確定在支持片段的高速緩存上是否應(yīng)當(dāng)以及如何處理和/或高速緩存應(yīng)答消息中的對(duì)象的過(guò)程。在包含如圖6A所示的支持片段的高速緩存管理單元的計(jì)算設(shè)備接收到諸如HTTP應(yīng)答消息的應(yīng)答消息(步驟6002)時(shí),該過(guò)程開(kāi)始。接著確定高速緩存管理單元是否應(yīng)當(dāng)將應(yīng)答消息中的消息體或有效負(fù)載部分處理為片段或非片段(步驟6004)。如果應(yīng)答消息應(yīng)當(dāng)被處理為包含非片段,則使用現(xiàn)有的HTTP1.1規(guī)則確定非片段對(duì)象是否應(yīng)當(dāng)并且能夠在這個(gè)計(jì)算設(shè)備上高速緩存,即被高速緩存管理單元高速緩存(步驟6006)。例如,包含非片段對(duì)象的應(yīng)答消息可以具有表明其不應(yīng)該被高速緩存的指示;在HTTP應(yīng)答消息中,“Cache-Control”頭可以具有“no-cache”指令。如果對(duì)象應(yīng)當(dāng)被高速緩存并且能夠?qū)⑵涓咚倬彺?,則由高速緩存管理單元將其適當(dāng)存儲(chǔ)(步驟6008)。在任一情況下,對(duì)對(duì)象的高速緩存操作完成,并且過(guò)程進(jìn)行分支轉(zhuǎn)移以完成對(duì)應(yīng)答消息的任何其他操作。如果應(yīng)答消息應(yīng)當(dāng)被處理為包含片段,則確定片段是否可高速緩存(步驟6010)。如果否,則處理進(jìn)行分支轉(zhuǎn)移以完成針對(duì)應(yīng)答消息的任何其他操作。如果片段可高速緩存,則確定這個(gè)特定片段是否應(yīng)當(dāng)在這個(gè)特定計(jì)算設(shè)備的高速緩存中被高速緩存(步驟6012)。如果否,則過(guò)程進(jìn)行分支轉(zhuǎn)移以完成針對(duì)應(yīng)答消息的任何其他操作。如果當(dāng)前處理的片段應(yīng)當(dāng)在當(dāng)前計(jì)算設(shè)備上高速緩存,則由高速緩存管理單元將其存儲(chǔ)在計(jì)算設(shè)備的高速緩存中(步驟6014)。如果出現(xiàn)以下任一種情況片段已經(jīng)被高速緩存,被確定為將不在當(dāng)前計(jì)算設(shè)備上高速緩存,或被確定為不可高速緩存,則確定轉(zhuǎn)發(fā)應(yīng)答消息之前是否需要對(duì)片段進(jìn)行頁(yè)面裝配(步驟6016)。如果需要頁(yè)面裝配,則執(zhí)行頁(yè)面裝配(步驟6018)。在任一情況下,來(lái)自應(yīng)答消息的片段或非片段對(duì)象已由當(dāng)前計(jì)算設(shè)備的高速緩存管理單元完全處理,并且在必要時(shí)修改應(yīng)答消息,并且將其轉(zhuǎn)遞到其目的地(步驟6020),從而完成了該過(guò)程?,F(xiàn)在參照?qǐng)D6C,其中的流程圖步驟描述了用于確定消息體是否包含片段對(duì)象的優(yōu)選方法。圖6C提供了可以替換圖6B中的步驟6004的步驟。在一個(gè)優(yōu)選實(shí)施例中,確定接收到的應(yīng)答消息是否包含將有效負(fù)載或消息體標(biāo)識(shí)為片段的消息/協(xié)議頭(步驟6022)。具體如圖4所示,可以將FRAGMENT頭放在HTTP消息中以指示消息的有效負(fù)載包含片段對(duì)象。現(xiàn)在參照?qǐng)D6D,其中的流程圖步驟描述了用于確定片段對(duì)象是否可高速緩存的更加具體的方法。圖6D提供了可以替換圖6B中的步驟6010的步驟。在這個(gè)實(shí)施例中,確定接收的應(yīng)答消息是否包含用于高速緩存控制的協(xié)議頭的指令,該指令將片段標(biāo)識(shí)為可高速緩存的(步驟6024)?,F(xiàn)在參照?qǐng)D6E,其中的流程圖步驟描述了用于確定片段對(duì)象是否可高速緩存的優(yōu)選方法。通過(guò)類似于圖6D的方式,圖6E提供了可以替換圖6B的步驟6010的步驟。在一個(gè)優(yōu)選實(shí)施例中,確定接收的應(yīng)答消息是否具有用于消息/協(xié)議頭的指令,該指令將片段標(biāo)識(shí)為對(duì)于支持片段的高速緩存而言是可高速緩存的,而對(duì)于不支持片段的高速緩存而言是不可高速緩存的(步驟6026)。具體如上所述,“Cache-Control”頭可以被包含在HTTP消息中,并且標(biāo)準(zhǔn)的實(shí)踐是將“no-cache”指令放在“Cache-Control”頭中以防止對(duì)對(duì)象進(jìn)行高速緩存;本發(fā)明的優(yōu)選實(shí)施例對(duì)不支持片段的高速緩存保持這種實(shí)踐,而將“Cache-Control”頭的使用擴(kuò)展為包含″fragmentrules″指令,以指示消息中的片段是可根據(jù)片段高速緩存規(guī)則高速緩存的?,F(xiàn)在參照?qǐng)D6F,其中的流程圖描述了用于確定片段對(duì)象是否應(yīng)當(dāng)在具體計(jì)算設(shè)備上高速緩存的方法。圖6F描述了可以替換圖6B中的步驟6012和6014的過(guò)程;當(dāng)啟動(dòng)該過(guò)程時(shí),已經(jīng)確定了應(yīng)答消息包含可高速緩存的片段。該處理以確定下游設(shè)備是否具有支持片段的高速緩存為開(kāi)始(步驟6028)。下游設(shè)備是當(dāng)前計(jì)算設(shè)備將向其轉(zhuǎn)發(fā)應(yīng)答消息的計(jì)算設(shè)備。如果下游設(shè)備不具有支持片段的高速緩存,則當(dāng)前計(jì)算設(shè)備的高速緩存管理單元將當(dāng)前正處理的片段對(duì)象高速緩存(步驟6030),并且過(guò)程完成。如果下游設(shè)備具有支持片段的高速緩存,則確定當(dāng)前正處理的片段對(duì)象是否只應(yīng)當(dāng)被高速緩存在最接近目的用戶/客戶端設(shè)備的支持片段的高速緩存中(步驟6032)。如果不是,則當(dāng)前片段對(duì)象也可以高速緩存在當(dāng)前計(jì)算設(shè)備上,并且過(guò)程分支轉(zhuǎn)移到步驟6030以將片段高速緩存。然而如果片段只應(yīng)當(dāng)被高速緩存在最接近目的用戶/客戶端設(shè)備的支持片段的高速緩存中,則當(dāng)前計(jì)算設(shè)備不高速緩存片段,并且過(guò)程完成?,F(xiàn)在參照?qǐng)D6G,其中的流程圖步驟描述了用于確定下游設(shè)備是否具有支持片段的高速緩存的優(yōu)選方法。圖6G提供了可以替換圖6F中的步驟6028的步驟。圖6F和圖6G描述了在接收了應(yīng)答消息之后啟動(dòng)的處理;作為當(dāng)前計(jì)算設(shè)備先前接收和轉(zhuǎn)遞請(qǐng)求消息的結(jié)果,會(huì)接收到該應(yīng)答消息。因此,當(dāng)應(yīng)答消息被接收時(shí),高速緩存管理單元已保存了先前接收的請(qǐng)求消息的某種形式的狀態(tài)信息。對(duì)于確定下游設(shè)備是否具有支持片段的高速緩存,在一個(gè)優(yōu)選實(shí)施例中,確定先前接收的請(qǐng)求消息是否包含具有指示支持片段的指令的消息/協(xié)議頭(步驟6034)。具體如圖4所示,F(xiàn)RAGMENT頭可以被放在HTTP消息中,并且FRAGMENT頭可以包含“supports-fragments”指令?,F(xiàn)在參照?qǐng)D6H,其中的流程圖步驟描述了一個(gè)更加具體的方法,其用于確定當(dāng)前處理的片段對(duì)象是否應(yīng)當(dāng)只被高速緩存在最接近目的用戶/客戶端設(shè)備的支持片段的高速緩存中。圖6H提供了可以替換圖6F中的步驟6032的步驟。在這個(gè)實(shí)施例中,當(dāng)前計(jì)算設(shè)備當(dāng)前正處理的應(yīng)答消息具有包含來(lái)自原始服務(wù)器的指令的消息/協(xié)議頭,該指令指示應(yīng)答消息中的片段只應(yīng)當(dāng)被高速緩存在接近目的用戶/設(shè)備的支持片段的高速緩存中(步驟6036)?,F(xiàn)在參照?qǐng)D6I,其中的流程圖步驟描述了一個(gè)優(yōu)選方法,其用于確定當(dāng)前正處理的片段對(duì)象是否應(yīng)當(dāng)只被高速緩存在最接近目的用戶/客戶端設(shè)備的支持片段的高速緩存中。通過(guò)類似于圖6H的方式,圖6I提供了可以替換圖6F中的步驟6032的步驟。在一個(gè)優(yōu)選實(shí)施例中,當(dāng)前計(jì)算設(shè)備當(dāng)前正處理的應(yīng)答消息具有包含來(lái)自原始服務(wù)器的“private”指令的HTTP“Cache-Control”消息/協(xié)議頭,該指令向該支持片段的高速緩存指示應(yīng)答消息中的片段只應(yīng)當(dāng)被高速緩存在接近目的用戶/設(shè)備的支持片段的高速緩存中(步驟6038)。現(xiàn)在參照?qǐng)D6J,其中的流程圖描述了用于確定在從當(dāng)前計(jì)算設(shè)備返回應(yīng)答消息之前是否需要頁(yè)面裝配的方法。圖6J描述了可以替換圖6B中的步驟6016和6018的過(guò)程;當(dāng)啟動(dòng)這該過(guò)程時(shí),來(lái)自應(yīng)答消息的片段已經(jīng)在必要時(shí)被高速緩存了。通過(guò)例如以類似于圖6F中的步驟6028的方式確定下游設(shè)備是否具有支持片段的高速緩存(步驟6040),過(guò)程開(kāi)始。如果下游設(shè)備具有支持片段的高速緩存,則不需要頁(yè)面裝配,并且過(guò)程完成。如果下游設(shè)備不具有支持片段的高速緩存,則確定當(dāng)前處理的片段是否具有針對(duì)另一個(gè)片段的鏈接(步驟6042)。如果沒(méi)有,則不需要頁(yè)面裝配,并且過(guò)程完成。如果當(dāng)前片段中存在針對(duì)另一個(gè)片段的鏈接,則執(zhí)行頁(yè)面裝配(步驟6044),并且過(guò)程完成?,F(xiàn)在參照?qǐng)D6K,其中的流程圖步驟描述了用于確定當(dāng)前正處理的片段對(duì)象是否具有針對(duì)另一個(gè)片段的鏈接的更加具體的方法。圖6K提供了可以替換圖6J中的步驟6042的步驟。在這個(gè)實(shí)施例中,確定當(dāng)前片段是否具有一個(gè)標(biāo)記語(yǔ)言元素,其包含指示將要被包含的片段的源標(biāo)識(shí)符或源位置的標(biāo)記元素(步驟6046)。具體如圖3所示,可以將FRAGMENTLINK元素放在HTML對(duì)象的主體內(nèi)以指示針對(duì)另一個(gè)片段的鏈接。在HTTP規(guī)范中,源標(biāo)識(shí)符被稱作“Request-URI”(請(qǐng)求URI),即標(biāo)識(shí)要在其上施加請(qǐng)求的資源的標(biāo)識(shí)符。現(xiàn)在參照?qǐng)D6L,其中的流程圖步驟描述了用于確定當(dāng)前處理的片段對(duì)象是否具有針對(duì)另一個(gè)片段的鏈接的另一個(gè)方法。通過(guò)類似于圖6K的方式,圖6L提供了可以替換圖6J中的步驟6042的步驟。在這另一個(gè)實(shí)施例中,確定當(dāng)前正處理的應(yīng)答消息是否包含具有一個(gè)指令的消息/協(xié)議頭,該指令指示應(yīng)答消息的消息體中的片段,即當(dāng)前正處理的片段,具有針對(duì)另一個(gè)片段的鏈接(步驟6048)。通過(guò)掃描該片段以查找FRAGMENTLINK可以確定這一點(diǎn)。然而,遠(yuǎn)為更加高效的方式是使用應(yīng)答頭指示這一點(diǎn),從而避免了不必要的掃描。具體如圖4所示,可以將FRAGMENT頭放在HTTP消息中,并且該FRAGMENT頭可以包含“contains-fragments”指令。這個(gè)指令使得當(dāng)前計(jì)算設(shè)備的高速緩存管理單元放棄用于搜索FRAGMENTLINK元素的當(dāng)前片段掃描?,F(xiàn)在參照?qǐng)D6M,其中的流程圖描述了用于執(zhí)行頁(yè)面裝配的過(guò)程。圖6M提供了可以替換圖6B中的步驟6018或圖6J中的步驟6044的步驟。通過(guò)獲得來(lái)自應(yīng)答消息的當(dāng)前片段中包含的鏈接片段的源標(biāo)識(shí)符,例如URI,該過(guò)程開(kāi)始(步驟6050)。接著使用該源標(biāo)識(shí)符獲得鏈接片段(步驟6052)。接著組合獲得的片段和來(lái)自應(yīng)答消息的當(dāng)前片段以形成裝配頁(yè)面(步驟6054),即新片段,并且過(guò)程完成。組合諸片段的內(nèi)容取決于用于片段內(nèi)容類型的編碼規(guī)則。例如,標(biāo)記語(yǔ)言中的每個(gè)元素可以被認(rèn)為是一個(gè)片段,并且通過(guò)在父元素的定界標(biāo)簽間插入標(biāo)記元素,可以在父元素內(nèi)嵌入子元素。然而對(duì)片段進(jìn)行組合還需要考慮對(duì)片段的頭和屬性值進(jìn)行組合的方式,如下面更詳細(xì)地討論的。現(xiàn)在參照?qǐng)D6N,其中的流程圖描述了用于可選地將一個(gè)片段鏈接擴(kuò)展為多個(gè)片段鏈接的過(guò)程?;貋?lái)參照?qǐng)D6M,如果當(dāng)前片段包含多個(gè)片段鏈接,則可不斷重復(fù)步驟6050和6052,直至獲得該多個(gè)鏈接片段,所有這些鏈接片段接著可以被組合以形成單個(gè)裝配頁(yè)面。相反,圖6N描述了一個(gè)過(guò)程,其被用來(lái)將單個(gè)片段鏈接緊湊表示成包含針對(duì)多個(gè)片段的引用,其中該多個(gè)片段被組合以形成裝配頁(yè)面。通過(guò)確定來(lái)自應(yīng)答消息的當(dāng)前片段中的片段鏈接是否指示其應(yīng)當(dāng)擴(kuò)展到多個(gè)片段鏈接(步驟6062),過(guò)程開(kāi)始。如果未指示,則過(guò)程完成;如果指示,則使用與該片段鏈接相關(guān)的信息將該片段鏈接擴(kuò)展到一組多個(gè)片段鏈接(步驟6064)。接著在一個(gè)循環(huán)中處理所述多個(gè)片段鏈接。獲得該組多個(gè)片段鏈接中的下一個(gè)片段鏈接(步驟6066),并且獲得該片段鏈接的源標(biāo)識(shí)符(步驟6068)。接著使用該源標(biāo)識(shí)符獲得所標(biāo)識(shí)的片段(步驟6070)。確定該組多個(gè)片段鏈接中是否存在另一個(gè)片段鏈接(步驟6072),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟6066以處理另一個(gè)片段鏈接。如果不存在剩余的片段鏈接,即已經(jīng)獲得了所有片段,則將所有獲得的片段與來(lái)自原始應(yīng)答消息的片段相組合(步驟6074),并且過(guò)程完成。現(xiàn)在參照?qǐng)D6O,其中的流程圖步驟描述了一個(gè)優(yōu)選方法,其用于確定來(lái)自應(yīng)答消息的當(dāng)前片段中的片段鏈接是否指示其應(yīng)當(dāng)被擴(kuò)展為多個(gè)片段鏈接。圖6O提供了可以替換圖6N中的步驟6062的步驟。在一個(gè)優(yōu)選實(shí)施例中,確定來(lái)自應(yīng)答消息的片段中的片段鏈接的標(biāo)記語(yǔ)言標(biāo)記的元素是否包含指示應(yīng)當(dāng)擴(kuò)展片段鏈接的屬性(步驟6076)。具體如圖3所示,F(xiàn)RAGMENTLINK元素可以具有FOREACH屬性?,F(xiàn)在參照?qǐng)D6P,其中的流程圖描述了用于根據(jù)與片段鏈接相關(guān)的信息將該片段鏈接擴(kuò)展為多個(gè)片段鏈接的過(guò)程。圖6P提供了可以替換圖6N中的步驟6064的一系列步驟。通過(guò)從所包含的、片段鏈接的、標(biāo)記語(yǔ)言標(biāo)記的元素獲得cookie名(步驟6078),過(guò)程開(kāi)始。如圖3所示,F(xiàn)OREACH屬性可以提供被解釋為cookie的名稱的串。獲得cookie的值(步驟6080);cookie的值是表示名稱-值對(duì)列表的串,這些名稱-值對(duì)接著在一個(gè)循環(huán)中被處理。從cookie值獲得下一個(gè)名稱-值對(duì)(步驟6082),并且通過(guò)使用該名稱-數(shù)值對(duì),例如將名稱-值對(duì)用作查詢參數(shù),產(chǎn)生片段鏈接(步驟6084)。接著確定cookie值中是否存在另一個(gè)名稱-值對(duì)(步驟6086),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟6082以處理另一個(gè)名稱-值對(duì)。例如,可以對(duì)每個(gè)名稱-值對(duì)產(chǎn)生一個(gè)FRAGMENTLINK元素,從而將原始FRAGMENTLINK元素?cái)U(kuò)展為替換原始FRAGMENTLINK元素的一組多個(gè)FRAGMENTLINK元素。如果不存在剩余的名稱-值對(duì),則過(guò)程完成?,F(xiàn)在參照?qǐng)D6Q,其中的流程圖描述了用于使用片段的源標(biāo)識(shí)符得到片段的過(guò)程。圖6Q給出了可以替換圖6M中的步驟6052或圖6N的步驟6070的過(guò)程。圖6Q中的過(guò)程在已經(jīng)確定片段的源標(biāo)識(shí)符之后開(kāi)始。通過(guò)確定在當(dāng)前計(jì)算設(shè)備的本地高速緩存內(nèi)是否存在涉及源標(biāo)識(shí)符的高速緩存命中(步驟6092),過(guò)程開(kāi)始。如果存在,則能夠從高速緩存獲得片段(步驟6094),并且獲得的片段被返回給調(diào)用例程(步驟6096)。如果獲得的片段包含片段鏈接,則過(guò)程循環(huán)回到步驟6092以獲得該片段鏈接所標(biāo)識(shí)的片段(步驟6098),從而繼續(xù)過(guò)程以獲得所有子片段。如果在步驟6092確定本地高速緩存內(nèi)存在涉及源標(biāo)識(shí)符的高速緩存未命中,則產(chǎn)生請(qǐng)求消息(步驟6100),并且通過(guò)使用該源標(biāo)識(shí)符作為目的標(biāo)識(shí)符來(lái)發(fā)送該請(qǐng)求消息(步驟6102)。如參照?qǐng)D4所述,請(qǐng)求消息會(huì)包含“supports-fragments”指令,因?yàn)楫?dāng)前計(jì)算設(shè)備包含支持片段的高速緩存管理單元。高速緩存管理單元接著等待對(duì)請(qǐng)求消息的應(yīng)答(步驟6104)。最好為請(qǐng)求產(chǎn)生一個(gè)線程,并且該線程在等待應(yīng)答時(shí)休眠,同時(shí)計(jì)算設(shè)備執(zhí)行其它操作。在接收到應(yīng)答消息之后,獲得應(yīng)答消息的消息體中的片段(步驟6106)并且將其高速緩存(步驟6108)。如上所述,獲得的片段被返回給調(diào)用例程,并且如果獲得的片段包含片段鏈接,則過(guò)程循環(huán)回到步驟6092以獲得由該片段鏈接標(biāo)識(shí)的片段,從而繼續(xù)該過(guò)程以獲得所有子片段。否則,獲得片段的過(guò)程完成。現(xiàn)在參照?qǐng)D6R,其中的流程圖描述了當(dāng)在支持片段的高速緩存管理單元內(nèi)高速緩存片段時(shí)執(zhí)行的某些處理。圖6R提供了可以替換圖6B中的步驟6014或圖6F的步驟6030的過(guò)程。在已經(jīng)在當(dāng)前計(jì)算設(shè)備上的應(yīng)答消息中接收到片段之后,開(kāi)始圖6R中的過(guò)程。通過(guò)獲得與片段相關(guān)的源標(biāo)識(shí)符,例如應(yīng)答消息中的URI(步驟6112),以及與片段相關(guān)的規(guī)則列表(如果應(yīng)答消息中存在規(guī)則列表的話)(步驟6114),過(guò)程開(kāi)始。以和URI路徑相關(guān)的方式在規(guī)則列表數(shù)據(jù)庫(kù)中存儲(chǔ)規(guī)則列表(步驟6116),以便以后當(dāng)嘗試為正處理的請(qǐng)求產(chǎn)生高速緩存命中時(shí)使用。使用規(guī)則列表來(lái)指導(dǎo)生成高速緩存ID,該高速緩存ID用于高速緩存應(yīng)答消息內(nèi)的片段(步驟6118)。接著使用高速緩存ID來(lái)產(chǎn)生高速緩存索引(步驟6120);高速緩存索引被用來(lái)確定片段存儲(chǔ)器,即高速緩存存儲(chǔ)器內(nèi)應(yīng)當(dāng)存儲(chǔ)來(lái)自應(yīng)答消息的片段的位置。通過(guò)用散列算法處理高速緩存ID,可以產(chǎn)生高速緩存索引。本發(fā)明優(yōu)選實(shí)施例的技術(shù)的靈活之處在于,在以符合使用伴隨片段的高速緩存ID規(guī)則的技術(shù)的方式產(chǎn)生了高速緩存ID之后,高速緩存管理單元的每個(gè)實(shí)現(xiàn)可以使用其自己的算法計(jì)算高速緩存索引。接著片段和任何其他必要信息或元數(shù)據(jù)(包括伴隨片段的HTTP應(yīng)答消息中的頭或等價(jià)信息)被存儲(chǔ)在高速緩存中(步驟6122),并且以和高速緩存索引關(guān)聯(lián)的方式存儲(chǔ)新產(chǎn)生的高速緩存ID(步驟6124)。或者,可以每當(dāng)必要時(shí)計(jì)算高速緩存索引,因而可能不必存儲(chǔ)高速緩存索引。作為另一個(gè)替代方案,高速緩存ID可以直接被用作某種類型的存儲(chǔ)器索引或數(shù)據(jù)庫(kù)標(biāo)識(shí)符,因而可以不必計(jì)算單獨(dú)的高速緩存索引。如果存在任何與應(yīng)答消息內(nèi)的片段相關(guān)的依賴關(guān)系,則獲得該依賴關(guān)系(步驟6126),并且以和片段的高速緩存ID關(guān)聯(lián)的方式存儲(chǔ)該依賴關(guān)系(步驟6128)?,F(xiàn)在參照?qǐng)D6S,其中的流程圖描述了一個(gè)過(guò)程,其中如果在包含高速緩存管理單元的計(jì)算設(shè)備上高速緩存了片段,則支持片段的高速緩存管理單元可以使用該過(guò)程獲得此片段。換言之,圖6S描述了可以被用來(lái)例如響應(yīng)對(duì)請(qǐng)求消息的檢查而確定是否能夠在支持片段的高速緩存上產(chǎn)生高速緩存命中的過(guò)程。通過(guò)獲得與請(qǐng)求相關(guān)的源標(biāo)識(shí)符,例如URI路徑(步驟6132),過(guò)程開(kāi)始。接著搜索規(guī)則列表數(shù)據(jù)庫(kù)以確定在規(guī)則列表數(shù)據(jù)庫(kù)內(nèi)是否存在用于該URI路徑的高速緩存ID規(guī)則列表(步驟6134)。如果不存在與該URI路徑相關(guān)的規(guī)則列表,則返回高速緩存未命中指示(步驟6136),并且過(guò)程完成。如果存在與URI路徑相關(guān)的規(guī)則列表,則使用規(guī)則列表內(nèi)的規(guī)則來(lái)產(chǎn)生高速緩存ID(步驟6138),其中假定能夠產(chǎn)生高速緩存ID,即存在成功計(jì)算至少一個(gè)規(guī)則所需的所有必要信息。接著確定高速緩存ID先前是否已經(jīng)被用來(lái)存儲(chǔ)片段(步驟6140),即是否存在高速緩存命中。如果沒(méi)有,則返回高速緩存未命中指示,并且過(guò)程完成。如果存在高速緩存命中,則獲得與高速緩存ID相關(guān)的高速緩存索引(步驟6142),這使得能夠隨后使用高速緩存索引以獲得適當(dāng)片段(步驟6144)。接著將該片段返回給請(qǐng)求方(步驟6146),從而完成過(guò)程?,F(xiàn)在參照?qǐng)D6T,其中的流程圖描述了用于組合與多個(gè)片段相關(guān)的頭值和屬性值的過(guò)程。圖6T提供了可以替換圖6M中的步驟6054或圖6N中的步驟6074的過(guò)程。無(wú)論是通過(guò)應(yīng)答消息接收的,還是從計(jì)算設(shè)備的高速緩存中獲得的,每個(gè)將被組合的片段均具有與應(yīng)答消息中的每個(gè)片段一起接收到的相關(guān)的一組協(xié)議頭。這些頭和屬性的值被合并成針對(duì)每個(gè)頭或?qū)傩缘膯蝹€(gè)指令/值。通過(guò)獲得將被組合的所有片段的下一個(gè)頭類型的各頭值(步驟6152),過(guò)程開(kāi)始。接著將適當(dāng)?shù)慕M合函數(shù)應(yīng)用于全部這些頭值(步驟6154),并且接著設(shè)置組合頭值或者說(shuō)使其與裝配頁(yè)面或片段相關(guān)(步驟6156)。接著確定是否存在另一個(gè)將被處理的頭類型(步驟6158),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟6152以處理另一個(gè)頭類型。在已經(jīng)處理了所有的頭之后,過(guò)程接著獲得將被組合的所有片段的下一個(gè)屬性類型的諸屬性值(步驟6160)。接著將適當(dāng)?shù)慕M合函數(shù)應(yīng)用于全部這些屬性值(步驟6162),并且接著設(shè)置組合屬性值或者說(shuō)使其與裝配頁(yè)面或片段相關(guān)(步驟6164)。接著確定是否存在另一個(gè)將被處理的屬性類型(步驟6166),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟6160以處理另一個(gè)屬性類型;否則,過(guò)程完成。現(xiàn)在參照?qǐng)D6U,其中的流程圖描述了代表一系列針對(duì)頭類型和屬性值的組合函數(shù)的一組步驟。圖6U表示可以在圖6T的步驟6154或6162中使用的某些組合函數(shù);所示出的組合函數(shù)并不是旨在作為高速緩存管理單元中可能存在的組合函數(shù)的完整列表。通過(guò)確定是否正在組合HTTP“Content-Length”字段(步驟6168),過(guò)程開(kāi)始。如果未組合,則跳過(guò)下一個(gè)步驟;否則,組合的“Content-Length”字段的值是所有“Content-Length”字段的和(步驟6170)。通過(guò)確定是否正在組合HTTP“Last-Modified”字段,過(guò)程繼續(xù)執(zhí)行(步驟6172)。如果未組合,則跳過(guò)下一個(gè)步驟;否則,組合的“Last-Modified”字段的值是所有“Last-Modified”字段中最近的(步驟6174)。通過(guò)確定是否正在組合到期時(shí)間值,過(guò)程繼續(xù)執(zhí)行(步驟6176)。如果未在組合,則跳過(guò)下一個(gè)步驟;否則,根據(jù)以下考慮設(shè)置組合的到期時(shí)間值的值(步驟6178)。支持片段的高速緩存應(yīng)當(dāng)尊重根據(jù)片段中的時(shí)間進(jìn)行無(wú)效的應(yīng)答頭和裝配頁(yè)面中的應(yīng)答頭之間的關(guān)系。裝配過(guò)程應(yīng)當(dāng)按照下面的方式確定裝配頁(yè)面的無(wú)效時(shí)間。首先,根據(jù)每個(gè)片段的作為絕對(duì)時(shí)間的“Expires”頭、具有作為相對(duì)時(shí)間的“max-age”指令的“Cache-Control”頭、和“Date”頭,計(jì)算所有片段的短路等價(jià)時(shí)間間隔,其中包含最高級(jí)片段和所有遞歸包含的片段。這是通過(guò)使用“Date”頭值將絕對(duì)時(shí)間轉(zhuǎn)換成增量時(shí)間來(lái)進(jìn)行的。這個(gè)值可以被稱作“minimumRelativeTime”(最小相對(duì)時(shí)間)。接著,裝配頁(yè)面的“Expires”頭中的值被設(shè)置成“Date”頭中的值加上該計(jì)算的minimumRelativeTime值。這是不支持HTTP/1.1“Cache-Control”頭的高速緩存所需的。接著,裝配頁(yè)面的″max-age″指令被設(shè)置成該計(jì)算的minimumRelativeTime值,因?yàn)镠TTP/1.1規(guī)范規(guī)定“max-age”指令覆蓋“Expires”頭,即使“Expires”頭限制性更強(qiáng)。這是支持HTTP/1.1的高速緩存所需的。過(guò)程中的最后步驟將內(nèi)容編碼類型設(shè)置成適當(dāng)值(步驟6180)。在第一方案中,根據(jù)HTTP/1.1規(guī)范,如果已知新編碼是客戶機(jī)可接受的,高速緩存可以修改內(nèi)容編碼,只要在正被組合的頭中的任一個(gè)內(nèi)不存在“no-transform”(無(wú)轉(zhuǎn)換)高速緩存控制指令。在第二方案中,將包含的片段的內(nèi)容編碼改變成與最高級(jí)片段相同?,F(xiàn)在參照?qǐng)D6V,圖6V的流程圖描述了當(dāng)處理請(qǐng)求消息時(shí)支持片段的高速緩存管理單元可以使用的過(guò)程。與描述對(duì)應(yīng)答消息的處理的圖6B相反,圖6V描述了與請(qǐng)求消息的處理相關(guān)的某些步驟。通過(guò)接收請(qǐng)求消息來(lái)開(kāi)始該過(guò)程(步驟6192),之后從請(qǐng)求消息獲得源標(biāo)識(shí)符(步驟6194)。使用源標(biāo)識(shí)符來(lái)從本地高速緩存獲得標(biāo)識(shí)的對(duì)象或片段,即發(fā)生了高速緩存命中,或者通過(guò)請(qǐng)求獲得對(duì)象或片段,即發(fā)生了高速緩存未命中(步驟6196)。前面參照?qǐng)D6Q描述了與高速緩存命中或高速緩存未命中相關(guān)的過(guò)程。在任一情況下,如果需要頁(yè)面裝配,則執(zhí)行此頁(yè)面裝配(步驟6198);前面參照?qǐng)D6T描述了與頁(yè)面裝配相關(guān)的過(guò)程。接著針對(duì)所接收的請(qǐng)求消息返回應(yīng)答消息(步驟6200),從而完成該過(guò)程。現(xiàn)在參照?qǐng)D6W,其中的流程圖描述了根據(jù)本發(fā)明優(yōu)選實(shí)施例當(dāng)處理無(wú)效消息時(shí)支持片段的高速緩存管理單元可以使用的過(guò)程。如上所述,本發(fā)明優(yōu)選實(shí)施例的技術(shù)不規(guī)定任何具體的無(wú)效算法,并且圖6W中描述的過(guò)程僅僅是使用依賴關(guān)系ID的例子。通過(guò)在計(jì)算設(shè)備上從已發(fā)布或提供了可能高速緩存在該計(jì)算設(shè)備中的片段的原始服務(wù)器接收無(wú)效請(qǐng)求消息(步驟6202),過(guò)程開(kāi)始。這個(gè)請(qǐng)求包含依賴關(guān)系ID的一列表。假定原始服務(wù)器不產(chǎn)生沖突的依賴關(guān)系;通過(guò)用包含至少其域名的應(yīng)用ID限定依賴關(guān)系,假定能夠維護(hù)全球唯一的依賴關(guān)系。通常需要進(jìn)行驗(yàn)證以使應(yīng)用ID與無(wú)效方相關(guān),使得無(wú)效方只能無(wú)效其自己的內(nèi)容。接著確定依賴關(guān)系數(shù)據(jù)庫(kù)中的任何依賴關(guān)系是否匹配接收到的消息內(nèi)的一或多個(gè)依賴關(guān)系(步驟6210),并且如果匹配,則獲得與匹配一或多個(gè)依賴關(guān)系相關(guān)的高速緩存ID列表(步驟6212)。接著使用高速緩存ID來(lái)從高速緩存中清除相關(guān)片段(步驟6214)。如果需要或適當(dāng),也可以清除相關(guān)規(guī)則列表和依賴關(guān)系??梢詫⒖蛇x應(yīng)答返回給無(wú)效請(qǐng)求消息的發(fā)起方(步驟6216)。如果沒(méi)有依賴關(guān)系匹配,則過(guò)程分支轉(zhuǎn)移到步驟6216。在任一情況下,過(guò)程完成。支持片段的高速緩存的高速緩存管理單元之間的某些協(xié)同的例子現(xiàn)在參照?qǐng)D7A,圖7A的方塊圖描述了Web應(yīng)用服務(wù)器和客戶機(jī)之間的某些數(shù)據(jù)流,以說(shuō)明某些高速緩存執(zhí)行片段裝配的時(shí)機(jī)。客戶端設(shè)備700包括不支持片段的高速緩存管理單元702,其產(chǎn)生頁(yè)面請(qǐng)求并且向中間服務(wù)器704發(fā)送請(qǐng)求。不為該客戶端設(shè)備所知的是,請(qǐng)求的頁(yè)面實(shí)際包括父片段和針對(duì)子片段的鏈接。中間服務(wù)器704接收請(qǐng)求,但是高速緩存管理單元706不支持片段,也不具有所請(qǐng)求頁(yè)面的高速緩存版本。請(qǐng)求接著被轉(zhuǎn)發(fā)到中間服務(wù)器708,其包括支持片段的高速緩存管理單元710。中間服務(wù)器708不具有所請(qǐng)求頁(yè)面的高速緩存版本;中間服務(wù)器708在向中間服務(wù)器712發(fā)送請(qǐng)求消息之前向請(qǐng)求消息加入“Fragment:supports-fragments”頭,中間服務(wù)器712包括不支持片段的高速緩存管理單元714。中間服務(wù)器712不具有所請(qǐng)求頁(yè)面的高速緩存版本,并且向包括支持片段的高速緩存管理單元718的Web應(yīng)用服務(wù)器716發(fā)送/轉(zhuǎn)發(fā)請(qǐng)求消息。根據(jù)包含“Fragment:supports-fragments”頭的傳入請(qǐng)求消息,Web應(yīng)用服務(wù)器716可以確定一下游計(jì)算設(shè)備具有能夠充當(dāng)頁(yè)面裝配器的支持片段的高速緩存管理單元。因此,不是在應(yīng)答中返回整個(gè)裝配頁(yè)面,而是由Web應(yīng)用服務(wù)器716返回具有包含F(xiàn)RAGMENTLINK子片段的父片段的應(yīng)答。中間服務(wù)器712不支持片段,所以它僅僅轉(zhuǎn)發(fā)應(yīng)答。支持片段的高速緩存管理單元710認(rèn)識(shí)到它是最接近最終用戶或客戶機(jī)的支持片段的高速緩存;原始請(qǐng)求不包含“Fragment:supports-fragments”頭,所以支持片段的高速緩存管理單元710確定它應(yīng)當(dāng)在返回應(yīng)答之前執(zhí)行頁(yè)面裝配。在頁(yè)面裝配過(guò)程期間,支持片段的高速緩存管理單元710請(qǐng)求和接收鏈接到父片段的子片段。子片段和父片段被合并成單個(gè)裝配頁(yè)面,并且裝配頁(yè)面被返回到客戶端設(shè)備。中間服務(wù)器704轉(zhuǎn)遞應(yīng)答到客戶端設(shè)備700,客戶端設(shè)備700接著向最終用戶呈現(xiàn)裝配頁(yè)面。中間服務(wù)器704和客戶端設(shè)備700均不會(huì)高速緩存裝配頁(yè)面,因?yàn)閼?yīng)答會(huì)標(biāo)記有將防止這些設(shè)備高速緩存裝配頁(yè)面的“no-cache”指令。中間服務(wù)器708將會(huì)高速緩存父片段和子片段二者?,F(xiàn)在參照?qǐng)D7B,圖7B的方塊圖描述了Web應(yīng)用服務(wù)器和客戶機(jī)之間的某些數(shù)據(jù)流,以便說(shuō)明如何控制一組設(shè)備以在最接近最終用戶或客戶端設(shè)備的高速緩存中高速緩存片段??蛻舳嗽O(shè)備720包括不支持片段的高速緩存管理單元722,其產(chǎn)生對(duì)對(duì)象的請(qǐng)求并且發(fā)送請(qǐng)求到中間服務(wù)器724。不為客戶端設(shè)備所知的是,所請(qǐng)求對(duì)象實(shí)際是片段。中間服務(wù)器724接收請(qǐng)求;由于高速緩存管理單元726支持片段但是沒(méi)有所請(qǐng)求片段的高速緩存版本,高速緩存管理單元726向請(qǐng)求加入“Fragment:supports-fragments”頭并且轉(zhuǎn)發(fā)請(qǐng)求到目的服務(wù)器。中間服務(wù)器728接收請(qǐng)求;由于高速緩存管理單元730不具有所請(qǐng)求片段的高速緩存版本,支持片段的高速緩存管理單元730確保“Fragment:supports-fragments”頭被包含在請(qǐng)求消息中,并且轉(zhuǎn)發(fā)請(qǐng)求消息到目的服務(wù)器。中間服務(wù)器732包含不支持片段并且沒(méi)有所請(qǐng)求對(duì)象的高速緩存版本的高速緩存管理單元734,因而它轉(zhuǎn)發(fā)請(qǐng)求。根據(jù)包含“Fragment:supports-fragments”頭的傳入請(qǐng)求消息,Web應(yīng)用服務(wù)器736可以確定下游計(jì)算設(shè)備具有支持片段的高速緩存管理單元。因此,Web應(yīng)用服務(wù)器736可以確定返回包含片段的應(yīng)答是適當(dāng)?shù)?。然而Web應(yīng)用服務(wù)器736將應(yīng)答消息標(biāo)記上“Cache-Control:private”頭,這會(huì)導(dǎo)致應(yīng)答中的片段僅被最接近最終用戶或客戶端設(shè)備的支持片段的高速緩存來(lái)高速緩存;高速緩存管理單元738不高速緩存應(yīng)答中的片段。中間服務(wù)器732不支持片段。高速緩存管理單元734識(shí)別出“private”指令,所以它不高速緩存片段,而中間服務(wù)器732僅僅轉(zhuǎn)發(fā)應(yīng)答。相反,高速緩存管理單元730支持片段,但是它認(rèn)識(shí)到原始請(qǐng)求被標(biāo)記上“Fragment:supports-fragments”頭,因此下游設(shè)備可以在更接近最終用戶或客戶端設(shè)備的位置高速緩存片段。這樣,高速緩存管理單元730將“private”指令解釋為指示其不要高速緩存應(yīng)答中的片段。高速緩存管理單元726也支持片段,但是它認(rèn)識(shí)到原始請(qǐng)求未標(biāo)記上“Fragment:support-fragments”頭,因此沒(méi)有下游設(shè)備可以在更接近最終用戶或客戶端設(shè)備的位置高速緩存片段。因此,高速緩存管理單元726將“private”指令解釋為指示其高速緩存應(yīng)答中的片段。中間服務(wù)器724接著轉(zhuǎn)發(fā)應(yīng)答到客戶端設(shè)備720;高速緩存管理單元722不支持片段,所以它將“private”指令解釋為指示其不要高速緩存片段。被用來(lái)支持特定于角色或特定于類別的內(nèi)容的高速緩存的支持片段的高速緩存的例子現(xiàn)在參照?qǐng)D8A-8D,其中的數(shù)據(jù)流圖描述了在客戶機(jī)、中間的支持片段的高速緩存或服務(wù)器內(nèi)發(fā)生的某些處理步驟,以說(shuō)明能夠根據(jù)本發(fā)明的優(yōu)選實(shí)施例實(shí)現(xiàn)特定于角色或特定于類別的動(dòng)態(tài)內(nèi)容的高速緩存。某些Web內(nèi)容可以進(jìn)行分類,使得根據(jù)用戶與特定機(jī)構(gòu)的關(guān)聯(lián)或用戶在機(jī)構(gòu)內(nèi)的角色,將Web內(nèi)容專用于一組用戶。例如,企業(yè)可以向第一公司發(fā)布其產(chǎn)品的定價(jià)數(shù)據(jù)庫(kù)的一個(gè)版本,而向第二公司發(fā)布其產(chǎn)品的定價(jià)數(shù)據(jù)庫(kù)的第二版本。例如,第二公司可以由于購(gòu)買(mǎi)大量的該企業(yè)產(chǎn)品而得到很大的批量折扣。當(dāng)?shù)谝还镜牡谝还蛦T訪問(wèn)該企業(yè)的Web站點(diǎn)時(shí),這個(gè)雇員應(yīng)當(dāng)接收到顯示針對(duì)第一公司的價(jià)格信息的Web頁(yè)面。價(jià)格信息可能相對(duì)頻繁地改變,所以和靜態(tài)內(nèi)容相比較,價(jià)格信息更加難以進(jìn)行高速緩存。當(dāng)?shù)诙镜墓蛦T訪問(wèn)企業(yè)的Web站點(diǎn)時(shí),這個(gè)雇員應(yīng)當(dāng)接收到顯示針對(duì)第二公司的價(jià)格信息的Web頁(yè)面。在本發(fā)明的優(yōu)選實(shí)施例中,可以高速緩存針對(duì)不同客戶公司的雇員產(chǎn)生的Web頁(yè)面,使得它們可被相同公司的其它雇員得到。當(dāng)?shù)谝还镜牡诙蛦T訪問(wèn)企業(yè)的Web站點(diǎn)時(shí),這個(gè)雇員可以接收到為該相同公司的第一雇員高速緩存的Web頁(yè)面。換言之,已經(jīng)對(duì)企業(yè)的內(nèi)容進(jìn)行了分類,以由不同機(jī)構(gòu),即不同客戶公司所使用。使用第二個(gè)例子,一公司可以具有包含人力資源信息的Web站點(diǎn),但是某些信息應(yīng)當(dāng)限于僅僅由公司的管理層雇員來(lái)查看。然而,即使管理層信息可能是動(dòng)態(tài)內(nèi)容,也不必為查看信息的每個(gè)管理人員高速緩存管理層信息的多個(gè)副本。根據(jù)本發(fā)明的優(yōu)選實(shí)施例,可以高速緩存例如管理或者非管理的特定于角色的內(nèi)容,并且用戶在組織內(nèi)的角色可以被用來(lái)協(xié)助確定返回給用戶哪一組高速緩存內(nèi)容??梢允褂妙悇e區(qū)分以一般方式來(lái)描述這些例子。根據(jù)可以應(yīng)用于正訪問(wèn)內(nèi)容的用戶的特征,可以將內(nèi)容類別的概念應(yīng)用于用戶角色、機(jī)構(gòu)實(shí)體等等。圖8A-8D提供了有關(guān)使用本發(fā)明的優(yōu)選實(shí)施例高速緩存特定于類別的內(nèi)容的方式的一般例子。參照?qǐng)D8A,例如瀏覽器的客戶端應(yīng)用程序產(chǎn)生頁(yè)面請(qǐng)求(步驟802)并且將其發(fā)送給應(yīng)用服務(wù)器(步驟804)。中間的支持片段的高速緩存不具有所請(qǐng)求頁(yè)面的副本,所以它不能返回高速緩存的副本。應(yīng)用服務(wù)器確定所請(qǐng)求頁(yè)面被限制為由某個(gè)類別的用戶來(lái)查看,但是應(yīng)用服務(wù)器檢測(cè)出請(qǐng)求沒(méi)有伴隨有將請(qǐng)求方標(biāo)識(shí)為限制用戶類別的成員的所需cookie(步驟806)。服務(wù)器產(chǎn)生驗(yàn)證質(zhì)詢頁(yè)面(步驟808)并且將其發(fā)送給客戶機(jī)(步驟810);驗(yàn)證質(zhì)詢頁(yè)面被標(biāo)記為不可高速緩存的,所以中間高速緩存不高速緩存該頁(yè)面。客戶機(jī)接收驗(yàn)證質(zhì)詢頁(yè)面并且呈現(xiàn)給用戶(步驟812),用戶接著提供用戶ID和口令(步驟814),用戶ID和口令被發(fā)回到服務(wù)器(步驟816)。服務(wù)器驗(yàn)證用戶的信息(步驟818)并且使用用戶ID確定所標(biāo)識(shí)的用戶所屬的用戶類別(步驟820)。在確定了諸如管理角色的用戶類別之后,服務(wù)器產(chǎn)生類別cookie,其包含允許標(biāo)識(shí)所確定的用戶類別的信息(步驟822)。還產(chǎn)生最初請(qǐng)求的頁(yè)面(步驟824),并且將該頁(yè)面和類別cookie發(fā)送給客戶機(jī)(步驟826)。直到此時(shí),中間高速緩存還沒(méi)有高速緩存任何內(nèi)容。然而,當(dāng)前返回的頁(yè)面被標(biāo)記為可根據(jù)支持片段的高速緩存規(guī)則高速緩存的,所以中間高速緩存使用頁(yè)面的標(biāo)識(shí)符、伴隨頁(yè)面的類別cookie、和伴隨給客戶機(jī)的應(yīng)答消息的片段高速緩存規(guī)則中規(guī)定中間高速高速緩存使用的任何其他適當(dāng)信息,存儲(chǔ)頁(yè)面(步驟828)。在客戶機(jī)接收到所請(qǐng)求頁(yè)面之后,它被呈現(xiàn)給用戶(步驟830),并且伴隨的類別cookie被客戶端應(yīng)用程序存儲(chǔ)在其cookie高速緩存中(步驟832)。參照?qǐng)D8B,其中示出一個(gè)用于更新先前發(fā)出的類別cookie的例子。客戶端應(yīng)用程序產(chǎn)生頁(yè)面請(qǐng)求(步驟842),該頁(yè)面請(qǐng)求類似于圖8A示出的、例如來(lái)自相同域的頁(yè)面請(qǐng)求。然而,用戶已經(jīng)執(zhí)行了導(dǎo)致用戶類別改變的某種操作。例如,用戶可能本來(lái)在查看與作為某個(gè)雇員組的管理人員的用戶角色有關(guān)的頁(yè)面,并且用戶可能接著決定查看與作為財(cái)務(wù)主管的用戶角色有關(guān)的頁(yè)面。由于用戶先前已經(jīng)通過(guò)驗(yàn)證,服務(wù)器不應(yīng)該執(zhí)行另一個(gè)驗(yàn)證過(guò)程。然而服務(wù)器應(yīng)當(dāng)發(fā)出針對(duì)該用戶的新類別cookie。頁(yè)面請(qǐng)求和伴隨的類別cookie被發(fā)送給服務(wù)器(步驟844)。中間高速緩存不具有所請(qǐng)求頁(yè)面,所以它發(fā)生高速緩存未命中。服務(wù)器確定客戶機(jī)正請(qǐng)求需要新類別cookie值的操作(步驟846),并且發(fā)出新的類別cookie(步驟848)。還產(chǎn)生所請(qǐng)求頁(yè)面(步驟850),并且所請(qǐng)求頁(yè)面和新發(fā)出的類別cookie被返回(步驟852)。中間高速緩存接著根據(jù)新cookie值存儲(chǔ)頁(yè)面(步驟854)??蛻魴C(jī)接收和呈現(xiàn)所請(qǐng)求頁(yè)面(步驟856),并且新cookie值被存儲(chǔ)在客戶機(jī)的cookie高速緩存中(步驟858)。通過(guò)這種方式,當(dāng)更新類別cookie時(shí)更新中間高速緩存。參照?qǐng)D8C,其中示出了有關(guān)繼續(xù)使用相同類別cookie仍然會(huì)導(dǎo)致高速緩存未命中的方式的例子。客戶端應(yīng)用程序產(chǎn)生頁(yè)面請(qǐng)求(步驟862),該頁(yè)面請(qǐng)求和伴隨的類別cookie被發(fā)送給服務(wù)器(步驟864)。中間高速緩存不具有所請(qǐng)求頁(yè)面,所以它發(fā)生高速緩存未命中。服務(wù)器使用類別cookie中的值動(dòng)態(tài)確定某個(gè)內(nèi)容類型并且產(chǎn)生適當(dāng)?shù)捻?yè)面(步驟866),并且產(chǎn)生的頁(yè)面和未改變的類別cookie被返回(步驟868)。中間高速緩存存儲(chǔ)頁(yè)面(步驟870)并且將其轉(zhuǎn)發(fā)給客戶機(jī)??蛻魴C(jī)接收和呈現(xiàn)所請(qǐng)求頁(yè)面(步驟872);由于類別cookie沒(méi)有改變,未將客戶機(jī)示出為蓋寫(xiě)cookie高速緩存中的類別cookie。根據(jù)本發(fā)明的優(yōu)選實(shí)施例,在步驟828、854和870,中間高速緩存已根據(jù)由服務(wù)器放在應(yīng)答消息中的片段高速緩存規(guī)則存儲(chǔ)了來(lái)自應(yīng)答消息的頁(yè)面的副本。本發(fā)明的優(yōu)選實(shí)施例允許將cookie用于高速緩存ID操作,以區(qū)分類似頁(yè)面的兩個(gè)不同版本,這兩個(gè)不同版本在只有與頁(yè)面相關(guān)的URI被用于高速緩存目的的情況下本來(lái)會(huì)被識(shí)別為相同的。更加重要的是,可以以和類別cookie相關(guān)的方式高速緩存頁(yè)面,使得可以隨后在高速緩存查找過(guò)程中使用類別cookie,從而允許根據(jù)所聲明的類別cookie中的相似性確定高速緩存命中,如圖8D所示。參照?qǐng)D8D,其中示出了有關(guān)兩個(gè)不同用戶使用相同類別cookie仍然會(huì)導(dǎo)致不同用戶對(duì)單個(gè)頁(yè)面的訪問(wèn)中的高速緩存命中的方式的例子。在這個(gè)例子中,不同用戶正訪問(wèn)和圖8C示出的先前例子中的第一用戶訪問(wèn)的相同的頁(yè)面。然而,第二用戶與第一用戶屬于相同的用戶類別。換言之,兩個(gè)用戶可以被描述為屬于相同用戶類別或被分配了相同的角色。例如,這兩個(gè)用戶可以是正查看公司管理人員備忘錄的管理人員,其中備忘錄包含專門(mén)針對(duì)這兩個(gè)用戶所屬的部門(mén)中的管理人員定制的動(dòng)態(tài)內(nèi)容。不是為每個(gè)管理人員產(chǎn)生和高速緩存?zhèn)渫?,而是預(yù)先使備忘錄與管理人員角色相關(guān)。在第一管理人員訪問(wèn)了備忘錄之后,它已經(jīng)被高速緩存,而相同類別中其它管理人員獲得備忘錄的后續(xù)嘗試會(huì)導(dǎo)致高速緩存命中。不同類別中其它管理人員訪問(wèn)備忘錄的后續(xù)嘗試會(huì)導(dǎo)致高速緩存未命中,因?yàn)楹罄m(xù)管理人員會(huì)具有不同的類別cookie,即使備忘錄的兩個(gè)不同版本可以與相同的URI相關(guān)??蛻舳藨?yīng)用程序產(chǎn)生頁(yè)面請(qǐng)求(步驟882),該頁(yè)面請(qǐng)求和屬于第二用戶的伴隨類別cookie被發(fā)送給服務(wù)器(步驟884)。在這種情況下,中間高速緩存具有由請(qǐng)求內(nèi)的URI路徑和相關(guān)聯(lián)的類別cookie所標(biāo)識(shí)的所請(qǐng)求頁(yè)面的副本,所以它發(fā)生高速緩存命中(步驟886)。中間高速緩存能夠無(wú)需向服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求而立即返回所請(qǐng)求頁(yè)面(步驟888),并且客戶機(jī)接收并向第二用戶呈現(xiàn)所請(qǐng)求頁(yè)面(步驟890)。通過(guò)這種方式,中間高速緩存可以實(shí)際存儲(chǔ)相同片段的多個(gè)版本,并且根據(jù)用戶的聲明的類別cookie將適當(dāng)版本的片段返回給用戶,即僅由類別cookie來(lái)確定在其他方面相似的片段的不同版本之間的選擇。下面具體針對(duì)購(gòu)物者組類別進(jìn)一步提供了使用cookie區(qū)分片段的進(jìn)一步例子。處理單個(gè)消息中多個(gè)片段的效率增強(qiáng)現(xiàn)在參照?qǐng)D9A,其中的流程圖描述了可在單個(gè)請(qǐng)求消息中指定多個(gè)片段并且隨后處理所述片段的過(guò)程。圖9A示出的過(guò)程可以和圖6N示出的過(guò)程,或其中特別在組合多個(gè)片段為單個(gè)片段之前需要獲得的這些片段的任何其他過(guò)程結(jié)合使用。在從應(yīng)答消息或高速緩存獲得片段之后,通過(guò)檢查“contains-fragments”指令以確定其是否是葉片段或包含其它片段,過(guò)程開(kāi)始。如果它包含其它片段,對(duì)其進(jìn)行分析以找到這些包含的片段。在收集到所有下一級(jí)片段的源標(biāo)識(shí)符之后,產(chǎn)生單個(gè)批請(qǐng)求(步驟904);批請(qǐng)求可以包含將用于獲得片段的批服務(wù)器端程序,即小服務(wù)程序。批請(qǐng)求包含下一級(jí)片段的所有源標(biāo)識(shí)符,例如URI。假定已經(jīng)檢查了本地高速緩存,以發(fā)現(xiàn)對(duì)于這些下一級(jí)片段中的任何一個(gè)的高速緩存命中;如果存在對(duì)于一個(gè)下一級(jí)片段的高速緩存命中,則不將該片段包含在批請(qǐng)求中。批請(qǐng)求消息接著被發(fā)送給服務(wù)器(步驟906),并且高速緩存管理單元等待接收多部分MIME(多用途網(wǎng)際郵件擴(kuò)展)應(yīng)答(步驟908)。最好為請(qǐng)求產(chǎn)生一個(gè)線程,并且在等待應(yīng)答時(shí)線程休眠,同時(shí)計(jì)算設(shè)備正執(zhí)行其它操作。在接收到應(yīng)答之后,高速緩存管理單元逐個(gè)檢查應(yīng)答中的每個(gè)片段。從多部分的應(yīng)答消息獲得下一片段(步驟910)并且接著將其高速緩存(步驟912)。接著確定是否多部分的應(yīng)答消息中還存在任何其它要被處理的片段(步驟914),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟910以處理另一個(gè)片段。否則,可以分析或檢查新接收的片段以確定這些片段是否包含針對(duì)下一級(jí)片段的鏈接(步驟916),并且如果包含,則過(guò)程分支轉(zhuǎn)移回到步驟902以在必要時(shí)通過(guò)批請(qǐng)求請(qǐng)求更多的片段。否則,在頁(yè)面裝配操作中組合新接收的片段(步驟918),并且過(guò)程完成。現(xiàn)在參照?qǐng)D9B,其中的流程圖描述了可在中間高速緩存管理單元上接收單個(gè)請(qǐng)求消息并且隨后進(jìn)行處理的過(guò)程。圖9B示出的過(guò)程可以和圖6V示出的過(guò)程,或其中在中間高速緩存上處理請(qǐng)求消息的任何其他過(guò)程結(jié)合使用。當(dāng)在中間的支持片段的高速緩存上接收到批請(qǐng)求時(shí)(步驟922),過(guò)程開(kāi)始。接著在循環(huán)中處理批請(qǐng)求內(nèi)的源標(biāo)識(shí)符集合。從請(qǐng)求消息獲得針對(duì)所請(qǐng)求片段中的一個(gè)的下一源標(biāo)識(shí)符(步驟924),并且確定本地高速緩存中是否存在高速緩存命中(步驟926)。如果不存在高速緩存命中,則可以跳過(guò)下一步驟;如果存在高速緩存命中,則可以從批請(qǐng)求消息中清除該源標(biāo)識(shí)符(步驟928)。確定是否批請(qǐng)求消息中還存在任何其它要被處理的源標(biāo)識(shí)符(步驟930),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟924以處理另一個(gè)源標(biāo)識(shí)符。確定是否已經(jīng)在本地高速緩存中找到了所有的所請(qǐng)求片段(步驟932)。如果是,則不必轉(zhuǎn)發(fā)批請(qǐng)求,并且過(guò)程進(jìn)行分支轉(zhuǎn)移以準(zhǔn)備應(yīng)答消息。如果存在至少一個(gè)高速緩存未命中,則其中清除過(guò)一個(gè)或多個(gè)源標(biāo)識(shí)符的修改的批請(qǐng)求被轉(zhuǎn)發(fā)給服務(wù)器(步驟934)??蛇x地,如果存在單個(gè)的剩余源標(biāo)識(shí)符,則批請(qǐng)求可以被改變?yōu)槠胀ㄕ?qǐng)求消息。高速緩存管理單元等待接收多部分MIME應(yīng)答(步驟936);最好為請(qǐng)求產(chǎn)生一個(gè)線程,并且在等待應(yīng)答時(shí)線程休眠,同時(shí)計(jì)算設(shè)備執(zhí)行其它操作。在接收應(yīng)答之后,高速緩存管理單元逐個(gè)檢查應(yīng)答中的每個(gè)片段。從多部分的應(yīng)答消息獲得下一片段(步驟938),并且接著將其高速緩存(步驟940),假定在本地高速緩存內(nèi)高速緩存片段是適合的。確定是否多部分的應(yīng)答消息中還存在任何其它要被處理的片段(步驟942),并且如果存在,則過(guò)程分支轉(zhuǎn)移回到步驟938以處理另一個(gè)片段。假定不分析或檢查新接收的片段以確定這些片段是否包含針對(duì)下一級(jí)片段的鏈接,因?yàn)榭梢约俣ㄟ@個(gè)過(guò)程將在產(chǎn)生了原始批請(qǐng)求的高速緩存管理單元上執(zhí)行;或者,這個(gè)過(guò)程可以通過(guò)類似于參照?qǐng)D9A描述的方式在當(dāng)前高速緩存管理單元上執(zhí)行。在任一情況下,產(chǎn)生具有對(duì)應(yīng)于在原始批請(qǐng)求中接收的源標(biāo)識(shí)符的片段的多部分MIME應(yīng)答(步驟944),并且返回多部分MIME應(yīng)答(步驟946),從而完成過(guò)程?,F(xiàn)在參照?qǐng)D9C,其中的流程圖描述了Web應(yīng)用服務(wù)器上用于處理對(duì)多個(gè)片段的批請(qǐng)求消息的過(guò)程??梢栽谂?qǐng)求消息已經(jīng)過(guò)具有支持片段的高速緩存管理單元的多個(gè)計(jì)算設(shè)備之后執(zhí)行圖9C示出的過(guò)程,其中所述多個(gè)計(jì)算設(shè)備未能滿足片段請(qǐng)求,即多個(gè)設(shè)備可能已發(fā)生高速緩存未命中。通過(guò)在服務(wù)器上接收批請(qǐng)求(步驟952)來(lái)開(kāi)始過(guò)程;批請(qǐng)求包含多個(gè)片段請(qǐng)求,其中依次處理所述片段請(qǐng)求。從批請(qǐng)求消息獲得下一片段請(qǐng)求(步驟954)并且執(zhí)行它(步驟956),其中可能包括產(chǎn)生片段,之后可選地,可能需要為發(fā)送而對(duì)片段進(jìn)行格式化或標(biāo)記(步驟958),雖然片段可能已經(jīng)預(yù)先在服務(wù)器上被高速緩存了。確定是否批請(qǐng)求消息中還存在另一個(gè)片段請(qǐng)求(步驟960),并且如果存在,則過(guò)程進(jìn)行分支轉(zhuǎn)移以處理另一個(gè)片段請(qǐng)求。否則,產(chǎn)生具有所有請(qǐng)求的片段的多部分MIME應(yīng)答消息(步驟962),并且返回該應(yīng)答消息,從而完成過(guò)程。降低高速緩存大小的例子現(xiàn)在參照?qǐng)D10A-10D,其中提供一組例子以說(shuō)明可以通過(guò)本發(fā)明的優(yōu)選實(shí)施例實(shí)現(xiàn)的降低高速緩存大小的有利效果。用于在特定應(yīng)用中選擇什么來(lái)構(gòu)成片段的一個(gè)準(zhǔn)則是一段內(nèi)容被不同頁(yè)面共享的頻度。如果一段內(nèi)容被頻繁共享,則使其成為片段會(huì)大大降低高速緩存的大小,因?yàn)榭梢詫⒃撈未鎯?chǔ)一次,而不是在許多頁(yè)面中重復(fù)該片段。于是,片段提供了在許多頁(yè)面之間的一種壓縮形式以降低高速緩存大小。這種壓縮的優(yōu)點(diǎn)可以被視作成本降低,例如對(duì)于固定命中率降低高速緩存大小,性能改進(jìn),例如增加固定大小高速緩存的命中率,或其組合。圖10A-10D示出了本發(fā)明優(yōu)選實(shí)施例的使用的各種情景,以及與同等的現(xiàn)有技術(shù)情景相比較可以實(shí)現(xiàn)的高速緩存大小的降低。參照?qǐng)D10A,其中示出了共享的側(cè)條(sidebar)情景。每個(gè)頁(yè)面包括側(cè)條部分和其它頁(yè)面部分;根據(jù)現(xiàn)有技術(shù),每個(gè)頁(yè)面在不支持片段的高速緩存中被存儲(chǔ)為具有所有從屬對(duì)象的完整頁(yè)面。在本發(fā)明的優(yōu)選實(shí)施例中,每個(gè)頁(yè)面被組成為包含側(cè)條片段和其余頁(yè)面片段,所有這些被存儲(chǔ)在支持片段的高速緩存中。顯然,在本發(fā)明的優(yōu)選實(shí)施例中,側(cè)條片段只存儲(chǔ)一次。換言之,特定站點(diǎn)上的所有頁(yè)面共事相同的側(cè)條片段。如果側(cè)條是每個(gè)頁(yè)面的20%,則將其從所有頁(yè)面中提取出可以把高速緩存的大小降低大約20%,因?yàn)椴粡?fù)制側(cè)條。參照?qǐng)D10B,其中示出了購(gòu)物者組的情景。產(chǎn)品說(shuō)明頁(yè)面對(duì)于每個(gè)購(gòu)物者組有不同的價(jià)格,但是產(chǎn)品說(shuō)明的其余部分是獨(dú)立于購(gòu)物者組的。根據(jù)現(xiàn)有技術(shù),對(duì)產(chǎn)品和購(gòu)物者組的每個(gè)組合有一個(gè)產(chǎn)品頁(yè)面,這些產(chǎn)品頁(yè)面的每一個(gè)都有可能被高速緩存在不支持片段的高速緩存中。相反,根據(jù)本發(fā)明優(yōu)選實(shí)施例的支持片段的高速緩存只需要存儲(chǔ)針對(duì)產(chǎn)品-組組合的價(jià)格數(shù)據(jù)片段和產(chǎn)品說(shuō)明片段,而不需要存儲(chǔ)所有的整個(gè)頁(yè)面組合。潛在的存儲(chǔ)空間節(jié)省可以估計(jì)如下。每個(gè)價(jià)格為100B(s1),其余產(chǎn)品說(shuō)明為10kB(s2)。有10,000個(gè)產(chǎn)品(p)和5個(gè)購(gòu)物者組(g)。如果存儲(chǔ)完全擴(kuò)展的頁(yè)面,則總共可能有(10,000×5)=50,000(p*g)個(gè)大小均大約為10kB的項(xiàng)(s2大約等于s1+s2),其具有大約500,000kB(p*g*s2)的總大小。反之,如果將價(jià)格存儲(chǔ)在與其余產(chǎn)品說(shuō)明不同的單獨(dú)片段中,則在高速緩存中有10,000(p)個(gè)均為10kB(s2)的產(chǎn)品片段,其具有100,000kB(p*s2)的大小,加上10,000×5=50,000(p*g)個(gè)均為100B(s1)的價(jià)格,其具有5,000kB的大小。使用片段時(shí)的總大小為這些的和,或105,000kB。在實(shí)現(xiàn)了支持片段的高速緩存之后,高速緩存的大小降低了幾乎5倍。參照?qǐng)D10C,其中示出了一個(gè)性化情景。產(chǎn)品說(shuō)明頁(yè)面包含個(gè)性化部分,并且有10,000個(gè)產(chǎn)品(p)和100,000個(gè)用戶(u)。根據(jù)現(xiàn)有技術(shù),如果存儲(chǔ)完全擴(kuò)展的頁(yè)面,則在高速緩存中可能總共有10,000×100,000=1,000,000,000(u*p)個(gè)項(xiàng)。相反,使用根據(jù)本發(fā)明優(yōu)選實(shí)施例實(shí)現(xiàn)的支持片段的高速緩存,可以將頁(yè)面存儲(chǔ)為分立的片段。在這種情況下,在高速緩存中總共只有10,000+100,000=110,000(u+p)個(gè)項(xiàng),并且每個(gè)項(xiàng)更小。這產(chǎn)生大約20,000倍的大小降低。繼續(xù)同一例子,可以使用其SRC屬性標(biāo)識(shí)cookie,例如src=″cookie://{cookiename}″,或標(biāo)識(shí)URI查詢參數(shù),例如src=″parm://{parmname}″的FRAGMENTLINK標(biāo)簽來(lái)替換該cookie或查詢參數(shù)的值。在這種情況下,如果個(gè)性化信息小到足夠成為cookie值,則可以使用這種變量替換來(lái)消除向Web應(yīng)用服務(wù)器請(qǐng)求個(gè)性化片段和對(duì)其進(jìn)行高速緩存的開(kāi)銷。例如,可以用其名稱為“userName”并且值為″JohnSmith″的cookie,通過(guò)下面的HTML語(yǔ)句,完成象“Hello,JohnSmith.Welcometoourstore!!!”這樣的問(wèn)候語(yǔ)Hello,{fragmentlinksrc=″cookie://userName″}.Welcometoourstore!!!參照?qǐng)D10D,其中示出了股票監(jiān)視列表情景;股票監(jiān)視列表可在許多Web門(mén)戶上得到。頁(yè)面包含個(gè)性化的股票行情列表。這個(gè)情景類似于個(gè)性化情景,例外之處是特定于用戶的信息與最高級(jí)片段而不是包含的片段相關(guān)。每個(gè)用戶具有單獨(dú)的股票列表,但是每個(gè)股票被許多用戶列表共享。有100,000個(gè)用戶(u)和1,000個(gè)股票(s)。每個(gè)用戶說(shuō)明為1kB(s1),而每個(gè)股票行情為100B(s2)。用戶在其列表(1)中平均有10個(gè)股票。如果存儲(chǔ)完全擴(kuò)展的頁(yè)面,高速緩存大小為100,000*1kB=100,000kB(u*s1),加上100,000*10*100B=100,000kB(u*l*s2),總共為200,000kB。相反,如果將各個(gè)股票行情存儲(chǔ)為單獨(dú)的片段,則高速緩存大小為特定于用戶的片段的100,000×1kB=100,000kB(u*s1),加上股票行情片段的1,000*100B=100kB(s*s2),總共100,100kB。由于不復(fù)制股票行情,這大約有2倍的大小降低。通過(guò)使用片段的FOREACH特性可以進(jìn)一步改進(jìn)股票監(jiān)視列表情景。在這種情況下,消除了所有特定于用戶的片段。圖10D也圖解了這種情況。FOREACH特性指定了其值為由“=”分隔的名稱-值對(duì)的以空格定界的列表的cookie。對(duì)于每個(gè)名稱-值對(duì),產(chǎn)生一個(gè)片段,其附加有該名稱-值對(duì)作為URI查詢參數(shù)。在這種情況下,名為“stocks”的cookie會(huì)具有股票符號(hào)參數(shù)列表作為其值,例如“symbol=IBMsymbol=CSCOsymbol=DELL”。這會(huì)產(chǎn)生3個(gè)片段,cookie中的每個(gè)股票符號(hào)有一個(gè)片段。高速緩存的大小為單個(gè)非特定于用戶的模板片段的1kB(s1),加上股票行情片段的100kB(s*s2),總共為101kB。這粗略有1000倍的大小降低,因?yàn)樘囟ㄓ谟脩舻墓善绷斜砥伪粏蝹€(gè)股票列表片段替代。本發(fā)明的優(yōu)選實(shí)施例還降低了維護(hù)高速緩存內(nèi)容所需的工作量。用于在特定應(yīng)用中選擇什么來(lái)構(gòu)成片段的一個(gè)準(zhǔn)則是一部分內(nèi)容改變的頻度。當(dāng)內(nèi)容改變過(guò)于頻繁以至于不能每次人工發(fā)布時(shí),應(yīng)用通常使用訪問(wèn)數(shù)據(jù)庫(kù)以產(chǎn)生內(nèi)容的模板,例如JSP,以及當(dāng)數(shù)據(jù)庫(kù)改變或時(shí)間界限到期時(shí)自動(dòng)無(wú)效內(nèi)容的機(jī)制。這種動(dòng)態(tài)內(nèi)容方案使人擺脫出來(lái),并且允許頻繁更新。當(dāng)前,多數(shù)高速緩存不高速緩存具有查詢參數(shù)的請(qǐng)求,因?yàn)槠渫ǔV甘緞?dòng)態(tài)內(nèi)容。然而動(dòng)態(tài)內(nèi)容通常是高速緩存的良好候選。雖然內(nèi)容以某種速度改變(例如價(jià)格可能每周改變,共同基金每天改變,股票每幾分鐘改變),然而在改變之間可能有大量的高速緩存命中,使得高速緩存仍然提供顯著的性能改進(jìn)。當(dāng)內(nèi)容可快速改變時(shí),重要的是減少每次改變導(dǎo)致的工作。將頁(yè)面分隔成片段允許遞增地生成內(nèi)容。當(dāng)改變發(fā)生時(shí),只有直接受影響的那些頁(yè)面中的那些部分必須再次生成。如果一段內(nèi)容快速改變,則可以使其成為分立片段。再次參照?qǐng)D10A中的側(cè)條情景,側(cè)條包含每隔幾分鐘改變的內(nèi)容,例如新聞?lì)^條。如果存儲(chǔ)完全擴(kuò)展的頁(yè)面,則當(dāng)側(cè)條改變時(shí),必須再次產(chǎn)生和替換所有頁(yè)面。相反,如果側(cè)條是分立的片段,則當(dāng)側(cè)條改變時(shí)只需產(chǎn)生和替換一個(gè)片段。再次參照?qǐng)D10B中的購(gòu)物者組情景,購(gòu)物者組價(jià)格可能根據(jù)該購(gòu)物者組內(nèi)的銷售量每分鐘改變。如果存儲(chǔ)完全擴(kuò)展的頁(yè)面,則每分鐘必須產(chǎn)生所有50,000個(gè)頁(yè)面。這導(dǎo)致每分鐘產(chǎn)生和替換500,000kB的高速緩存。相反,如果價(jià)格被存儲(chǔ)為分立的片段,則仍然會(huì)產(chǎn)生和替換50,000個(gè)片段,但是只會(huì)產(chǎn)生和替換5,000kB的高速緩存。這在需要的帶寬方面是100倍的降低。如果產(chǎn)品說(shuō)明的非價(jià)格方面改變了,只需產(chǎn)生和替換一個(gè)片段,而不是5個(gè)頁(yè)面。這在帶寬方面是5倍的降低。再次參照?qǐng)D10C中的個(gè)性化情景,產(chǎn)品可能每幾秒改變,而特定于用戶的個(gè)性化可能每天改變。如果高速緩存擴(kuò)展的頁(yè)面,則每次產(chǎn)品改變會(huì)導(dǎo)致產(chǎn)生和替換該產(chǎn)品的所有100,000個(gè)頁(yè)面,而每次個(gè)性化信息改變會(huì)導(dǎo)致產(chǎn)生和替換該用戶的所有10,000個(gè)頁(yè)面。相反,如果產(chǎn)品說(shuō)明和個(gè)性化信息被存儲(chǔ)為分立的片段,則每次產(chǎn)品改變將只導(dǎo)致產(chǎn)生和替換一個(gè)片段(100,000倍的改進(jìn)),而每次個(gè)性化信息改變將只導(dǎo)致產(chǎn)生和替換一個(gè)片段(10,000倍的改進(jìn))。再次參照?qǐng)D10D中的股票監(jiān)視列表情景,股票價(jià)格可能每20秒改變。如果在高速緩存中存儲(chǔ)擴(kuò)展頁(yè)面,則每20秒必須產(chǎn)生所有100,000個(gè)用戶頁(yè)面(100,000kB)。相反,如果股票被存儲(chǔ)為分立的片段,則每20秒只需產(chǎn)生和替換1,000個(gè)股票片段(100kB)。這在帶寬方面是超過(guò)1,000倍的改進(jìn)。如果修改單個(gè)用戶股票監(jiān)視列表,例如用戶在監(jiān)視列表中加入或清除股票,則在任一情況下,只需產(chǎn)生和替換一個(gè)片段。產(chǎn)生和使用片段高速緩存標(biāo)識(shí)符的例子如上所述,高速緩存信息與每個(gè)片段相關(guān),該信息指示高速緩存如何高速緩存該片段。對(duì)于靜態(tài)內(nèi)容,高速緩存信息與每個(gè)片段相關(guān)。動(dòng)態(tài)內(nèi)容是由模板或程序(JSP、CGI等)產(chǎn)生的,并且高速緩存信息將與該模板相關(guān)。這可以是固定信息,這樣該模板產(chǎn)生的所有片段將具有相同的值。或者,該模板可以具有確定高速緩存信息的代碼,使得高速緩存信息能夠根據(jù)某種算法對(duì)于每個(gè)產(chǎn)生的片段是不同的。在任一情況下,特定片段具有固定值。片段可以被定義成已經(jīng)被定界以與另一個(gè)部分內(nèi)容組合的一部分內(nèi)容。在本發(fā)明的優(yōu)選實(shí)施例中使用了標(biāo)準(zhǔn)化的片段命名技術(shù);該技術(shù)根據(jù)前面更加正式地描述的技術(shù)來(lái)產(chǎn)生高速緩存ID。這個(gè)部分通過(guò)再下面的一系列例子描述高速緩存ID的使用,雖然首先提供了對(duì)高速緩存ID的形成和確定的簡(jiǎn)要重述。高速緩存以某種方式使用高速緩存ID來(lái)存儲(chǔ)片段。足夠信息應(yīng)當(dāng)被包含在高速緩存ID中,以使其在使用高速緩存的所有應(yīng)用中是唯一的。例如,單獨(dú)的產(chǎn)品ID可能與另一個(gè)商店的產(chǎn)品ID或全然不同的其它東西發(fā)生沖突。由于片段的URI路徑通常必須至少部分地解決這個(gè)相同名稱范圍的問(wèn)題,將URI路徑包含為片段的高速緩存ID的一部分是方便的。如下面的例子所示,高速緩存ID的信息內(nèi)容決定片段共享的范圍的大小。(A)如果用戶ID被包含在高速緩存ID中,則片段只用于該用戶。(B)如果購(gòu)物者組ID被包含在高速緩存ID中,則在該購(gòu)物者組的所有成員中共享此片段。(C)如果沒(méi)有用戶ID或購(gòu)物者組ID被包含在高速緩存ID中,則在所有用戶中共享此片段。Web應(yīng)用開(kāi)發(fā)人員可以通過(guò)片段的具有CACHEID指令的HTTPFRAGMENT頭中的規(guī)則規(guī)定高速緩存ID的信息內(nèi)容,所述CACHEID指令指明什么被包含在片段的高速緩存ID中。規(guī)則允許任何URI查詢參數(shù)或cookie被附加到URI路徑上,或允許完整的URI(包含查詢參數(shù))。不存在規(guī)則意味著不要高速緩存。當(dāng)使用多個(gè)規(guī)則時(shí),按出現(xiàn)順序試用規(guī)則。第一個(gè)成功起作用的規(guī)則確定高速緩存ID。如果沒(méi)有規(guī)則成功起作用,則不高速緩存片段。當(dāng)查詢參數(shù)或cookie被包含在高速緩存ID中時(shí),它可以是必需的,也可以是可選的,如下所述。(A)未出現(xiàn)在父的請(qǐng)求中的必需查詢參數(shù)導(dǎo)致規(guī)則失敗。(B)未出現(xiàn)在父的請(qǐng)求或結(jié)果中的必需cookie導(dǎo)致規(guī)則失敗。(C)未出現(xiàn)的可選查詢參數(shù)或cookie不被包含在高速緩存ID中。高速緩存ID是大小寫(xiě)敏感的,除了某種標(biāo)準(zhǔn)已經(jīng)聲明為大小寫(xiě)不敏感的那些部分之外。HTTP規(guī)范規(guī)定URI的協(xié)議和主機(jī)名稱是大小寫(xiě)不敏感的,而URI的其余部分,包含查詢參數(shù)名,是大小寫(xiě)敏感的。根據(jù)規(guī)范“HTTP狀態(tài)管理機(jī)制”(HTTPStateManagementMechanism),RFC2109,互聯(lián)網(wǎng)工程任務(wù)組,1997年2月,cookie名是大小寫(xiě)不敏感的。通過(guò)將這些大小寫(xiě)不敏感的部分轉(zhuǎn)換成統(tǒng)一的大小寫(xiě),高速緩存實(shí)現(xiàn)可以容易地實(shí)施此規(guī)定。本發(fā)明優(yōu)選實(shí)施例的片段高速緩存技術(shù)優(yōu)選地使查詢參數(shù)值和cookie值是大小寫(xiě)敏感的?,F(xiàn)在參照?qǐng)D11A-11H,其中一系列圖例被用來(lái)圖解本發(fā)明優(yōu)選實(shí)施例的技術(shù)構(gòu)造和使用用于存儲(chǔ)和處理片段的唯一高速緩存標(biāo)識(shí)符的方式。參照?qǐng)D11A,站點(diǎn)上的所有父片段包含相同的側(cè)條子片段。在本情景下,除了所有父片段包含相同的側(cè)條片段外,不對(duì)父片段進(jìn)行規(guī)定,所以只討論子片段。子片段由其URI邏輯地限定。由于它是靜態(tài)內(nèi)容,它的高速緩存ID是完整的URI。高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″URI″換言之,高速緩存ID是包含所有查詢參數(shù)的完整URI。高速緩存ID的一例子是http://www.acmeStore.com/sidebar.html參照?qǐng)D11B,產(chǎn)品說(shuō)明頁(yè)面不包含嵌入或子片段,即該頁(yè)面是唯一片段。它由productID邏輯地限定。頁(yè)面URI具有productID查詢參數(shù)。頁(yè)面請(qǐng)求具有在登錄期間由Web應(yīng)用服務(wù)器產(chǎn)生的加密userIDcookie。userIDcookie允許特定于用戶的狀態(tài)(購(gòu)物車(chē)、用戶簡(jiǎn)檔等)與用戶相關(guān)。userID被用作cookie而不是查詢參數(shù),因?yàn)樗赡苡糜趲缀趺總€(gè)請(qǐng)求,因而將其放入每個(gè)鏈接中對(duì)于Web應(yīng)用開(kāi)發(fā)人員而言是乏味的。用于產(chǎn)品頁(yè)面的單個(gè)高速緩存ID規(guī)則可以使用完整的URI作為高速緩存ID,其包含productID查詢參數(shù),這樣可以用正確的限定來(lái)將其高速緩存。對(duì)于這個(gè)單個(gè)片段的頁(yè)面,高速緩存ID可以是其URI。高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″URI″換言之,高速緩存ID是包含所有查詢參數(shù)的完整URI。該高速緩存ID的一例子是http://www.acmeStore.com/productDesc.jspproductID=AT13394為這個(gè)最高級(jí)片段指定高速緩存ID的另一個(gè)方式是商家使用的作為URI查詢參數(shù)的產(chǎn)品ID,例如AT13394,加上固定URI路徑以保證唯一性,例如,http://www.acmeStore.com/productDesc。在這種情況下,高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″(productId)″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;和(B)productID查詢參數(shù)的名稱和值。規(guī)則中沒(méi)有方括弧表示應(yīng)當(dāng)存在productID參數(shù)。否則規(guī)則失敗,并且不會(huì)高速緩存片段。高速緩存ID的一例子是http://www.acmeStore.com/productDesc.jsp_productlD=AT13394應(yīng)當(dāng)注意,Web應(yīng)用開(kāi)發(fā)人員只指定高速緩存ID的信息內(nèi)容,而不是其精確的格式。高速緩存實(shí)現(xiàn)可以選擇其自身的方式來(lái)編碼高速緩存ID中的指定的信息內(nèi)容。上述例子使用以下劃線字符(“_”)作為分隔定界符的簡(jiǎn)單串接。Web應(yīng)用開(kāi)發(fā)人員不需要知道這種編碼。參照?qǐng)D11C,其中提供了產(chǎn)品說(shuō)明情景的擴(kuò)展。價(jià)格現(xiàn)在由用戶所屬的購(gòu)物者組來(lái)確定,但是產(chǎn)品說(shuō)明的其余部分獨(dú)立于購(gòu)物者組。父產(chǎn)品說(shuō)明片段包含子價(jià)格片段。父被productID邏輯地限定。子由productID和groupID邏輯地限定。頁(yè)面URI具有productID查詢參數(shù)。頁(yè)面請(qǐng)求具有加密的userID和groupIDcookie。groupIDcookie是由Web應(yīng)用在登錄期間根據(jù)用戶簡(jiǎn)檔產(chǎn)生的。使groupID成為cookie而不是查詢參數(shù),因?yàn)樗赡苡糜趲缀趺總€(gè)請(qǐng)求,因而將其放入每個(gè)鏈接中對(duì)于Web應(yīng)用開(kāi)發(fā)人員而言是乏味的。價(jià)格應(yīng)當(dāng)在被父包含的分立子片段中。父片段的單個(gè)高速緩存ID規(guī)則將與產(chǎn)品顯示情景中的相同。子片段的單個(gè)高速緩存ID規(guī)則將使用URI路徑以及productID查詢參數(shù)和groupIDcookie,使得它可以用正確的限定來(lái)高速緩存。應(yīng)當(dāng)注意,高速緩存ID不包含用戶ID,因?yàn)槟菢拥脑捚沃荒鼙粏蝹€(gè)用戶而不是屬于相同購(gòu)物者組的所有用戶使用,從而導(dǎo)致更大的高速緩存,和更多工作量來(lái)保持高速緩存最新。該高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″(productID,[groupID]″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)productID查詢參數(shù)的名稱和值;和(C)groupIDcookie的名稱和值,如果請(qǐng)求中出現(xiàn)的話。逗號(hào)將URI查詢參數(shù)與cookie分隔開(kāi)。規(guī)則中的方括弧表示cookie是可選的。如果這個(gè)cookie不存在,則規(guī)則仍然可以成功,并且高速緩存ID將不包含cookie名稱-值對(duì)。這允許商家具有非按組的價(jià)格以及按組的價(jià)格。該高速緩存ID的一例子可以是http://www.acmeStore.com/productDesc.jsp_productID=AT13394_groupID=*@#!參照?qǐng)D11D,其中提供了購(gòu)物者組情景的擴(kuò)展。已經(jīng)添加了對(duì)多個(gè)商家的支持;例如,應(yīng)用服務(wù)提供商(ASP)在相同Web應(yīng)用服務(wù)器中使用多種語(yǔ)言支持多個(gè)商家。父產(chǎn)品說(shuō)明片段再次包含子價(jià)格片段。父由productID、merchantID和languageID邏輯地限定。子由productID、groupID、languageID和merchantID邏輯地限定。頁(yè)面URI具有productID和merchantID查詢參數(shù)。請(qǐng)求具有加密userID、groupID和languageIDcookie。LanguageIDcookie是由Web應(yīng)用在登錄期間根據(jù)用戶簡(jiǎn)檔產(chǎn)生的。languageID被用作cookie而不是查詢參數(shù),因?yàn)樗糜诿總€(gè)請(qǐng)求,因而將其放入每個(gè)鏈接中對(duì)于Web應(yīng)用開(kāi)發(fā)人員而言是乏味的。用于父片段的單個(gè)高速緩存ID規(guī)則將使用URI路徑和productID與merchantID查詢參數(shù),以及l(fā)anguageIDcookie,使得可以用正確的限定將其高速緩存。父高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″(productIDmerchantID,[languageID])″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)productID查詢參數(shù)的名稱和值;(C)merchantID查詢參數(shù)的名稱和值;和(D)languageIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話。父高速緩存ID的一例子是http://www.acmeMall.com/productDesc.jsp_productID=AT13394_merchantID=MyStorelanguageID=eng子片段的單個(gè)高速緩存ID規(guī)則會(huì)使用URI路徑連同productID和merchantID查詢參數(shù)、以及groupID和可選的languageIDcookie,使得它可以用正確的限定來(lái)高速緩存。高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″(productIDmerchantID,[groupID][languageID])″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)productID查詢參數(shù)的名稱和值;(C)merchantID查詢參數(shù)的名稱和值;(D)groupIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話;和(E)languageIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話。高速緩存ID的一例子是http://www.acmeMall.com/productDesc.jsp_productID=AT13394_merchantID=MyStore_languageID=*@#!_languageID=eng參照?qǐng)D11E,其中提供了ASP和多語(yǔ)言情景的擴(kuò)展。已經(jīng)添加了對(duì)標(biāo)識(shí)產(chǎn)品的多個(gè)方式的支持。父產(chǎn)品說(shuō)明片段包含子價(jià)格片段。父由產(chǎn)品(存在2個(gè)方式來(lái)指定這個(gè))、languageID和merchantID來(lái)邏輯地限定。子由產(chǎn)品、groupID、languageID和merchantID邏輯地限定。產(chǎn)品或者由productID查詢參數(shù)或者由partNumber和supplierNumber查詢參數(shù)來(lái)標(biāo)識(shí)。請(qǐng)求具有userID、groupID和languageIDcookie。父片段會(huì)需要2個(gè)規(guī)則,其被指定為Fragment:cacheid=″(productIDmerchantID,[languageID])(partNumbersupplierNumbermerchantID,[languageID])″嘗試第一規(guī)則。如果它成功,則它確定高速緩存ID。如果它失敗,則嘗試第二規(guī)則。如果第二規(guī)則成功,則它確定高速緩存ID。如果第二規(guī)則失敗,則不高速緩存片段。第一規(guī)則意味著高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)productID查詢參數(shù)的名稱和值;(C)merchantID查詢參數(shù)的名稱和值;和(D)languageIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話。第一規(guī)則的高速緩存ID的一例子是http://www.acmeStore.com/productDesc.jsp_productID=AT13394_merchantID=MyStore_anguageID=eng第二規(guī)則意味著高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)partNumber查詢參數(shù)的名稱和值;(C)supplierNumber查詢參數(shù)的名稱和值;(D)merchantID查詢參數(shù)的名稱和值;和(E)languageIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話。第二規(guī)則的高速緩存ID的一例子是http://www.acmeStoreo.com/productDesc.jsp_partNumber=22984z_supplierNumber=339001_merchantID=MyStore_languageID=eng子片段需要2個(gè)規(guī)則,其被規(guī)定如下Fragment:cacheid=″(productIDmerchantID,IgroupID][languageID])(partNumbersupplierNumbermerchantID,[groupID][languageID])″嘗試第一規(guī)則。如果它成功,則它確定高速緩存ID。如果它失敗,則嘗試第二規(guī)則。如果第二規(guī)則成功,則它確定高速緩存ID。如果第二規(guī)則失敗,則不高速緩存片段。第一規(guī)則表示高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)productID查詢參數(shù)的名稱和值;(C)merchantID查詢參數(shù)的名稱和值;(D)groupIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話;和(E)languageIDcookie的名稱和值,如果它在請(qǐng)求中出現(xiàn)的話。第一規(guī)則的高速緩存ID的一例子是http://www.acmeStore.com/productDesc.jsp_productID=AT13394_merchantID=MyStore_groupID=*@#!_languageID=eng第二規(guī)則意味著高速緩存ID是串接在一起的以下部分(A)URI路徑;(B)partNumber查詢參數(shù)的名稱和值;(C)supplierNumber查詢參數(shù)的名稱和值;(D)merchantID查詢參數(shù)的名稱和值;(E)groupIDcookie的名稱和值;和(F)languageIDcookie的名稱和值。第二規(guī)則的高速緩存ID的一例子是http://www.acmeStore.com/productDesc.jsp_partNumber=22984Z_supplierNumber=339001_merchantID=MyStore_groupID=*@#!_language=eng參照?qǐng)D11F,其中提供了使用個(gè)性化的產(chǎn)品說(shuō)明情景的擴(kuò)展。父產(chǎn)品說(shuō)明片段包含子個(gè)性化片段。父片段被productID邏輯地限定。子片段被userID邏輯地限定。頁(yè)面URI具有productID查詢參數(shù)。請(qǐng)求具有userIDcookie。父高速緩存ID包含productID查詢參數(shù)。用于父片段的高速緩存ID規(guī)則會(huì)是以下2個(gè)情況中的任意一個(gè)Fragment:cacheid=″URI″換言之,高速緩存ID是具有所有查詢參數(shù)的完整URI。另一個(gè)潛在規(guī)則會(huì)是Fragment:cacheid=″(productId)″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;和(B)productID查詢參數(shù)的名稱和值。應(yīng)當(dāng)注意,即使對(duì)這個(gè)頁(yè)面的請(qǐng)求包含userIDcookie,它仍然不包含在任一片段的高速緩存ID中,因?yàn)槠问翘囟ㄓ诋a(chǎn)品的而不是特定于用戶的。如果包含它,則這個(gè)片段只可被該用戶訪問(wèn),從而導(dǎo)致更大的高速緩存和用于保持高速緩存最新的更多工作量。高速緩存ID的一例子是http://www.acmeStore.com/productDesc.jsp_productID=AT13394子個(gè)性化片段的高速緩存ID包含userIDcookie。子片段的高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″(,userId)″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;和(B)userIDcookie的名稱和值。高速緩存ID的一例子是http://www.acmeStore.com/personalization.jsp_userID=@($*!%在這個(gè)個(gè)性化例子中,個(gè)性化片段應(yīng)當(dāng)被標(biāo)記為私有數(shù)據(jù),例如通過(guò)使用“Cache-Control:private”。參照?qǐng)D11G,簡(jiǎn)單門(mén)戶頁(yè)面上的父股票監(jiān)視列表片段包含多個(gè)子股票行情片段。父片段還包含用戶的名稱以作為簡(jiǎn)單的個(gè)性化信息。父由userID邏輯地限定即股票符號(hào)的列表是特定于用戶的。用戶名稱由userID邏輯地限定。每個(gè)子由其股票符號(hào)邏輯地限定,即股票的價(jià)格不是特定于用戶的。頁(yè)面URI不包含查詢參數(shù)。請(qǐng)求具有userIDcookie。最高級(jí)片段包含所需的特定于用戶的股票行情列表。最高級(jí)片段的URI不包含查詢參數(shù)。最高級(jí)片段的高速緩存ID包含名稱為userID的加密的cookie。高速緩存ID規(guī)則會(huì)是Fragment:cacheid=″(,userld)″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;和(B)userIDcookie的名稱和值。高速緩存ID的一例子會(huì)是http://www.acmeInvest.com/stockList.jsp_userID=@($*!%對(duì)于每個(gè)股票行情片段,高速緩存ID包含“symbol”(符號(hào))參數(shù)。高速緩存ID規(guī)則會(huì)是完整的URI或URI路徑加上stockSymbol查詢參數(shù)Fragment:cacheid=″(stockSymbol)″換言之,高速緩存ID是串接在一起的以下部分(A)URI路徑;和(B)符號(hào)查詢參數(shù)的名稱和值。高速緩存ID的一例子會(huì)是http://www.acmeInvest.com/stockQuote.jsp_stockSymbol=IBM這個(gè)情景可以被修改成使用FOREACH特性;股票行情片段將不改變,但是父片段可以高度優(yōu)化。只存在一個(gè)靜態(tài)最高級(jí)片段。會(huì)使用stockSymbols(股票符號(hào))cookie,其值是用戶的空格分隔的股票符號(hào)列表。對(duì)于所有用戶只會(huì)有一個(gè)相當(dāng)靜態(tài)的父片段,其包含F(xiàn)RAGMENTLINK標(biāo)簽,F(xiàn)RAGMENTLINK標(biāo)簽的FOREACH屬性會(huì)指明stockSymbolscookie。這為每個(gè)股票符號(hào)動(dòng)態(tài)產(chǎn)生一個(gè)簡(jiǎn)單的FRAGMENTLINK,該FRAGMENTLINK的SRC屬性與包含該FOREACH屬性的FRAGMENTLINK的SRC相同,只是添加了股票符號(hào)作為查詢參數(shù)。因?yàn)檫@個(gè)父片段對(duì)所有用戶是相同的,可以使用單個(gè)高速緩存規(guī)則以正確的限定將其高速緩存,該高速緩存規(guī)則使用其沒(méi)有查詢參數(shù)的URI作為高速緩存ID,如下所示Fragment:cacheid=″URI″stockSymbolscookie包含父片段的所有特定于用戶的信息,并且隨頁(yè)面請(qǐng)求傳遞,所以它滿足父的邏輯userID限定。其值是用戶名稱的userNamecookie會(huì)在用于簡(jiǎn)單個(gè)性化的FRAGMENTLINK標(biāo)簽中使用,該FRAGMENTLINK標(biāo)簽的SRC屬性標(biāo)識(shí)該userNamecookie。這個(gè)片段不被高速緩存,因?yàn)樗梢匀菀椎赜蓇serNamecookie產(chǎn)生。userNamecookie包含這個(gè)片段的所有特定于用戶的信息,并且隨頁(yè)面請(qǐng)求傳遞,所以它滿足父的邏輯userID限定。子片段的單個(gè)高速緩存ID規(guī)則使用其URI作為高速緩存ID,使得可以用正確的限定將其高速緩存,如下所示Fragment:cacheid=″URI″在這個(gè)股票監(jiān)視列表情景中,當(dāng)不使用FOREACH特性時(shí),最高級(jí)的股票監(jiān)視列表片段會(huì)被標(biāo)記為私有的,例如通過(guò)使用“Cache-Control:private”。當(dāng)使用FOREACH特性時(shí),只有一個(gè)最高級(jí)片段被共享,所以它不被標(biāo)記為私有的。參照?qǐng)D11H,其中的例子描述了類似于個(gè)性化門(mén)戶頁(yè)面例如myYahoo!的情景。第一級(jí)門(mén)戶片段包含多個(gè)中級(jí)主題片段,例如股票、天氣、體育,其每個(gè)包含多個(gè)葉項(xiàng)片段。父片段還包含用戶的名稱。最高級(jí)的門(mén)戶片段由userID邏輯地限定,即主題的列表是特定于用戶的。用戶名稱由userID邏輯地限定。中級(jí)主題片段由topicID和userID邏輯地限定,即主題中項(xiàng)的列表是特定于用戶的。葉項(xiàng)片段由itemID邏輯地限定,即項(xiàng)的值不是特定于用戶的。頁(yè)面URI不包含查詢參數(shù)。頁(yè)面請(qǐng)求具有userIDcookie。通過(guò)使用FOREACH特性,父片段可以被高度優(yōu)化。通過(guò)使用FOREACH特性,會(huì)使用主題cookie(在登錄期間根據(jù)用戶簡(jiǎn)檔產(chǎn)生的),其值為空格分隔的、該用戶的topicID列表。對(duì)于所有用戶會(huì)只有一個(gè)相當(dāng)靜態(tài)的父片段,其包含F(xiàn)RAGMENTLINK標(biāo)簽,該FRAGMENTLINK標(biāo)簽的FOREACH屬性會(huì)指明主題cookie。這為每個(gè)topicID動(dòng)態(tài)產(chǎn)生一個(gè)簡(jiǎn)單的FRAGMENTLINK,該FRAGMENTLINK的SRC屬性與包含F(xiàn)OREACH屬性的FRAGMENTLINK的SRC相同,只是附加有topicID作為查詢參數(shù)。因?yàn)檫@個(gè)父片段對(duì)所有用戶是相同的,可以使用單個(gè)高速緩存規(guī)則以正確的限定將其高速緩存,該高速緩存規(guī)則使用其沒(méi)有查詢參數(shù)的URI作為高速緩存ID,如下所示Fragment:cacheid=″URI″主題cookie包含父片段的所有特定于用戶的信息,并且隨頁(yè)面請(qǐng)求傳遞,所以它滿足父的邏輯userID限定。其值是用戶名稱的userNamecookie會(huì)在其SRC屬性標(biāo)識(shí)該userNamecookie的用于簡(jiǎn)單個(gè)性化的FRAGMENTLINK標(biāo)簽中使用。這個(gè)片段不被高速緩存,因?yàn)樗梢匀菀椎貜膗serNamecookie產(chǎn)生。userNamecookie包含這個(gè)片段的所有特定于用戶的信息,并且隨頁(yè)面請(qǐng)求傳遞,所以它滿足父的邏輯userID限定。針對(duì)每個(gè)主題,存在一個(gè)主題片段。由于FOREACH特性,每個(gè)主題片段可以被高度優(yōu)化。對(duì)于每個(gè)主題,會(huì)使用一個(gè)cookie(在登錄期間根據(jù)用戶簡(jiǎn)檔產(chǎn)生的),其值為空格分隔的、該用戶和主題的itemID列表。對(duì)于每個(gè)主題,會(huì)只有一個(gè)用于所有用戶的相當(dāng)靜態(tài)的主題片段,其包含一FRAGMENTLINK,該FRAGMENTLINK的FOREACH屬性會(huì)指明該主題的相應(yīng)cookie。這為每個(gè)itemID動(dòng)態(tài)產(chǎn)生一簡(jiǎn)單的FRAGMENTLINK,該FRAGMENTLINK的SRC屬性是包含該FOREACH屬性的FRAGMENTLINK的SRC,只是附加有itemID作為查詢參數(shù)(topicID查詢參數(shù)已經(jīng)在那里了)。因?yàn)槊總€(gè)主題片段對(duì)所有用戶是相同的,可以使用單個(gè)高速緩存規(guī)則以正確的限定將其高速緩存,該高速緩存規(guī)則使用其具有其topicID作為查詢參數(shù)的URI作為高速緩存ID。主題cookie包含主題片段的所有特定于用戶的信息,并且隨頁(yè)面請(qǐng)求傳遞,所以它滿足主題片段的邏輯userID限定。每個(gè)項(xiàng)片段的URI包含其topicID和itemID作為查詢參數(shù)。每個(gè)項(xiàng)片段的單個(gè)高速緩存ID規(guī)則使用其URI作為高速緩存ID,使得用正確的限定來(lái)將其高速緩存。FRAGMENTLINK標(biāo)簽的規(guī)定的例子再次參照?qǐng)D11A中的側(cè)條例子,單個(gè)FRAGMENTLINK會(huì)被放在頁(yè)面而不是側(cè)條中,并且放在與側(cè)條的期望位置相同的位置上,例如{fragmentlinksrc=″http://www.acmeStore.com/sidebar.html″}再次參照?qǐng)D11C中的購(gòu)物者組例子,單個(gè)FRAGMENTLINK會(huì)被放在價(jià)格將出現(xiàn)的位置上,例如{fragmentlinksrc=″http://www.acmeStore.com/productPrice.jsp″}為特定價(jià)格片段構(gòu)造的URI會(huì)如下所示http://www.acmeStore.com/productPrjce.jspproductID=AT13394對(duì)該片段的請(qǐng)求包含父的所有查詢參數(shù),即“productId”,和cookie,即“groupId”,使得它們可以在應(yīng)用服務(wù)器中的productPrice.jsp的執(zhí)行期間得到。再次參照?qǐng)D11F中的個(gè)性化例子,最高級(jí)片段會(huì)包含位于個(gè)性化片段的期望位置的FRAGMENTLINK,例如{fragmentlinksrc=″http://www.acmeStore.com/personalization.jsp″}為特定的特定于用戶的個(gè)性化片段構(gòu)造的URI如下所示http://www.acmeStore.com/personalization.jspproductID=AT13394對(duì)該片段的請(qǐng)求包含父的所有查詢參數(shù)(即“productId”)和cookie(即“userId”)。在personalization.jsp的執(zhí)行期間,“userId”cookie被使用,但是“productId”查詢參數(shù)被忽略。再次參照?qǐng)D11G中的股票監(jiān)視列表例子,最高級(jí)片段會(huì)包含可變數(shù)量的FRAGMENTLINK標(biāo)簽,這取決于用戶想要多少股票行情。每個(gè)FRAGMENTLINK標(biāo)簽會(huì)位于股票行情將出現(xiàn)的位置。每個(gè)將如下所示{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspsymbol=IBM″}針對(duì)特定股票行情片段構(gòu)造的URI將如下所示http://www.acmeInvest.com/stockQuote.jspsymbol=IBM這個(gè)情景可以被修改成使用FOREACH特性;可變數(shù)量的FRAGMENTLINK標(biāo)簽被單個(gè)FRAGMENTLINK標(biāo)簽替代,該單個(gè)FRAGMENTLINK標(biāo)簽具有指明一cookie的名稱(stocks)的FOREACH屬性,該cookie的值為空格分隔的股票符號(hào)參數(shù)列表{fragmentlinksrc=″http://www.acmelnvest.com/stockQuote.jsp″foreach=″stocks″}如果名稱為“stocks”的cookie的值為symbol=IBMsymbol=CSCOsymbol=DELL則這等價(jià)于以下一組FRAGMENTLINK標(biāo)簽{fragmentlinksrc=″http://www.acmelnvest.com/stockQuote.jspsymbol=IBM″}{fragmentlinksrc=″http://www.acmelnvest.com/stockQuote.jspsymbol=CSCO″}{fragmentlinksrc=″http://www.acmelnvest.com/stockQuote.jspsymbol=DELL″}再次參照?qǐng)D11H中的完整門(mén)戶的例子,F(xiàn)OREACH特性可以被用于會(huì)被所有用戶共享的單個(gè)靜態(tài)最高級(jí)片段。會(huì)使用以下標(biāo)識(shí)了一userNamecookie的FRAGMENTLINK來(lái)包含最高級(jí)片段中的userName,該userNamecookie包含用戶的名稱{fragmentlinksrc=″cookie://userName″}最高級(jí)片段還會(huì)具有其FOREACH屬性標(biāo)識(shí)主題cookie的FRAGMENTLINK標(biāo)簽,該主題cookie包含該用戶的主題列表{fragmentlinksrc=″http://www.acmePortal.con/portalPage.jsp″foreach=″topics″}這個(gè)cookie包含topicID的列表。對(duì)于一個(gè)其值如下所示的主題cookie:topjc=stockstopic=weathertopic=tv上述包含F(xiàn)OREACH屬性的FRAGMENTLINK會(huì)產(chǎn)生以下一些簡(jiǎn)單的FRAGMENTLINK:{fragmentlinksrc=″http://www.acmePortal.com/portalPage.jsptopic=stocks″}{fragmentlinksrc=″http://www.acmePortal.com/portalPage.jsptopic=weather}{fragmentlinksrc=″http://www.acmePortal.com/portalPage.jsptopic=tv″}每個(gè)動(dòng)態(tài)產(chǎn)生的SRC屬性定位一個(gè)處理指定主題的片段。Web應(yīng)用服務(wù)器中“portalPage.jsp”的實(shí)現(xiàn)充當(dāng)根據(jù)查詢參數(shù)調(diào)用片段的調(diào)度器。沒(méi)有參數(shù)返回最高級(jí)片段。“topic=stocks”查詢參數(shù)返回股票主題片段。以股票主題片段為例,并且再次使用FOREACH特性,股票主題片段包含其FOREACH屬性標(biāo)識(shí)一股票cookie的FRAGMENTLINK,該股票cookie包含該用戶的該主題的股票符號(hào)列表{fragmentlinksrc=″http://www.stockQuotes.com/stockQuote.jsp″foreach=″stocks″}其示例性使用會(huì)是產(chǎn)生一個(gè)表的各行,其中股票coolie中的每個(gè)股票符號(hào)均有一行。對(duì)于其值如下的“stocks”cookiesymbol=IBMsymbol=DELLsymbol=CSCO上述包含F(xiàn)OREACH屬性的FRAGMENTLINK會(huì)動(dòng)態(tài)產(chǎn)生以下一些FRAGMENTLINK:{fragmentlinksrc=″http://www.stockQuotes.com/stockQuote.jspsymbol=IBM″}{fragmentlinksrc=″http://www.stockQuotes.com/stockQuote.jspsymbol=DELL″}{fragmentlinksrc=″http://www.stockQuotes.com/stockQuote.jspsymbol=CSCO″}從父片段向子片段傳遞數(shù)據(jù)的例子片段應(yīng)當(dāng)盡可能是自包含的。這是因?yàn)?個(gè)原因。第一個(gè)原因是良好的軟件工程規(guī)定軟件模塊應(yīng)當(dāng)盡可能獨(dú)立。模塊之間的約定的數(shù)量和復(fù)雜度應(yīng)當(dāng)最小化,使得一個(gè)模塊中的改變保持在局部,而不傳播到其它模塊。例如,應(yīng)用可能從父模塊獲得數(shù)據(jù),并且將這個(gè)數(shù)據(jù)傳遞到對(duì)其進(jìn)行格式化的子模塊。當(dāng)進(jìn)行此操作時(shí),必須有描述數(shù)據(jù)是什么以及將如何將其傳入的約定。子模塊需要什么數(shù)據(jù)方面的任何改變均需要對(duì)兩個(gè)模塊進(jìn)行改變。相反,如果子模塊獲得其自身的數(shù)據(jù),則改變被保持在局部。如果需要使任一模塊與獲得其數(shù)據(jù)的方式無(wú)關(guān),或使獲得其數(shù)據(jù)的代碼在若干模塊中相同,則可以使用單獨(dú)的數(shù)據(jù)bean(豆)對(duì)象和相應(yīng)的約定來(lái)實(shí)現(xiàn)這些要求中的任何一個(gè)。然而,在父和子模塊之間再添加另一個(gè)約定只會(huì)增加復(fù)雜度,而不會(huì)有任何益處。片段應(yīng)當(dāng)是盡可能自包含的第二個(gè)原因是,為了使高速緩存高效,產(chǎn)生片段的代碼應(yīng)當(dāng)是自包含的。在上述例子中,如果父模塊為子模塊獲得所有數(shù)據(jù),并且將其傳遞到子模塊,則子模塊本身只進(jìn)行格式化。由于模塊之間的這種依賴關(guān)系,如果子模塊需要的數(shù)據(jù)變得過(guò)期了,則父和子都必須被無(wú)效和再次產(chǎn)生。這種依賴關(guān)系極大地降低了單獨(dú)片段的高速緩存的效率。由多個(gè)父共享的片段使上述兩個(gè)問(wèn)題更加復(fù)雜。JSP編程模型允許通過(guò)請(qǐng)求屬性或會(huì)話狀態(tài)在JSP之間傳遞數(shù)據(jù)。對(duì)于嵌套片段,請(qǐng)求屬性機(jī)制不起作用,因?yàn)楦负妥覬SP可能是在對(duì)應(yīng)用服務(wù)器的不同請(qǐng)求中獲得的。并且,如果父和子可以在不同會(huì)話中執(zhí)行,則會(huì)話狀態(tài)機(jī)制會(huì)不起作用。相反,應(yīng)當(dāng)傳遞的任何信息均應(yīng)當(dāng)使用URI查詢參數(shù)或cookie。即使先前使用請(qǐng)求屬性從父向子傳遞的復(fù)雜數(shù)據(jù)結(jié)構(gòu),仍然可以通過(guò)對(duì)其進(jìn)行串行化并且將其包含為FRAGMENTLINK標(biāo)簽的SRC屬性中的URI中的查詢參數(shù)而傳遞。即使在片段獲得其自身的數(shù)據(jù)時(shí),仍然需要在它們之間傳遞某些控制數(shù)據(jù)。再次參照上述例子,在側(cè)條情景中,沒(méi)有數(shù)據(jù)從最高級(jí)片段傳遞到側(cè)條。在購(gòu)物者組情景中,最高級(jí)的產(chǎn)品說(shuō)明片段需要知道產(chǎn)品ID,而作為子的特定于組-產(chǎn)品的價(jià)格需要產(chǎn)品ID和購(gòu)物者組ID二者。產(chǎn)品ID由外部請(qǐng)求提供。購(gòu)物者組ID由應(yīng)用使用用戶ID產(chǎn)生,這二者都在登錄時(shí)產(chǎn)生。產(chǎn)品ID和購(gòu)物者組ID應(yīng)當(dāng)通過(guò)產(chǎn)品說(shuō)明片段傳遞到價(jià)格片段。所有URI查詢參數(shù)和cookie被自動(dòng)傳遞到子片段。在個(gè)性化情景中,最高級(jí)產(chǎn)品說(shuō)明片段需要知道產(chǎn)品ID,子個(gè)性化片段需要知道用戶ID。這些參數(shù)均由外部請(qǐng)求提供,所以用戶ID應(yīng)當(dāng)通過(guò)產(chǎn)品說(shuō)明片段向個(gè)性化片段傳遞。這是通過(guò)將名稱為“userId”的cookie傳遞到子片段來(lái)實(shí)現(xiàn)的。在股票監(jiān)視列表情景中,最高級(jí)股票監(jiān)視列表片段需要知道用戶IDcookie,而每個(gè)子股票監(jiān)視列表片段需要知道股票符號(hào)。股票符號(hào)和包含它們的FRAGMENTLINK標(biāo)簽是作為最高級(jí)的股票監(jiān)視列表片段的一部分產(chǎn)生的。股票符號(hào)應(yīng)當(dāng)被傳遞到股票行情片段。這是通過(guò)將股票符號(hào)放置作為在FRAGMENTLINK的SRC屬性中的URI的查詢參數(shù)來(lái)實(shí)現(xiàn)的。FRAGMENTLINK標(biāo)簽和FRAGMENT頭的例子現(xiàn)在參照表1A-1C,其中示出了用于上述側(cè)條例子的一組HTML和HTTP語(yǔ)句。這個(gè)情景內(nèi)的兩個(gè)片段是靜態(tài)的。父最高級(jí)片段會(huì)是JSP,因?yàn)樗ㄟ^(guò)使用“jsp:include”包含另一個(gè)的片段,并且因?yàn)楦咚倬彺婵刂菩畔⑿枰c父片段相關(guān)。子側(cè)條片段也是JSP,因?yàn)楦咚倬彺婵刂菩畔⑿枰c之相關(guān),但是它不包含任何JSP標(biāo)簽。表1A示出了一個(gè)JSP,該JSP包含用于包含側(cè)條片段的最高級(jí)片段的HTML語(yǔ)句。------------------------------{html}{head}{title}包含側(cè)條的頁(yè)面。{/title}{/head}{body}{!添加側(cè)條。}{jsp:includepage=″/sidebar.html″}{p}這是正文的其余部分。{/body}{/html}表1A---------------------------------表1B示出了會(huì)由Web應(yīng)用服務(wù)器為最高級(jí)片段產(chǎn)生的HTTP輸出。---------------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:246Content-Type:text/htmlCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″URI.″Cache-Control:max-age=600Fragment:contains-fragments{html}{head}{title}包含側(cè)條的頁(yè)面。{/title}{/head}{body}{%--添加側(cè)條--%}{fragmentlinksrc=″http://www.acmeStore.com/sidebar.html″}…這是正文的其余部分…{/body}{/html}表1B-------------------------------表1C示出了會(huì)由Web應(yīng)用服務(wù)器為側(cè)條片段產(chǎn)生的HTTP輸出。-------------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705′Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″URL″Cache-Control:max-age=6000{html}{body}{p}這是側(cè)條主體。{/body}{/html}表1C-------------------------------------現(xiàn)在參照表2A-2D,其中示出了用于上述購(gòu)物者組例子的一組HTML和HTTP語(yǔ)句。這個(gè)情景內(nèi)的兩個(gè)片段都是動(dòng)態(tài)的。一個(gè)JSP被用于包含特定于產(chǎn)品-組的價(jià)格片段的最高級(jí)片段。子片段也是JSP,因?yàn)樗糜讷@得適當(dāng)價(jià)格的商務(wù)應(yīng)用邏輯。表2A示出了一個(gè)包含HTML語(yǔ)句的JSP,所述HTML語(yǔ)句用于包含子片段的最高級(jí)產(chǎn)品說(shuō)明片段。-------------------------------------{html}{head}{title}產(chǎn)品說(shuō)明。{/title}{/head}{body}{h}帶有購(gòu)物者組的產(chǎn)品。{/h1}{%@pagelanguage=″Java″import=″com.acmeStore.databeans.*″%}{%//添加產(chǎn)品說(shuō)明。ProductSGDataBeandatabean=newProductSGDataBean();databean.setProductId(request.getParameter(″productId″));databean.execute();out.println(″{p}Productidis″+databean.getProductId());%}{%--添加價(jià)格--%}{jsp:includepage=″/groupPrice.jsp″}{/body}{/html}表2A--------------------------------表2B示出了會(huì)由Web應(yīng)用服務(wù)器為產(chǎn)品說(shuō)明片段產(chǎn)生的HTTP輸出。--------------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″(productId)″Cache-Control:max-age=600Fragment:contains-fragments{html}{head}{title}產(chǎn)品說(shuō)明。{/title}{/head}{body}{h1}帶有購(gòu)物者組的產(chǎn)品。{/h1}…格式化的產(chǎn)品說(shuō)明會(huì)在這里…{fragmentlinksrc=″http://www.acmeStore.com/groupPrice.jsp″}{/body}{/html}表2B----------------------------表2C示出了一個(gè)包含HTML語(yǔ)句的JSP,所述HTML語(yǔ)句用于特定于子產(chǎn)品-組的價(jià)格片段。----------------------------{html}{body}{%@pagelanguage=″java″import=″com.acmeStore.databeans.*″%}{%//從其cookie得到GroupId。Cookie[]cookies=request.getcookies();StringgroupId=null;for(inti=0;i{cookies.length;i++){if(cookies[i].getName().equals(″groupId″)){groupId=cookies[i].getValue();}}//獲得價(jià)格。GroupPriceDataBeandatabean=newGroupPriceDataBean();databean.setGroupId(groupId);databean.execute();Stringprice=databean.getprice();out.println(″{p}Priceis″+price);%}{/body}{/html}表2C------------------------------表2D示出了會(huì)由Web應(yīng)用服務(wù)器對(duì)特定于產(chǎn)品-組的價(jià)格片段產(chǎn)生的HTTP輸出。------------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:privateCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″(productId,groupId)″Fragment:dependencies=″http://www.acmeStore.com_groupid=*@#!″{html}{body}價(jià)格為$24.99{/body}{/html}表2D---------------------------現(xiàn)在參照表3A-3D,其中示出了用于上述個(gè)性化例子一組HTML和HTTP語(yǔ)句。這個(gè)情景內(nèi)的兩個(gè)片段都是動(dòng)態(tài)的。一個(gè)產(chǎn)生最高級(jí)的產(chǎn)品片段的JSP包含單個(gè)特定于用戶的個(gè)性化片段。子片段也是JSP,因?yàn)樗糜讷@得用戶的適當(dāng)個(gè)性化數(shù)據(jù)的商業(yè)應(yīng)用邏輯。表3A示出了一個(gè)包含HTML語(yǔ)句的JSP,所述HTML語(yǔ)句用于包含子片段的最高級(jí)產(chǎn)品說(shuō)明片段。---------------------------{html}{head}{title}產(chǎn)品說(shuō)明。{/title}{/head}{/body}{%@pagelanguage=″java″import=″com.acmeStore.databeans.*,com.acmeStore.formatters.*″%}{%//添加產(chǎn)品說(shuō)明。ProductDataBeandatabean=newProductDataBean();databean.setProductId(request.getParameter(″productld″));databean.execute();ProductFormatterproductEormatter=newproductFormatter();out.println(productFormaatter.format(databean));%}{%--添加個(gè)性化信息--%}{jsp:includepage=″/personalization.jsp″}{/body}{/html}表3A-----------------------------表3B示出了會(huì)由Web應(yīng)用服務(wù)器為產(chǎn)品說(shuō)明片段產(chǎn)生的HTTP輸出。-----------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″(productId)″Cache-Control:max-age=600Fragment:contains-fragments{html}{head}{title}產(chǎn)品說(shuō)明。{/title}{/head}{body}{h1}具有購(gòu)物者組的產(chǎn)品。{/h1}…格式化的產(chǎn)品說(shuō)明會(huì)在這里…{fragmentlinksrc=″http://www.acmeStore.com/personalization.jsp″}{/body}{/htm1}表3B----------------------------------表3C示出了一個(gè)包含用于特定于用戶的子片段的HTML語(yǔ)句的JSP。----------------------------------{htm1}{body}{%@pagelanguage=″java″import=″com.acmeStore.databeans.*″%}{%//從userldcookie獲得userID。Cookie[]cookies=request.getCookies();Stringuserld=null;for(inti=0;i{cookies.length;i++){if(cookies[i].getName().equals(″userId″)){userld=cookies[i].getValue();}}″dependencies=\″http://www.acmeStore.com/userId=@($*!%\″″);response.addHeader(″Fragment″,″cacheid=\″(,userld)\″″);//這個(gè)取決于userld:response.addHeader(″Fragment″,″dependencies=\″http://www.acmeStore.com/userId=″+userId+″\″″);//產(chǎn)生個(gè)性化信息。PersonalizationDataBeandatabean=newPersonalizationDataBean();databean.setUserId(userId);databean.execute();Stringpersonalization=databean.getPersonalization();out.println(personalization);%}{/body}{/html}表3C--------------------------------表3D示出了會(huì)由Web應(yīng)用服務(wù)器為子片段產(chǎn)生的HTTP輸出。--------------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:privateCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″(,userId)″Fragment:dependencies=″http://www.acmeStore.com_userId=@($*!%″{html}{body}…個(gè)性化信息在這里…{/body}{/html}表3D----------------------------現(xiàn)在參照表4A-4F,其中示出了用于上述股票監(jiān)視列表例子的一組HTML和HTTP語(yǔ)句。這個(gè)情景內(nèi)的兩個(gè)片段都是動(dòng)態(tài)的。表4A示出了一個(gè)產(chǎn)生包含多個(gè)股票行情片段的最高級(jí)的股票監(jiān)視列表片段的JSP。“jspext:cookie”標(biāo)簽顯示名稱為“userName”的cookie中的用戶名稱。這個(gè)例子動(dòng)態(tài)產(chǎn)生可變數(shù)量的“RequestDispatcher.include”方法調(diào)用,每個(gè)均在輸出中產(chǎn)生一個(gè)FRAGMENTLINK標(biāo)簽。----------------------------{html}{head}{title}股票查看列表。{/title}{/head}{body}{%@pagelanguage=″java″import=″com.acmeInvest.databeans.*″%}{%//從userIdcookie獲得userId。Cookie[]cookies=request.getCookies();StringuserId=null;for(inti=0;i{cookies.length;i++){if(cookies[i].getName().equals(″userId″)){userId=cookies[i].getValue();}}%}{tableborder}{tr}{thcolspan=2align=center}{jspext:cookiename=″userName″}的股票查看列表{/th}{/tr}{tr}{thalign=center}Symbol{/th}{thalign=center}Price{/th}{/tr}{%//向表中添加股票查看列表行。StockListDataBeandatabean=newStockListDataBean();databean.setUserId(userId);databean.execute();String[]symbols=databean.getStockSymbolList();for(inti=0;i{symbols.lengyh;i++){Stringurl=″/stockQuote.jspstockSymbol=″+symbols[i];ServletContextservletContext=getServletContext();RequestDispatcherrequestDispatcher=servletContext.getRequestDispatcher(″/stockQuote.jsp″);requestDispatcher.include(request,response);}%}{/table}{/body}{/html}表4A----------------------------表4B示出了會(huì)由Web應(yīng)用服務(wù)器為股票監(jiān)視列表片段產(chǎn)生的HTTP輸出。----------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:privateCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″(,userId)″Fragment:contains-fragments{html}{body}{tableborder}{tr}{thcolspan=2align=center}{fragmentlinksrc=″cookie://userName″}的股票查看列表{/th}{/tr}{tr}{thalign=center}Symbol{/th}{thalign=eenter}Price{/th}{/tr}{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspsymbol=IBM″}{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspsymboi=CSCO″}{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jspsymbol=DELL″}{/table}{/body}{/html}表4B-------------------------------表4C示出了一個(gè)產(chǎn)生引入FOREACH屬性的最高級(jí)的股票監(jiān)視列表片段的JSP。-------------------------------{html}{head}{title}股票查看列表。{/title}{/head}{body}{%@pagelanguage=″java″import=″com.acmeInvest.databeans.*″%}{tableborder}{tr}{thcolspan=2align=center}{jspext:cookiename=″userName″}的股票查看列表{/th}{/tr}{tr}{thalign=center}Symbol{/th}{thalign=center}Price{/th}{/tr}{jspext:includepage=″/stockQuote.jsp″foreach=″stocks″}{/table}{/body}{/html}表4C---------------------------表4D示出了會(huì)由Web應(yīng)用服務(wù)器針對(duì)引入FOREACH屬性的最高級(jí)的股票監(jiān)視列表片段產(chǎn)生的HTTP輸出。---------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM_HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix}Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:246Content-Type:text/htmlCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:contains-fragmentsFragment:cacheid=″URL″Cache-Control:max-age=600{html}{head}{title}股票查看列表。{/title}{/head}{body}{tableborder}{tr}{thcolspan=2align=center}{fragmentlinksrc=″cookie://userName″}的股票查看列表{/th}{/tr}{tr}{thalign=center}Symbol{/th}{thalign=center}Price{/th}{/tr}{fragmentlinksrc=″http://www.acmeInvest.com/stockQuote.jsp″foreach=″stocks″}{/table}{/body}{/html}表4D------------------------------表4E示出了產(chǎn)生各個(gè)股票行情的JSP。------------------------------{html}{body}{%@pagelanguage″java″import=″com.acmeInvest.databeans.*″%}{%//添加股票行情。StockQuoteDataBeandatabean=newStockQuoteDataBean();Stringsymbol=request.getParameter(″symbol″);databean.setStockSymbol(symbol);databean.execute();Stringquote=databean.getStockQuote();Stringrtn=″{tr}″+″{tdalign=center}″+symbol+″{/td}″+″{tdalign=right}″+quote+″{/td}″+″{/tr}″;out.println(rtn);%}{/body}{/html}表4E---------------------------------表4F示出了會(huì)由Web應(yīng)用服務(wù)器為針對(duì)符號(hào)查詢參數(shù)“IBM”產(chǎn)生的HTTP輸出。----------------------------------HTTP/1.1200OKDate:Mon,23Apr200217:04:04GMTServer:IBM-HTTP_Server/1.3.6.2Apache/1.3.7-dev(Unix)Last-Modified:Wed,11Apr200121:05:09GMTETag:″b7-d8d-3ad4c705″Accept-Ranges:bytesContent-Length:82Content-Type:text/htmlCache-Control:privateCache-Control:no-cachefragmentrulesPragma:no-cacheFragment:cacheid=″(,userId)″Cache-Control:max-age=1200{html}{body}{tr}{tdalign=center}IBM{/td}{tdalign=right}$112.72{/td}{/tr}{/body}{/html}表4F--------------------------------結(jié)論通過(guò)前面提供的對(duì)優(yōu)選實(shí)施例的詳細(xì)描述,應(yīng)當(dāng)可理解本發(fā)明的優(yōu)選實(shí)施例的優(yōu)點(diǎn)??梢栽诓渴鹩谡麄€(gè)網(wǎng)絡(luò)的計(jì)算設(shè)備內(nèi)的高速緩存管理單元內(nèi)實(shí)現(xiàn)片段高速緩存技術(shù),使得這些高速緩存管理單元提供分布式片段高速緩存機(jī)制。FRAGMENT頭被定義成用于例如HTTP的網(wǎng)絡(luò)協(xié)議內(nèi);該頭使元數(shù)據(jù)與片段相關(guān),以用于涉及片段的處理和高速緩存的各種目的。例如,該頭被用來(lái)標(biāo)識(shí)客戶機(jī)、服務(wù)器或某個(gè)中間高速緩存是否具有頁(yè)面裝配能力。該頭也指定用于形成片段的高速緩存標(biāo)識(shí)符的高速緩存ID規(guī)則;這些規(guī)則可以基于片段的URI,或者URI路徑和來(lái)自URI的諸查詢參數(shù)以及伴隨請(qǐng)求的諸cookie的某種組合。另外,該頭可以規(guī)定片段的依賴關(guān)系以支持主機(jī)啟動(dòng)的無(wú)效。FRAGMENTLINK標(biāo)簽被用來(lái)指定頁(yè)面中用于在頁(yè)面裝配或頁(yè)面呈現(xiàn)期間將插入的所包含片段的位置。FRAGMENTLINK標(biāo)簽被定義成包含足夠信息,以或者找到高速緩存中的鏈接片段或者從服務(wù)器獲得該片段。當(dāng)將片段存儲(chǔ)在高速緩存中時(shí),以及當(dāng)處理來(lái)自請(qǐng)求的源標(biāo)識(shí)符以找到高速緩存內(nèi)的片段時(shí),都使用高速緩存ID規(guī)則。為找到高速緩存中的片段,使用與片段的URI路徑相關(guān)的高速緩存ID規(guī)則來(lái)確定高速緩存ID。這些規(guī)則允許在形成片段的高速緩存ID時(shí)具有高度靈活性,而無(wú)需部署強(qiáng)制實(shí)施用于高速緩存ID形成的標(biāo)準(zhǔn)實(shí)現(xiàn)的計(jì)算機(jī)程序。可以使用多個(gè)高速緩存ID規(guī)則。高速緩存ID規(guī)則允許高速緩存ID是片段的完整URI,或是URI和諸查詢參數(shù)或諸cookie的組合。這一方案允許相同的FRAGMENTLINK根據(jù)父片段的查詢參數(shù)和cookie定位不同的片段;例如,對(duì)產(chǎn)品說(shuō)明頁(yè)面的請(qǐng)求中的用戶IDcookie可以被用來(lái)形成用于個(gè)性化片段的高速緩存ID。必須注意,雖然前面在一個(gè)全功能數(shù)據(jù)處理系統(tǒng)的情境下描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域的普通技術(shù)人員會(huì)理解到,可以以計(jì)算機(jī)可讀介質(zhì)中的指令的形式和其它多種形式分發(fā)與本發(fā)明的優(yōu)選實(shí)施例相關(guān)的某些處理,無(wú)論實(shí)際被用來(lái)進(jìn)行分發(fā)的信號(hào)承載介質(zhì)的具體類型是什么。計(jì)算機(jī)可讀介質(zhì)的例子包含諸如EPROM、ROM、磁帶、紙張、軟盤(pán)、硬盤(pán)驅(qū)動(dòng)器、RAM和CD-ROM的介質(zhì),以及諸如數(shù)字和模擬通信鏈路的傳輸類型介質(zhì)。權(quán)利要求1.一種用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)上處理對(duì)象的方法,該方法包括以下步驟在計(jì)算設(shè)備上接收第一消息;以及確定第一消息中的消息頭指示第一消息涉及一片段。2.如權(quán)利要求1所述的方法,還包括以下步驟確定第一消息中的消息頭指示該片段是可高速緩存的。3.如權(quán)利要求1或2所述的方法,還包括以下步驟在由計(jì)算設(shè)備內(nèi)的高速緩存管理單元維護(hù)的高速緩存中存儲(chǔ)來(lái)自第一消息的片段,其中高速緩存管理單元同等地運(yùn)行來(lái)支持片段高速緩存操作,無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)中的客戶機(jī)、服務(wù)器還是集線器。4.如權(quán)利要求3所述的方法,還包括以下步驟在計(jì)算設(shè)備上接收第二消息,其中第二消息包括針對(duì)該片段的請(qǐng)求;響應(yīng)接收到第二消息而搜索高速緩存;響應(yīng)搜索高速緩存而從高速緩存中獲得該片段;以及在第三消息中向第二消息的發(fā)起方發(fā)送該片段,而無(wú)需向第二消息的目的地址發(fā)送第二消息。5.如權(quán)利要求1所述的方法,還包括以下步驟確定該片段是否是包含針對(duì)下一級(jí)片段的鏈接的最高級(jí)片段;響應(yīng)確定該片段是包含針對(duì)下一級(jí)片段的鏈接的最高級(jí)片段,獲得下一級(jí)片段;以及將最高級(jí)片段和下一級(jí)片段組合成裝配的片段。6.如權(quán)利要求1至3中任何一個(gè)所述的方法,還包括以下步驟從第一消息中獲得一組依賴關(guān)系標(biāo)識(shí)符,其中依賴關(guān)系標(biāo)識(shí)符是由發(fā)出該片段的服務(wù)器產(chǎn)生的;以及以和該片段的源標(biāo)識(shí)符相關(guān)的方式存儲(chǔ)該組依賴關(guān)系標(biāo)識(shí)符。7.如權(quán)利要求6所述的方法,還包括以下步驟接收無(wú)效請(qǐng)求消息;從無(wú)效請(qǐng)求消息中獲得依賴關(guān)系標(biāo)識(shí)符;確定與該依賴關(guān)系標(biāo)識(shí)符相關(guān)的一組片段;以及響應(yīng)確定出與該依賴關(guān)系標(biāo)識(shí)符相關(guān)的該組片段而從高速緩存中清除該組片段。8.如權(quán)利要求1至3中任何一個(gè)所述的方法,還包括以下步驟從第一消息中獲得一組片段高速緩存規(guī)則,其中片段高速緩存規(guī)則確定用于為該片段產(chǎn)生高速緩存標(biāo)識(shí)符的方式;以及根據(jù)一片段高速緩存規(guī)則產(chǎn)生該片段的高速緩存標(biāo)識(shí)符。9.如權(quán)利要求8所述的方法,還包括以下步驟使用所產(chǎn)生的用于該片段的高速緩存標(biāo)識(shí)符執(zhí)行存儲(chǔ)操作。10.如權(quán)利要求1所述的方法,其中第一消息包括該片段的源標(biāo)識(shí)符,該方法還包括以下步驟產(chǎn)生包括該片段的應(yīng)答消息;以及在應(yīng)答消息中插入指示第一消息涉及一片段的消息頭。11.如權(quán)利要求10所述的方法,還包括以下步驟在應(yīng)答消息中插入指示該片段可高速緩存的消息頭。12.一種用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)上處理對(duì)象的設(shè)備,該設(shè)備包括用于在一計(jì)算設(shè)備上接收第一消息的裝置;以及用于確定第一消息中的消息頭指示第一消息涉及一片段的裝置。13.如權(quán)利要求12所述的設(shè)備,還包括用于確定第一消息中的消息頭指示該片段可高速緩存的裝置。14.如權(quán)利要求12或13所述的設(shè)備,還包括用于在由計(jì)算設(shè)備內(nèi)的高速緩存管理單元維護(hù)的高速緩存中存儲(chǔ)來(lái)自第一消息的片段的裝置,其中高速緩存管理單元同等地運(yùn)行來(lái)支持片段高速緩存操作,無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)中的客戶機(jī)、服務(wù)器還是集線器。15.如權(quán)利要求14所述的設(shè)備,還包括用于在計(jì)算設(shè)備上接收第二消息的裝置,其中第二消息包括針對(duì)該片段的請(qǐng)求;用于響應(yīng)接收到第二消息而搜索高速緩存的裝置;用于響應(yīng)搜索高速緩存而從高速緩存中獲得該片段的裝置;以及用于在第三消息中向第二消息的發(fā)起方發(fā)送該片段,而無(wú)需向第二消息的目的地址發(fā)送第二消息的裝置。16.如權(quán)利要求12所述的設(shè)備,還包括用于確定該片段是否是包含針對(duì)下一級(jí)片段的鏈接的最高級(jí)片段的裝置;用于響應(yīng)確定該片段是包含針對(duì)下一級(jí)片段的鏈接的最高級(jí)片段,而獲得下一級(jí)片段的裝置;以及用于將最高級(jí)片段和下一級(jí)片段組合成裝配的片段的裝置。17.如權(quán)利要求12到14中任何一個(gè)所述的設(shè)備,還包括用于從第一消息中獲得一組依賴關(guān)系標(biāo)識(shí)符的裝置,其中依賴關(guān)系標(biāo)識(shí)符是由發(fā)出片段的服務(wù)器產(chǎn)生的;以及用于以和該片段的源標(biāo)識(shí)符相關(guān)的方式存儲(chǔ)該組依賴關(guān)系標(biāo)識(shí)符的裝置。18.如權(quán)利要求17所述的設(shè)備,還包括用于接收無(wú)效請(qǐng)求消息的裝置;用于從無(wú)效請(qǐng)求消息獲得依賴關(guān)系標(biāo)識(shí)符的裝置;用于確定與依賴關(guān)系標(biāo)識(shí)符相關(guān)的一組片段的裝置;以及用于響應(yīng)確定出與依賴關(guān)系標(biāo)識(shí)符相關(guān)的該組片段而從高速緩存中清除該組片段的裝置。19.如權(quán)利要求12到14中任何一個(gè)所述的設(shè)備,還包括用于從第一消息獲得一組片段高速緩存規(guī)則的裝置,其中片段高速緩存規(guī)則確定用于產(chǎn)生該片段的高速緩存標(biāo)識(shí)符的方式;以及用于根據(jù)片段高速緩存規(guī)則為該片段產(chǎn)生高速緩存標(biāo)識(shí)符的裝置。20.如權(quán)利要求19所述的設(shè)備,還包括用于使用所產(chǎn)生的用于該片段的高速緩存標(biāo)識(shí)符執(zhí)行存儲(chǔ)操作的裝置。21.如權(quán)利要求12所述的設(shè)備,其中請(qǐng)求消息包括片段的源標(biāo)識(shí)符,該設(shè)備還包括用于產(chǎn)生包括該片段的應(yīng)答消息的裝置;以及用于在應(yīng)答消息中插入指示第一消息涉及一片段的消息頭的裝置。22.如權(quán)利要求21所述的設(shè)備,還包括用于在應(yīng)答消息中插入指示該片段可高速緩存的消息頭的裝置。23.一種計(jì)算機(jī)可讀介質(zhì)中的用于在網(wǎng)絡(luò)中的數(shù)據(jù)處理系統(tǒng)中處理對(duì)象的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括用于執(zhí)行如權(quán)利要求1到11中任何一個(gè)所述的方法的指令。24.一種被計(jì)算設(shè)備用來(lái)定義通過(guò)網(wǎng)絡(luò)發(fā)送的消息的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包括表明消息是請(qǐng)求消息或應(yīng)答消息的指示符;以及片段頭,其包括指示消息將由支持片段的高速緩存管理單元處理的關(guān)鍵字,和指示將處理消息的方式的一或多個(gè)片段頭指令。25.如權(quán)利要求24所述的數(shù)據(jù)結(jié)構(gòu),還包括片段頭指令,其包含在應(yīng)答消息中以指示一組依賴關(guān)系標(biāo)識(shí)符,所述依賴關(guān)系標(biāo)識(shí)符被原始服務(wù)器用來(lái)從支持片段的高速緩存管理單元所維護(hù)的高速緩存中清除應(yīng)答消息中的片段。26.如權(quán)利要求24所述的數(shù)據(jù)結(jié)構(gòu),還包括片段頭指令,其包含在應(yīng)答消息中以指示一組片段高速緩存規(guī)則,所述片段高速緩存規(guī)則被用來(lái)形成唯一標(biāo)識(shí)應(yīng)答消息中的片段的高速緩存標(biāo)識(shí)符。全文摘要本發(fā)明提供了一種用于高速緩存片段的方法、系統(tǒng)、設(shè)備和計(jì)算機(jī)程序產(chǎn)品。當(dāng)在包含高速緩存管理單元的計(jì)算設(shè)備上接收到消息之后,高速緩存消息的消息體中的片段。對(duì)高速緩存管理單元上的該片段的后續(xù)請(qǐng)求產(chǎn)生高速緩存命中。無(wú)論計(jì)算設(shè)備充當(dāng)位于整個(gè)網(wǎng)絡(luò)中的客戶機(jī)、服務(wù)器還是集線器,高速緩存管理單元同等地運(yùn)行來(lái)支持片段高速緩存操作。換言之,片段高速緩存技術(shù)在整個(gè)網(wǎng)絡(luò)中是統(tǒng)一的。高速緩存ID規(guī)則伴隨著來(lái)自原始服務(wù)器的片段;高速緩存ID規(guī)則描述用于形成片段的唯一高速緩存ID,以使動(dòng)態(tài)內(nèi)容能夠在遠(yuǎn)離原始服務(wù)器的位置被高速緩存的方法。文檔編號(hào)H04L29/06GK1605182SQ02825297公開(kāi)日2005年4月6日申請(qǐng)日期2002年12月18日優(yōu)先權(quán)日2001年12月19日發(fā)明者R·阿加瓦拉,J·查林杰,G·科普蘭,A·延加,M·利南,S·梅杜里申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司