日韩成人黄色,透逼一级毛片,狠狠躁天天躁中文字幕,久久久久久亚洲精品不卡,在线看国产美女毛片2019,黄片www.www,一级黄色毛a视频直播

用于模擬服務(wù)器頁(yè)面的處理的系統(tǒng)和方法

文檔序號(hào):6564749閱讀:136來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):用于模擬服務(wù)器頁(yè)面的處理的系統(tǒng)和方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)編程。更具體地,本發(fā)明涉及使用Java編程語(yǔ)言創(chuàng)建動(dòng)態(tài)網(wǎng)絡(luò)應(yīng)用程序。
背景技術(shù)
本領(lǐng)域的技術(shù)人員熟悉用來(lái)創(chuàng)建具有極為動(dòng)態(tài)或極多頁(yè)面的網(wǎng)絡(luò)應(yīng)用程序的方式。動(dòng)態(tài)網(wǎng)頁(yè)并不新鮮。多年來(lái),人們通過(guò)使用來(lái)自C程序的“通用網(wǎng)關(guān)接口”(CGI)而書(shū)寫(xiě)了足夠的網(wǎng)絡(luò)應(yīng)用程序。最近,很多程序員使用Java編程語(yǔ)言和Java小服務(wù)程序(Servlet)技術(shù)來(lái)創(chuàng)建動(dòng)態(tài)網(wǎng)頁(yè)。允許代碼和表示(representation)之間的更好分離的相關(guān)技術(shù)是Java服務(wù)器頁(yè)面技術(shù)。
Java服務(wù)器頁(yè)面是描述對(duì)于給定協(xié)議來(lái)說(shuō)如何根據(jù)請(qǐng)求對(duì)象創(chuàng)建響應(yīng)對(duì)象的文本文檔。這些在“JavaServer Pages(TM)Specification”Version 2.0,Chapter JSP.1.Sun Microsystems,Copyright 2003中進(jìn)行了描述。
在此之前,為了書(shū)寫(xiě)動(dòng)態(tài)網(wǎng)頁(yè)以顯示一日的時(shí)間,例如,將按照與以下簡(jiǎn)化示例有些類(lèi)似的方式來(lái)對(duì)小服務(wù)程序進(jìn)行編碼import java.io.*;import java.util.Date;import javax.servlet.*;import javax.servlet.http.*;public class DateServlet entends HttpServlet{public void doGet(HttpServletRequest req,HttpServletResponse resp){PrintWriter out=resp.getWriter();out.write(″<html><body>The time is″);out.write(new Date().toString());out.write(″</body></html>″);
}}對(duì)于簡(jiǎn)單的網(wǎng)頁(yè),這足夠了,但是對(duì)于需要熟練編寫(xiě)HTML并且也了解Java編程的某些人的服務(wù)的更復(fù)雜的網(wǎng)頁(yè)來(lái)說(shuō),這并不夠。
使得非程序員更容易創(chuàng)建頁(yè)面的小服務(wù)程序技術(shù)發(fā)展到Java服務(wù)器頁(yè)面(JSP)技術(shù)。可以按照以下方式將上述動(dòng)態(tài)網(wǎng)頁(yè)表示為JSP<html>
<body>
The time is<%=new Date().toString()%>
</body>
</html>
對(duì)于精通HTML編寫(xiě)但是編程不熟練的某些人來(lái)說(shuō),這一語(yǔ)法方便得多。然而,它只是一種用來(lái)表示小服務(wù)程序語(yǔ)法的不同的方式。重要的是認(rèn)識(shí)到在運(yùn)行時(shí),這也將被JSP容器轉(zhuǎn)換為小服務(wù)程序。也就是說(shuō),當(dāng)瀏覽器首先請(qǐng)求這一JSP頁(yè)面時(shí),JSP容器將讀取上面示出的文件并且產(chǎn)生與最初示出的小服務(wù)程序示例大致相同的小服務(wù)程序源代碼。然后,它將調(diào)用Java編譯器來(lái)將該Java源代碼轉(zhuǎn)換為Java目標(biāo)代碼。然后,與原來(lái)用小服務(wù)程序的形式表示動(dòng)態(tài)頁(yè)面幾乎一樣,將加載和調(diào)用該新的小服務(wù)程序以處理所述請(qǐng)求。
上述示出的JSP示例看起來(lái)更容易書(shū)寫(xiě),但是想象一下在Java代碼量比該示例中更廣泛的情況下結(jié)果會(huì)怎樣。例如,為了示出午餐菜單,可能有必要書(shū)寫(xiě)代碼,以便在數(shù)據(jù)庫(kù)中查找信息并且在表中為其編排格式。在這種情況下,JSP文件成為標(biāo)記(markup)和Java代碼的難以閱讀的混合體。較好的方法將允許用戶接口專(zhuān)家將精力集中在HTML標(biāo)記上,而Java程序員可以專(zhuān)心于編程邏輯,任何一方都不必?fù)?dān)心與其它方擁有的文件部分的干擾。為了處理這一需求,引入了定制標(biāo)簽的概念、以及提供那些標(biāo)簽的實(shí)現(xiàn)的定制標(biāo)簽庫(kù)。[參見(jiàn)“JavaServer Pages(TM)Specification”Version 2.0,Chapter JSP.8.Sun Microsystems,Santa Clara,CA.Copyright 2003。]使用這樣的標(biāo)簽,為了示出午餐菜單,頁(yè)面編寫(xiě)者可以像下面那樣創(chuàng)建JSP標(biāo)記<html>
<body>
<p>Today′s lunch menu is the following:</p>
<caf:lunchMenu view=″standard″/>
<p>Vegetarians may choose from the following meat-free alternatives:</p>
<caf:lunchMenu view=″vegetarian″/>
</body>
</html>
在此示例中,頁(yè)面編寫(xiě)者使用“定制標(biāo)簽”來(lái)插入動(dòng)態(tài)信息。程序員提供實(shí)現(xiàn)這些定制標(biāo)簽的Java庫(kù)。正如在上一個(gè)JSP示例中那樣,當(dāng)瀏覽器首先請(qǐng)求此頁(yè)面時(shí),JSP容器讀入JSP文件并且創(chuàng)建Java源代碼,隨后它將該Java源代碼編譯為Java目標(biāo)代碼。當(dāng)JSP引用定制標(biāo)簽時(shí),所產(chǎn)生的Java代碼將對(duì)程序員提供的庫(kù)例程進(jìn)行調(diào)用(call)。以這一方式,程序員和用戶接口專(zhuān)家可以各自將精力集中在他們的專(zhuān)長(zhǎng)上。
使用定制標(biāo)簽的JSP示例對(duì)于很多網(wǎng)絡(luò)應(yīng)用程序來(lái)說(shuō)足夠了,但是不能充分處理以下內(nèi)容。
1.具有數(shù)千個(gè)動(dòng)態(tài)網(wǎng)頁(yè)的網(wǎng)絡(luò)應(yīng)用程序。
如上所述,必須在可以訪問(wèn)JSP文件之前將其編譯成小服務(wù)程序。為此,JSP容器創(chuàng)建Java代碼以便表示該小服務(wù)程序。它創(chuàng)造了Java類(lèi)名以用于此Java代碼,將源代碼編譯成目標(biāo)代碼,將所得到的Java類(lèi)定義加載到存儲(chǔ)器中并且著手使用所加載的代碼。在此操作中,存在相當(dāng)多的存儲(chǔ)器開(kāi)銷(xiāo)。存在某種類(lèi)定義信息,其與消耗存儲(chǔ)器資源的每個(gè)新的Java類(lèi)相伴隨。如果在網(wǎng)絡(luò)應(yīng)用程序的存在期內(nèi)對(duì)JSP頁(yè)面引用了一次,則該類(lèi)的類(lèi)定義將被加載和保存在存儲(chǔ)器中,直到該網(wǎng)絡(luò)應(yīng)用程序終止為止。如果網(wǎng)絡(luò)應(yīng)用程序足夠大,那么這可能是個(gè)問(wèn)題。顯然,今后的很多網(wǎng)絡(luò)應(yīng)用程序?qū)⒆銐虼笠灾劣谟龅竭@一問(wèn)題。
2.JSP頁(yè)面不是靜態(tài)的網(wǎng)絡(luò)應(yīng)用程序。
在某些環(huán)境中,將頁(yè)面表示為JSP文件、而仍然向程序員提供在顯示網(wǎng)頁(yè)之前微調(diào)網(wǎng)頁(yè)內(nèi)容的功能是方便的。例如,網(wǎng)絡(luò)應(yīng)用程序的某個(gè)任務(wù)可能希望在示出頁(yè)面之前使用Java代碼來(lái)從JSP添加或刪除標(biāo)記。用于實(shí)現(xiàn)這一操作的直接方法是每次所述任務(wù)希望對(duì)頁(yè)面進(jìn)行改動(dòng)時(shí),都書(shū)寫(xiě)新的JSP文件,但是這一方法將使得對(duì)于JSP文件的每次變化都創(chuàng)建和加載新的小服務(wù)程序類(lèi),從而迅速耗盡存儲(chǔ)器。
3.其頁(yè)面沒(méi)有被存儲(chǔ)為JSP標(biāo)記的網(wǎng)絡(luò)應(yīng)用程序。
為了提供對(duì)于諸如蜂窩電話和PDA的“普通”設(shè)備的支持,在服務(wù)器上,以某種抽象XML來(lái)表示很多動(dòng)態(tài)網(wǎng)頁(yè)。當(dāng)引用頁(yè)面時(shí),在運(yùn)行時(shí)將XML轉(zhuǎn)換為適合目標(biāo)設(shè)備的標(biāo)記。如果通過(guò)轉(zhuǎn)換代碼可以使用現(xiàn)有的定制標(biāo)簽庫(kù),那么這將是有用和方便的。為此,當(dāng)引用頁(yè)面時(shí),轉(zhuǎn)換代碼將動(dòng)態(tài)地創(chuàng)建JSP標(biāo)記。但是,如果使用傳統(tǒng)的JSP容器來(lái)處理JSP標(biāo)記以便將其轉(zhuǎn)換為最終形式(HTML或某種其它標(biāo)記語(yǔ)言),則將創(chuàng)建新的小服務(wù)程序類(lèi)并且將其加載到存儲(chǔ)器中。但是同樣,這是不實(shí)際的,因?yàn)樗鼘⒀杆傧拇鎯?chǔ)器資源。此外,與產(chǎn)生和編譯Java代碼有關(guān)的等待時(shí)間通常是不可接受的。

發(fā)明內(nèi)容
根據(jù)本發(fā)明,提供了一種用于模擬服務(wù)器頁(yè)面的處理的方法和計(jì)算機(jī)程序產(chǎn)品,包括讀取服務(wù)器頁(yè)面,包括識(shí)別對(duì)于定制標(biāo)簽庫(kù)的任何調(diào)用;模擬對(duì)于在服務(wù)器頁(yè)面中經(jīng)識(shí)別的定制標(biāo)簽的任何調(diào)用;以及由此在運(yùn)行時(shí)動(dòng)態(tài)產(chǎn)生和處理服務(wù)器頁(yè)面。
此外,根據(jù)本發(fā)明,提供了一種用于在運(yùn)行時(shí)模擬服務(wù)器頁(yè)面的處理的系統(tǒng),包括定制標(biāo)簽庫(kù);以及服務(wù)器頁(yè)面模擬器,用于讀取服務(wù)器頁(yè)面,包括識(shí)別對(duì)于定制標(biāo)簽庫(kù)的任何調(diào)用并且還用于模擬對(duì)于在服務(wù)器頁(yè)面中經(jīng)識(shí)別的定制標(biāo)簽的任何調(diào)用;以及由此在運(yùn)行時(shí)動(dòng)態(tài)產(chǎn)生和處理服務(wù)器頁(yè)面。
根據(jù)結(jié)合附圖進(jìn)行的對(duì)本發(fā)明的當(dāng)前優(yōu)選實(shí)施例的以下詳細(xì)描述,本發(fā)明的其它特征和優(yōu)點(diǎn)將變得清楚。


圖1是示出根據(jù)本發(fā)明優(yōu)選實(shí)施例的Java服務(wù)器頁(yè)面(JSP)模擬器的環(huán)境(輸入和輸出)的高級(jí)系統(tǒng)圖。
圖2是本發(fā)明優(yōu)選實(shí)施例的方法和結(jié)構(gòu)的示意表示。
圖3是本發(fā)明優(yōu)選實(shí)施例的流程圖表示。
圖4A和4B是從圖3的步驟216起調(diào)用的處理(process)定制標(biāo)簽開(kāi)始(start)方法的流程圖表示。
圖5A和5B是從圖3的步驟220起調(diào)用的處理定制標(biāo)簽結(jié)束方法的流程圖表示。
圖6是用于實(shí)現(xiàn)本發(fā)明優(yōu)選實(shí)施例的計(jì)算機(jī)程序產(chǎn)品的高級(jí)系統(tǒng)圖。
具體實(shí)施例方式
本發(fā)明通過(guò)允許在運(yùn)行時(shí)動(dòng)態(tài)產(chǎn)生和處理Java服務(wù)器頁(yè)面(JSP)自己來(lái)擴(kuò)展Java服務(wù)器頁(yè)面技術(shù)。
參考圖1,在此描述的本發(fā)明通過(guò)創(chuàng)建另一類(lèi)型的JSP容器或模擬器100來(lái)解決上面列出的問(wèn)題,所述模擬器100是不把JSP頁(yè)面(其可被例示為例如盤(pán)上的JSP文件)102編譯為小服務(wù)程序、而是讀取它們并且模擬對(duì)于定制標(biāo)簽庫(kù)104的任何必要調(diào)用242、249、250、251、266、272(圖4B、5A和5B)的模擬器。此方法使得在JSP頁(yè)面102中包括Java小腳本程序(Scriptlet)(嵌入的Java代碼)不實(shí)際,但是當(dāng)使用定制標(biāo)簽214、218(圖3)或者在JSP 2.0規(guī)范中引入的、經(jīng)常是嵌入的Java小腳本程序的可接受的替換的“EL表達(dá)式”222時(shí),此方法非常有用。在“JavaServer Pages(TM)Specification”Version 2.0,Chapter JSP.2.Sun Microsystems,Copyright 2003中描述了EL表達(dá)式。在它與本發(fā)明的JSP模擬器相關(guān)的情況下,EL表達(dá)式是在運(yùn)行時(shí)評(píng)價(jià)的表達(dá)式語(yǔ)法。在EL表達(dá)式中使用的函數(shù)名被映射到標(biāo)簽語(yǔ)言定義(TLD)文件300(圖2)中的定義類(lèi)和函數(shù)簽名。
JSP容器或模擬器100可以讀取JSP頁(yè)面102——其不需要是盤(pán)上的文件;它可以僅駐留在已經(jīng)由運(yùn)行的任務(wù)在運(yùn)行中創(chuàng)建的存儲(chǔ)器中——并且創(chuàng)建使得定制標(biāo)簽實(shí)現(xiàn)不可能將JSP模擬器100與傳統(tǒng)的JSP容器區(qū)分開(kāi)的環(huán)境。
如將在下文中結(jié)合圖3、4A、4B、5A和5C而更充分地描述的那樣,當(dāng)模擬器100分析(步驟208)JSP頁(yè)面102時(shí),作為輸出流或最終標(biāo)記112而直接寫(xiě)入212被確定為“模板文本”210的任何文本。當(dāng)在JSP頁(yè)面102中遇到定制標(biāo)簽214、218時(shí),模擬器100向定制標(biāo)簽庫(kù)實(shí)現(xiàn)104發(fā)出調(diào)用242、249、250、251、266和/或272,從而提供定制標(biāo)簽庫(kù)104期望傳統(tǒng)JSP容器提供的所有相同目標(biāo)的實(shí)現(xiàn)。最重要的目標(biāo)是在定制標(biāo)簽代碼104用來(lái)寫(xiě)入動(dòng)態(tài)內(nèi)容的頁(yè)面上下文(pagecontext)對(duì)象350(在步驟206中創(chuàng)建)中包含的輸出流的實(shí)現(xiàn)。定制標(biāo)簽實(shí)現(xiàn)如它通常所做的那樣進(jìn)行并且產(chǎn)生動(dòng)態(tài)內(nèi)容。通過(guò)步驟212和224以及在步驟242、250、266和272中由定制標(biāo)簽實(shí)現(xiàn)產(chǎn)生的任何輸出來(lái)產(chǎn)生最終內(nèi)容或標(biāo)記112并將其饋送給諸如瀏覽器的某個(gè)目的地106。
如上面隱含的那樣,本發(fā)明的優(yōu)點(diǎn)在于相對(duì)于將JSP頁(yè)面102編譯為小服務(wù)程序的傳統(tǒng)方法,它節(jié)省了存儲(chǔ)器并且它允許動(dòng)態(tài)地產(chǎn)生JSP頁(yè)面內(nèi)容102本身,這使得用傳統(tǒng)容器將是不實(shí)際的。即使存儲(chǔ)器開(kāi)銷(xiāo)不是問(wèn)題,實(shí)際上,模擬JSP頁(yè)面102所花費(fèi)的時(shí)間也是將其轉(zhuǎn)換為小服務(wù)程序并且編譯和加載該新的小服務(wù)程序所花費(fèi)的時(shí)間的一小部分,因此,如果應(yīng)用程序在運(yùn)行時(shí)產(chǎn)生JSP頁(yè)面102,則模擬器100執(zhí)行得好的多。隨著較大的重要網(wǎng)絡(luò)應(yīng)用程序282(圖2)的迅速增多,這是對(duì)傳統(tǒng)JSP容器的有價(jià)值的替換。
傳統(tǒng)JSP容器將產(chǎn)生代表小服務(wù)程序的Java源代碼,將該Java源代碼編譯為Java目標(biāo)代碼,加載新的Java類(lèi)定義并且隨后像小服務(wù)程序一樣對(duì)待它。然而,根據(jù)本發(fā)明,JSP模擬器100讀取JSP頁(yè)面102,分析內(nèi)容并且立即處理它以產(chǎn)生輸出112,包括調(diào)用定制標(biāo)簽庫(kù)104實(shí)現(xiàn)。本發(fā)明的優(yōu)點(diǎn)是定制標(biāo)簽庫(kù)104實(shí)現(xiàn)不能檢測(cè)來(lái)自本發(fā)明的JSP模擬器100和傳統(tǒng)JSP容器的調(diào)用的差別。
在所述規(guī)范“JavaServer Pages(TM)Specification”Version 2.0,ChapterJSP.1.Sun Microsystems,Copyright 2003中描述了用于JSP頁(yè)面102的語(yǔ)法。先前給出的自助餐廳的示例是它的一個(gè)示例。可以通過(guò)使運(yùn)行的任務(wù)將文件寫(xiě)入盤(pán)來(lái)由該運(yùn)行的任務(wù)在運(yùn)行時(shí)創(chuàng)建頁(yè)面102,或者甚至可以在不寫(xiě)入盤(pán)的情況下,將文件內(nèi)容置于存儲(chǔ)器中以便由JSP模擬器100處理。
通過(guò)步驟206以及在步驟224、242、249、250、251、266和272中提供給定制標(biāo)簽庫(kù)104實(shí)現(xiàn)的方法參數(shù)(argument)來(lái)創(chuàng)建環(huán)境,其中對(duì)于定制標(biāo)簽104實(shí)現(xiàn)來(lái)說(shuō)該環(huán)境不可能與傳統(tǒng)JSP容器區(qū)分。
最終標(biāo)記或輸出流112是將來(lái)自JSP模擬器100的輸出寫(xiě)入的地方。它通常被最終發(fā)送給瀏覽器106。在最終標(biāo)記112中,在模板文本、表達(dá)式、或任何其它種類(lèi)的輸入之間不存在區(qū)別,因?yàn)榇藭r(shí)它們都已經(jīng)被處理成也被稱(chēng)為標(biāo)記的純文本。如在這里使用的那樣,模板文本為不是定制標(biāo)簽庫(kù)引用(reference)或EL表達(dá)式的任何文本。定制標(biāo)簽庫(kù)104代碼是使用Java API創(chuàng)建的Java代碼。例如JspWriter writer=pageConext.getOUt();
writer.write(″This is dynamic output″);參考圖2,闡述了本發(fā)明優(yōu)選實(shí)施例的某些編程結(jié)構(gòu)和方法。將結(jié)合對(duì)圖3、4A、4B、5A和5B的流程圖的以下描述來(lái)對(duì)此進(jìn)行介紹。
結(jié)合圖2參考圖3,由JSP模擬器100執(zhí)行的處理在步驟200開(kāi)始。在步驟202中,如果尚未進(jìn)行,則JSP模擬器100發(fā)現(xiàn)和分析用于這一服務(wù)器280上下文的標(biāo)簽語(yǔ)言定義(TLD)文件300。“服務(wù)器上下文”是指特定的網(wǎng)絡(luò)應(yīng)用程序282。網(wǎng)絡(luò)服務(wù)器280可以容留若干網(wǎng)絡(luò)應(yīng)用程序282并且每一個(gè)可以使用一組不同的定制標(biāo)簽庫(kù)104。TLD文件300是包含關(guān)于定制標(biāo)簽104的名稱(chēng)和合法標(biāo)簽屬性的名稱(chēng)的信息、關(guān)于需要屬性或者屬性可以接受作為表達(dá)式的值的信息、以及實(shí)現(xiàn)定制標(biāo)簽處理的Java類(lèi)的名稱(chēng)。
在步驟204中,JSP模擬器100分析JSP頁(yè)面102并且創(chuàng)建存儲(chǔ)器節(jié)點(diǎn)樹(shù)302,其中,每個(gè)節(jié)點(diǎn)是JSP元素304并且為JSP頁(yè)面102中的每種類(lèi)型的元素提供節(jié)點(diǎn)。因此,樹(shù)302是JSP頁(yè)面102中的文檔303的分析過(guò)的表示。JSP頁(yè)面102包含標(biāo)記、表達(dá)式以及對(duì)定制標(biāo)簽的引用并且TLD 300包含關(guān)于合法標(biāo)簽的信息。
在步驟206中,JSP模擬器100創(chuàng)建和初始化PageConetxt對(duì)象350。在步驟208中,JSP模擬器100通過(guò)樹(shù)302下行,從而處理每個(gè)節(jié)點(diǎn)或元素304。
如果此JSP元素或節(jié)點(diǎn)304是模板文本210,則在步驟212中,將文本字符寫(xiě)入輸出流112。
如果此元素304是標(biāo)簽開(kāi)始214,則在步驟216中,JSP模擬器100調(diào)用執(zhí)行圖4A和4B的處理的定制標(biāo)簽開(kāi)始322。
如果此元素304是標(biāo)簽結(jié)束218,則在步驟220中,JSP模擬器100調(diào)用執(zhí)行圖5A和5B的處理的定制標(biāo)簽結(jié)束方法324。
如果此元素304是EL表達(dá)式222,則在步驟224中,調(diào)用方法評(píng)價(jià)EL表達(dá)式326并將結(jié)果寫(xiě)入輸出流(即,最終標(biāo)記112)。
如果此元素304不是元素210、214、218和222中的任何一個(gè),則在步驟226中,JSP模擬器100結(jié)束。因此,當(dāng)在樹(shù)302中不再有元素時(shí),模擬器100結(jié)束處理頁(yè)面102。將沒(méi)有被具體識(shí)別出的任何語(yǔ)法假設(shè)為模板文本210。
參考圖4A和4B,從步驟212起調(diào)用的定制標(biāo)簽開(kāi)始方法322在步驟230處開(kāi)始并且輸入包括頁(yè)面上下文350以及父標(biāo)簽和屬性值。在步驟232中,JSP模擬器100檢驗(yàn)屬性的正確性,包括所需屬性是否存在。
在步驟234中,如果TLD 300指示標(biāo)簽主體314必須為空,則JSP模擬器100確定標(biāo)簽主體314是否為空。也就是說(shuō),TLD 300指示是否允許某個(gè)標(biāo)簽包含主體。
在步驟236中,JSP模擬器100從標(biāo)簽池330中檢索標(biāo)簽句柄332的實(shí)例,或者如果在池330中不存在可用實(shí)例則創(chuàng)建一個(gè)。(已經(jīng)在初始化或開(kāi)始步驟200期間由JSP模擬器建立了標(biāo)簽池330。)在步驟238中,JSP模擬器100設(shè)置句柄實(shí)例332的性質(zhì),包括頁(yè)面上下文350、父標(biāo)簽352、和屬性值354(通過(guò)評(píng)價(jià)設(shè)置這些值354的任何EL表達(dá)式222來(lái)設(shè)置后者)。
在步驟240中,JSP模擬器100將關(guān)于此定制標(biāo)簽104的信息推到標(biāo)簽狀態(tài)棧360上。標(biāo)簽庫(kù)104包含定制標(biāo)簽的實(shí)現(xiàn)。JSP元素304包含對(duì)于特定標(biāo)簽104的引用或“調(diào)用”。這一步驟240在棧360上儲(chǔ)存關(guān)于對(duì)此特定標(biāo)簽的這一特定調(diào)用的這種調(diào)用信息。由于一個(gè)調(diào)用的主體可以包含對(duì)其它或者甚至相同標(biāo)簽104的調(diào)用,因此這樣的嵌套是可以的。所儲(chǔ)存的信息包括對(duì)這一標(biāo)簽104的引用、對(duì)其中嵌套這一標(biāo)簽的任何父標(biāo)簽104的引用352、指定的屬性名稱(chēng)和值354、標(biāo)簽主體314是否為空等等。
在步驟242中,JSP模擬器100調(diào)用標(biāo)簽句柄實(shí)例332的DoStartTag()(處理開(kāi)始標(biāo)簽())方法。DoStartTag()方法將返回Skip_Body 243(跳過(guò)_主體243)、Eval_Body_Include 246(評(píng)價(jià)_主體_包括246)或Eval_Body_Buffered 248(評(píng)價(jià)_主體_緩沖248)的響應(yīng)。
如果來(lái)自DoStartTag()方法的響應(yīng)242是Skip_Body 243,則在步驟244中,標(biāo)簽開(kāi)始方法332跳過(guò)主體314并且在定制標(biāo)簽結(jié)束310之前向JSP模擬器100返回處理。
在步驟246和248中,如果來(lái)自DoStartTag()方法的響應(yīng)334分別是Eval_Body_Include 246或Evan_Body_Buffered 248,則DoStartTag()方法322調(diào)用PageContext.PushBody()249(頁(yè)面上下文.進(jìn)棧主體()249)、BodyTag.SetBodyContent()250(主體標(biāo)簽.設(shè)置主體內(nèi)容()250)、以及BodyTag.DoInitBody()251(主體標(biāo)簽.處理初始化主體()251)并且在步驟252中結(jié)束,從而在步驟208向JSP模擬器100返回控制。當(dāng)來(lái)自DoStartTag()的響應(yīng)334不是響應(yīng)243、246或248中的任何一個(gè)時(shí),對(duì)錯(cuò)誤條件進(jìn)行標(biāo)記并且標(biāo)簽開(kāi)始方法322結(jié)束252。
Skip_Body 243、Eval_Body_Include 246和Eval_Body_Buffered 248是來(lái)自DoStartTag()方法調(diào)用的可能返回值。DoStartTag()的定制標(biāo)簽的實(shí)現(xiàn)(步驟242)返回控制后續(xù)處理并且可指示所述主體應(yīng)當(dāng)被跳過(guò)、被正常處理、或者作為成批數(shù)據(jù)而被提供給標(biāo)簽實(shí)現(xiàn)的值。
參考圖5A和5B,結(jié)合圖2,從步驟220起調(diào)用的處理定制標(biāo)簽結(jié)束方法324在步驟260開(kāi)始。在步驟262中,從JSP模擬器100的標(biāo)簽狀態(tài)棧360彈出關(guān)于此定制標(biāo)簽的信息。
在步驟264中,JSP模擬器100確定此標(biāo)簽是否是迭代標(biāo)簽以及主體314是否已被處理。如果不是,則處理在步驟272繼續(xù)進(jìn)行。如果是,則在步驟266中,JSP模擬器100調(diào)用DoAfterBody()(在主體之后處理)方法。利用定制標(biāo)簽句柄332來(lái)實(shí)現(xiàn)所述DoAfterBody()方法。當(dāng)JSP容器完成處理所述主體時(shí),對(duì)其進(jìn)行調(diào)用。在此方法中,所述句柄可以做它在那時(shí)想做的任何事情。在迭代標(biāo)簽的情況下,它還利用返回值指示JSP容器是否應(yīng)當(dāng)循環(huán)并且再次處理所述主體。
在步驟268中,JSP模擬器100確定響應(yīng)是否是Eval_Body_Again,并且,如果是,則在步驟270中通過(guò)返回步驟266來(lái)處理標(biāo)簽主體,即另一次重復(fù)。如果不是,則處理繼續(xù)進(jìn)行到步驟272。
在步驟272中,JSP模擬器100調(diào)用其DoEndTag()(處理結(jié)束標(biāo)簽())方法。DoEndTag()也是由定制標(biāo)簽句柄332實(shí)現(xiàn),并且當(dāng)JSP容器100處理結(jié)束標(biāo)簽218時(shí)被調(diào)用。在此方法中,句柄332可以做它想做的任何事情。它通常向輸出流112寫(xiě)入某些內(nèi)容。它還通過(guò)返回值指示JSP容器100是應(yīng)當(dāng)繼續(xù)并且處理更多標(biāo)簽還是立即停止。在“JavaServer Pages(TM)Specification”Version 2.0.Sun Microsystems,Copyright 2003中描述了所有這些方法。
在步驟274中,JSP模擬器100確定響應(yīng)是否是Skip_page(跳過(guò)頁(yè)面)。如果是,則在步驟276中,JSP模擬器100安排跳過(guò)頁(yè)面的其余部分并且在步驟278終止,從而向步驟208返回控制,以便在樹(shù)302中仍然存在JSP元素304時(shí)處理下一個(gè)JSP元素304。
圖3中的處理結(jié)果是最終標(biāo)記或輸出流112。此輸出是通常作為對(duì)由瀏覽器做出的網(wǎng)絡(luò)請(qǐng)求的響應(yīng)而被發(fā)送給瀏覽器的文本。
相對(duì)于現(xiàn)有技術(shù)的優(yōu)點(diǎn)本發(fā)明的優(yōu)點(diǎn)是提供了一種用于模擬Java服務(wù)器頁(yè)面的處理的系統(tǒng)和方法。
替換實(shí)施例本發(fā)明可以采用全硬件實(shí)施例、全軟件實(shí)施例或者既包含硬件又包含軟件元素的實(shí)施例的形式。在優(yōu)選實(shí)施例中,用軟件來(lái)實(shí)現(xiàn)本發(fā)明,所述軟件包括但不限于固件、駐留軟件、微代碼等。
此外,參考圖6,本發(fā)明可以采用能夠從計(jì)算機(jī)可用或計(jì)算機(jī)可讀介質(zhì)120訪問(wèn)的計(jì)算機(jī)程序產(chǎn)品的形式,所述計(jì)算機(jī)可用或計(jì)算機(jī)可讀介質(zhì)120提供用于由計(jì)算機(jī)124或任何指令執(zhí)行系統(tǒng)執(zhí)行或者與計(jì)算機(jī)124或任何指令執(zhí)行系統(tǒng)結(jié)合使用的程序代碼122。出于這一描述的目的,計(jì)算機(jī)可用或計(jì)算機(jī)可讀介質(zhì)120可以是可包含、存儲(chǔ)、傳送、傳播或傳輸用于由指令執(zhí)行系統(tǒng)、裝置或設(shè)備124使用或者與指令執(zhí)行系統(tǒng)、裝置或設(shè)備124結(jié)合使用的程序的任何裝置。
介質(zhì)120可以是電子、磁、光、電磁、紅外或半導(dǎo)體系統(tǒng)(或裝置或設(shè)備)或者傳播介質(zhì)。計(jì)算機(jī)可讀介質(zhì)的示例包括半導(dǎo)體或固態(tài)存儲(chǔ)器、磁帶、可拆卸計(jì)算機(jī)盤(pán)、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、硬磁盤(pán)和光盤(pán)。光盤(pán)的當(dāng)前示例包括致密盤(pán)-只讀存儲(chǔ)器(CD-ROM)、致密盤(pán)-讀/寫(xiě)(CD-R/W)和DVD。
適合存儲(chǔ)和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)將包括通過(guò)系統(tǒng)總線直接或間接耦接到存儲(chǔ)器元件的至少一個(gè)處理器124。存儲(chǔ)器元件可以包括在實(shí)際執(zhí)行程序代碼期間采用的本地存儲(chǔ)器、大容量存儲(chǔ)器、以及高速緩沖存儲(chǔ)器,所述高速緩沖存儲(chǔ)器提供至少一些程序代碼的臨時(shí)存儲(chǔ),以便減少在執(zhí)行期間必須從大容量存儲(chǔ)器檢索代碼的次數(shù)。
輸入/輸出或I/O設(shè)備(包括但不限于鍵盤(pán)、顯示器、指示設(shè)備等)可以直接或者通過(guò)中間I/O控制器耦接到所述系統(tǒng)。
網(wǎng)絡(luò)適配器也可以耦接到所述系統(tǒng),以便允許數(shù)據(jù)處理系統(tǒng)通過(guò)中間專(zhuān)用或公共網(wǎng)絡(luò)耦接到其它數(shù)據(jù)處理系統(tǒng)或遠(yuǎn)程打印機(jī)或存儲(chǔ)設(shè)備。調(diào)制解調(diào)器、電纜調(diào)制解調(diào)器和以太網(wǎng)卡只是目前可以獲得的網(wǎng)絡(luò)適配器的類(lèi)型中的一些。
因此,本發(fā)明的保護(hù)范圍僅由所附權(quán)利要求及其等同物限定。
權(quán)利要求
1.一種用于模擬服務(wù)器頁(yè)面的處理的方法,包括讀取所述服務(wù)器頁(yè)面,包括識(shí)別對(duì)定制標(biāo)簽庫(kù)的任何調(diào)用;模擬對(duì)在所述服務(wù)器頁(yè)面中經(jīng)識(shí)別的定制標(biāo)簽的任何調(diào)用;以及由此,在運(yùn)行時(shí)動(dòng)態(tài)地產(chǎn)生和處理所述服務(wù)器頁(yè)面。
2.如權(quán)利要求1所述的方法,還包括所述調(diào)用有選擇地包括開(kāi)始標(biāo)簽、調(diào)用頁(yè)面上下文進(jìn)棧主體、調(diào)用主體標(biāo)簽設(shè)置主體內(nèi)容、調(diào)用主體標(biāo)簽處理初始化主體、在主體之后處理以及處理結(jié)束標(biāo)簽。
3.如權(quán)利要求1所述的方法,還包括發(fā)現(xiàn)和分析用于此服務(wù)器上下文的標(biāo)簽語(yǔ)言定義TLD文件;分析所述服務(wù)器頁(yè)面,以便為樹(shù)的每個(gè)元素創(chuàng)建節(jié)點(diǎn)樹(shù);創(chuàng)建和初始化頁(yè)面上下文對(duì)象;依序處理所述樹(shù),以便將每個(gè)所述節(jié)點(diǎn)識(shí)別為模板文本、定制標(biāo)簽開(kāi)始、定制標(biāo)簽結(jié)束以及表達(dá)式語(yǔ)言EL表達(dá)式之一;響應(yīng)于此節(jié)點(diǎn)是模板文本,將所述文本直接寫(xiě)入最終標(biāo)記;響應(yīng)于此節(jié)點(diǎn)是定制標(biāo)簽開(kāi)始,處理定制標(biāo)簽開(kāi)始方法,包括驗(yàn)證屬性的正確性,包括所需屬性是否存在;如果所述TLD文件需要標(biāo)簽主體為空,則驗(yàn)證所述標(biāo)簽主體是否為空;設(shè)置標(biāo)簽句柄實(shí)例的性質(zhì),以包括所述頁(yè)面上下文、任何父標(biāo)簽、以及根據(jù)評(píng)價(jià)任何EL表達(dá)式所確定的任何屬性值;將關(guān)于此定制標(biāo)簽的信息推到標(biāo)簽狀態(tài)棧上;從所述定制標(biāo)簽開(kāi)始方法接收響應(yīng)代碼,所述響應(yīng)代碼是跳過(guò)主體、評(píng)價(jià)主體包括和評(píng)價(jià)主體緩沖之一;響應(yīng)于所述響應(yīng)代碼是跳過(guò)主體,跳過(guò)主體;響應(yīng)于所述響應(yīng)代碼是評(píng)價(jià)主體包括和評(píng)價(jià)主體緩沖之一,調(diào)用用于頁(yè)面上下文進(jìn)棧主體、主體標(biāo)簽組主體內(nèi)容和主體標(biāo)簽處理初始化主體的方法;響應(yīng)于此代碼是標(biāo)簽結(jié)束,處理定制標(biāo)簽結(jié)束方法,包括確定此定制標(biāo)簽是否是迭代以及所述主體是否已被處理,并且如果不是,則調(diào)用處理結(jié)束標(biāo)簽方法;響應(yīng)于此定制標(biāo)簽不是迭代并且所述主體已被處理,調(diào)用在主體之后處理方法,以便處理每個(gè)剩余的迭代并且隨后調(diào)用所述處理結(jié)束標(biāo)簽方法;響應(yīng)于來(lái)自所述處理結(jié)束標(biāo)簽方法的跳過(guò)網(wǎng)頁(yè)響應(yīng),安排將要跳過(guò)的這一頁(yè)面的剩余部分;響應(yīng)于此節(jié)點(diǎn)是EL表達(dá)式,評(píng)價(jià)所述EL表達(dá)式并且將結(jié)果寫(xiě)入所述最終標(biāo)記。
4.如權(quán)利要求3所述的方法,所述最終標(biāo)記包括被處理為純文本的模板文本、定制標(biāo)簽評(píng)價(jià)以及EL表達(dá)式。
5.如權(quán)利要求2所述的方法,還包括所述調(diào)用有選擇地包括Java dostarttag()、調(diào)用pagecontext.pushbody()、調(diào)用bodytag.setbodycontent()、調(diào)用bodytag.doinitbody()、doafterbody()和doendtag()方法。
6.如權(quán)利要求1所述的方法,所述服務(wù)器頁(yè)面是Java服務(wù)器頁(yè)面JSP并且還包括當(dāng)分析所述服務(wù)器頁(yè)面時(shí),將被確定為模板文本的任何文本直接寫(xiě)入到最終標(biāo)記。
7.一種用于在運(yùn)行時(shí)模擬服務(wù)器頁(yè)面的處理的系統(tǒng),包括定制標(biāo)簽庫(kù);服務(wù)器頁(yè)面模擬器;所述服務(wù)器頁(yè)面模擬器,用于讀取所述服務(wù)器頁(yè)面,包括識(shí)別對(duì)所述定制標(biāo)簽庫(kù)的任何調(diào)用;所述服務(wù)器頁(yè)面模擬器還用于模擬對(duì)在所述服務(wù)器頁(yè)面中經(jīng)識(shí)別的所述定制標(biāo)簽的任何調(diào)用;和由此,在運(yùn)行時(shí)動(dòng)態(tài)產(chǎn)生和處理所述服務(wù)器頁(yè)面。
8.如權(quán)利要求7所述的系統(tǒng),還包括所述調(diào)用有選擇地包括開(kāi)始標(biāo)簽、調(diào)用頁(yè)面上下文進(jìn)棧主體、調(diào)用主體標(biāo)簽設(shè)置主體內(nèi)容、調(diào)用主體標(biāo)簽處理初始化主體、在主體之后處理和處理結(jié)束標(biāo)簽。
9.如權(quán)利要求7所述的系統(tǒng),還包括標(biāo)簽語(yǔ)言定義TLD文件;所述服務(wù)器頁(yè)面模擬器還用于發(fā)現(xiàn)和分析用于此服務(wù)器上下文的標(biāo)簽語(yǔ)言定義TLD文件;所述服務(wù)器頁(yè)面模擬器還用于分析所述服務(wù)器頁(yè)面,以便為樹(shù)的每個(gè)元素創(chuàng)建節(jié)點(diǎn)樹(shù);所述服務(wù)器頁(yè)面模擬器還用于創(chuàng)建和初始化頁(yè)面上下文對(duì)象;所述服務(wù)器頁(yè)面模擬器還用于依序處理所述樹(shù),以便將每個(gè)所述節(jié)點(diǎn)識(shí)別為模板文本、定制標(biāo)簽開(kāi)始、定制標(biāo)簽結(jié)束以及表達(dá)式語(yǔ)言EL表達(dá)式之一;所述服務(wù)器頁(yè)面模擬器還響應(yīng)于這一節(jié)點(diǎn)是模板文本而將所述文本直接寫(xiě)入最終標(biāo)記;所述服務(wù)器頁(yè)面模擬器還響應(yīng)于這一節(jié)點(diǎn)是定制標(biāo)簽開(kāi)始而處理定制標(biāo)簽開(kāi)始方法,包括驗(yàn)證屬性的正確性、包括所需屬性是否存在;如果所述TLD文件需要標(biāo)簽主體為空,則驗(yàn)證標(biāo)簽主體是否為空;設(shè)置標(biāo)簽句柄實(shí)例的性質(zhì),以便包括所述頁(yè)面上下文、任何父標(biāo)簽、以及根據(jù)評(píng)價(jià)任何EL表達(dá)式所確定的任何屬性值;將關(guān)于此定制標(biāo)簽的信息推到標(biāo)簽狀態(tài)棧上;從所述定制標(biāo)簽開(kāi)始方法接收響應(yīng)代碼,所述響應(yīng)代碼是跳過(guò)主體、評(píng)價(jià)主體包括和評(píng)價(jià)主體緩沖之一;響應(yīng)于所述響應(yīng)代碼是跳過(guò)主體,跳過(guò)主體;響應(yīng)于所述響應(yīng)代碼是評(píng)價(jià)主體包括和評(píng)價(jià)主體緩沖之一,調(diào)用用于頁(yè)面上下文進(jìn)棧主體、主體標(biāo)簽組主體內(nèi)容以及主體標(biāo)簽作初始化主體的方法;所述服務(wù)器頁(yè)面模擬器還響應(yīng)于這一節(jié)點(diǎn)是標(biāo)簽結(jié)束而用于處理定制標(biāo)簽結(jié)束方法,包括確定此定制標(biāo)簽是否是迭代以及所述主體是否已被處理,并且如果不是,則調(diào)用處理結(jié)束標(biāo)簽方法;響應(yīng)于這一定制標(biāo)簽不是迭代并且所述主體已被處理,調(diào)用在主體之后處理方法,以處理每個(gè)剩余迭代并且隨后調(diào)用所述處理結(jié)束標(biāo)簽方法;響應(yīng)于來(lái)自所述處理結(jié)束標(biāo)簽方法的跳過(guò)網(wǎng)頁(yè)響應(yīng),安排將要跳過(guò)的這一頁(yè)面的剩余部分;所述服務(wù)器頁(yè)面模擬器還響應(yīng)于這一節(jié)點(diǎn)是EL表達(dá)式而用于評(píng)價(jià)所述EL表達(dá)式并且將結(jié)果寫(xiě)入所述最終標(biāo)記。
10.如權(quán)利要求9所述的系統(tǒng),所述最終標(biāo)記包括被處理為純文本的模板文本、定制標(biāo)簽評(píng)價(jià)以及EL表達(dá)式。
11.如權(quán)利要求8所述的系統(tǒng),還包括所述調(diào)用有選擇地包括Java dostarttag()、調(diào)用pagecontext.pushbody()、調(diào)用bodytag.setbodycontent()、調(diào)用bodytag.doinitbody()、doanerbody()和doendtag()方法。
12.如權(quán)利要求7所述的系統(tǒng),所述服務(wù)器頁(yè)面是Java服務(wù)器頁(yè)面JSP并且還包括所述服務(wù)器頁(yè)面模擬器還用于在分析所述服務(wù)器頁(yè)面時(shí),將被確定為模板文本的任何文本直接寫(xiě)入最終標(biāo)記。
13.如權(quán)利要求1所述的方法,還包括分析每個(gè)所述服務(wù)器頁(yè)面,以便為所述服務(wù)器頁(yè)面的每個(gè)元素創(chuàng)建節(jié)點(diǎn)樹(shù);將每個(gè)所述節(jié)點(diǎn)識(shí)別為模板文本、定制標(biāo)簽開(kāi)始、定制標(biāo)簽結(jié)束以及表達(dá)式語(yǔ)言EL表達(dá)式之一;對(duì)于每個(gè)模板文本節(jié)點(diǎn),將文本直接寫(xiě)入最終標(biāo)記;對(duì)于每個(gè)定制標(biāo)簽開(kāi)始和定制標(biāo)簽結(jié)束節(jié)點(diǎn)對(duì),有選擇地跳過(guò)、正常處理、以及作為成批數(shù)據(jù)提供給標(biāo)簽實(shí)現(xiàn);以及對(duì)于每個(gè)EL表達(dá)式節(jié)點(diǎn),評(píng)價(jià)所述EL表達(dá)式并將結(jié)果寫(xiě)入最終標(biāo)記。
全文摘要
在運(yùn)行時(shí)模擬服務(wù)器頁(yè)面的處理。系統(tǒng)包括定制標(biāo)簽庫(kù)和服務(wù)器頁(yè)面模擬器,所述服務(wù)器頁(yè)面模擬器用于讀取服務(wù)器頁(yè)面,包括識(shí)別對(duì)定制標(biāo)簽庫(kù)的任何調(diào)用并且還用于模擬對(duì)在服務(wù)器頁(yè)面中經(jīng)識(shí)別的定制標(biāo)簽的任何調(diào)用,以及由此在運(yùn)行時(shí)動(dòng)態(tài)產(chǎn)生和處理服務(wù)器頁(yè)面。分析每個(gè)服務(wù)器頁(yè)面,以便為所述頁(yè)面的每個(gè)元素創(chuàng)建節(jié)點(diǎn)樹(shù)并且每個(gè)節(jié)點(diǎn)被識(shí)別為模板文本、定制標(biāo)簽開(kāi)始、定制標(biāo)簽結(jié)束以及表達(dá)式語(yǔ)言(EL)表達(dá)式之一。對(duì)于每個(gè)模板文本節(jié)點(diǎn),將文本直接寫(xiě)入最終標(biāo)記。對(duì)于每個(gè)定制標(biāo)簽節(jié)點(diǎn),返回代碼指示所述主體應(yīng)當(dāng)被跳過(guò)、被正常處理、或者作為成批數(shù)據(jù)而被提供給標(biāo)簽實(shí)現(xiàn)。對(duì)于每個(gè)EL表達(dá)式節(jié)點(diǎn),評(píng)價(jià)所述EL表達(dá)式并將結(jié)果寫(xiě)入最終標(biāo)記。
文檔編號(hào)G06F9/46GK1987783SQ200610171719
公開(kāi)日2007年6月27日 申請(qǐng)日期2006年12月19日 優(yōu)先權(quán)日2005年12月20日
發(fā)明者詹姆斯·P·亨尼西 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1