在服務(wù)器端運(yùn)行文件的方法_第1頁
在服務(wù)器端運(yùn)行文件的方法_第2頁
在服務(wù)器端運(yùn)行文件的方法_第3頁
在服務(wù)器端運(yùn)行文件的方法_第4頁
在服務(wù)器端運(yùn)行文件的方法_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

行文件的方法使用javax.scriptAPI本節(jié)給出了javax.scriptAPI的概覽,展示了如何執(zhí)行腳本來訪問Java對(duì)象、謝謝閱讀如何從Java代碼調(diào)用JavaScript感謝閱讀執(zhí)行腳本javax.scriptAPI十分簡單??梢韵葎?chuàng)建一個(gè)ScriptEngineManager實(shí)例,有了感謝閱讀這個(gè)實(shí)例就能用下列方法中的任一個(gè)來獲得ScriptEngine對(duì)象(參見清單1):感謝閱讀?getEngineByName()?getEngineByExtension()?getEngineByMimeType()清單1.獲得一個(gè)ScriptEngine實(shí)例importjavax.script.*;...ScriptEngineManagermanager=newScriptEngineManager();精品文檔放心下載ScriptEngineengine=manager.getEngineByName("JavaScript");精品文檔放心下載...engine.eval(...);getEngineFactories()感謝閱讀JavaScript引擎是與JDK6捆綁的,不過ScriptEngineManager實(shí)現(xiàn)了一種發(fā)現(xiàn)感謝閱讀機(jī)制,能發(fā)現(xiàn)支持JSR-223ScriptingfortheJavaPlatform的第三方引擎。只需精品文檔放心下載將腳本引擎的JAR文件放入CLASSPATH即可。精品文檔放心下載獲得了javax.script.ScriptEngine實(shí)例后,就可以調(diào)用eval()來執(zhí)行腳本了。精品文檔放心下載也可以將JavaBindings實(shí)例傳遞給eval()方感謝閱讀法。清單2所示的ScriptDemo.java示例導(dǎo)出兩個(gè)名為demoVar和strBuf的變謝謝閱讀量、執(zhí)行DemoScript.js腳本,然后讓這些變量輸出它們修改后的值。精品文檔放心下載清單2.ScriptDemo.java示例packagejsee.demo;importjavax.script.*;importjava.io.*;publicclassScriptDemo{publicstaticvoidmain(Stringargs[])throwsException{精品文檔放心下載//GettheJavaScriptengineScriptEngineManagermanager=newScriptEngineManager();謝謝閱讀ScriptEngineengine=manager.getEngineByName("JavaScript");感謝閱讀//SetJavaScriptvariablesBindingsvars=newSimpleBindings();感謝閱讀vars.put("demoVar","valuesetinScriptDemo.java");精品文檔放心下載vars.put("strBuf",newStringBuffer("stringbuffer"));謝謝閱讀//RunDemoScript.jsReaderscriptReader=newInputStreamReader(謝謝閱讀ScriptDemo.class.getResourceAsStream("DemoScript.js"));精品文檔放心下載try{engine.eval(scriptReader,vars);謝謝閱讀}finally{scriptReader.close();}//GetJavaScriptvariablesObjectdemoVar=vars.get("demoVar");感謝閱讀System.out.println("[Java]demoVar:"+demoVar);謝謝閱讀System.out.println("Javaobject:"+demoVar.getClass().getName());精品文檔放心下載System.out.println();ObjectstrBuf=vars.get("strBuf");感謝閱讀System.out.println("[Java]strBuf:"+strBuf);感謝閱讀System.out.println("Javaobject:"+strBuf.getClass().getName());謝謝閱讀System.out.println();ObjectnewVar=vars.get("newVar");精品文檔放心下載System.out.println("[Java]newVar:"+newVar);謝謝閱讀System.out.println("Javaobject:"+newVar.getClass().getName());精品文檔放心下載System.out.println();}}DemoScript.js文件(如清單3所示)包含一個(gè)printType()函數(shù),該函數(shù)可用精品文檔放心下載來輸出每個(gè)腳本變量的類型。這個(gè)示例會(huì)調(diào)用strBuf對(duì)象的append()方法、修謝謝閱讀改demoVar的值并設(shè)置一個(gè)名為newVar的新變量腳本。謝謝閱讀如果傳遞給printType()的對(duì)象具有g(shù)etClass()方法,那么它一定是個(gè)Java對(duì)精品文檔放心下載象,該對(duì)象的類名由obj.getClass().name獲得。這個(gè)JavaScript表達(dá)式調(diào)用精品文檔放心下載此對(duì)象的java.lang.Class實(shí)例的getName()方法。如果此對(duì)象不具備getClass,精品文檔放心下載那么printType()就會(huì)調(diào)用toSource()方法,而該方法是所有JavaScript對(duì)象精品文檔放心下載都有的。清單3.DemoScript.js示例println("Startscript\r\n");精品文檔放心下載//OutputthetypeofanobjectfunctionprintType(obj){if(obj.getClass)println("Javaobject:"+obj.getClass().name);感謝閱讀elseprintln("JSobject:"+obj.toSource());感謝閱讀println("");}//Printvariableprintln("[JS]demoVar:"+demoVar);感謝閱讀printType(demoVar);//CallmethodofJavaobjectstrBuf.append("usedinDemoScript.js");精品文檔放心下載println("[JS]strBuf:"+strBuf);感謝閱讀printType(strBuf);//ModifyvariabledemoVar="valuesetinDemoScript.js";精品文檔放心下載println("[JS]demoVar:"+demoVar);謝謝閱讀printType(demoVar);//SetanewvariablevarnewVar={x:1,y:{u:2,v:3}}精品文檔放心下載println("[JS]newVar:"+newVar);謝謝閱讀printType(newVar);println("Endscript\r\n");清單4是ScriptDemo.java示例的輸出。值得注意的是demoVar作為感謝閱讀JavaScriptStringstrBuf的類型仍然是java.lang.StringBuffer感謝閱讀始變量和Java字符串均作為本地JavaScriptJava謝謝閱讀括數(shù)組)均原樣導(dǎo)出。清單4.ScriptDemo.java的輸出Startscript[JS]demoVar:valuesetinScriptDemo.java感謝閱讀JSobject:(newString("valuesetinScriptDemo.java"))精品文檔放心下載[JS]strBuf:stringbufferusedinDemoScript.js精品文檔放心下載Javaobject:java.lang.StringBuffer謝謝閱讀[JS]demoVar:valuesetinDemoScript.js精品文檔放心下載JSobject:(newString("valuesetinDemoScript.js"))感謝閱讀[JS]newVar:[objectObject]JSobject:({x:1,y:{u:2,v:3}})謝謝閱讀Endscript[Java]demoVar:valuesetinDemoScript.js謝謝閱讀Javaobject:java.lang.String謝謝閱讀[Java]strBuf:stringbufferusedinDemoScript.js感謝閱讀Javaobject:java.lang.StringBuffer精品文檔放心下載[Java]newVar:[objectObject]精品文檔放心下載Javaobject:ernal.NativeObject精品文檔放心下載運(yùn)行該腳本后,此引擎就會(huì)接受所有變量(包括新變量)并執(zhí)行反轉(zhuǎn)變換,將精品文檔放心下載JavaScript原始變量和字符串轉(zhuǎn)變成JavaJavaScript對(duì)象則被包感謝閱讀裝成Java對(duì)象,這些對(duì)象能使用某種特定于引擎的內(nèi)部API,比如謝謝閱讀ernal.NativeObject。感謝閱讀APIJava代碼和所執(zhí)行腳本間的全部數(shù)精品文檔放心下載據(jù)轉(zhuǎn)換都應(yīng)通過原始變量、字符串和Java對(duì)象(比如bean)完成,這是因?yàn)樵诟兄x閱讀JavaScript感謝閱讀圖在Java代碼內(nèi)訪問本地JavaScript對(duì)象,相反,應(yīng)該在JavaScript代碼內(nèi)精品文檔放心下載使用Java對(duì)象。調(diào)用函數(shù)JavaScript調(diào)用Java精品文檔放心下載將會(huì)了解如何從Java代碼調(diào)用JavaScript謝謝閱讀用的那個(gè)函數(shù)的腳本。然后,再將ScriptEngine實(shí)例強(qiáng)制轉(zhuǎn)換為謝謝閱讀javax.script.InvocableinvokeFunction()和invokeMethod()。感謝閱讀如果腳本實(shí)現(xiàn)了Java接口的全部方法,那么也可以使用getInterface()獲得一謝謝閱讀個(gè)Java對(duì)象,該對(duì)象的方法用此腳本語言編碼。InvDemo.java示例(如清單5所示)執(zhí)行一個(gè)名為InvScript.js的腳本,它包精品文檔放心下載含demoFunction()例程。在進(jìn)行強(qiáng)制類型轉(zhuǎn)換以將ScriptEngine實(shí)例轉(zhuǎn)換為謝謝閱讀Invocable之后,這個(gè)Java示例才能將函數(shù)名和參數(shù)傳遞給引擎的精品文檔放心下載invokeFunction()方法,而此方法會(huì)返回由demoFunction()返回的值。精品文檔放心下載清單5.InvDemo.java示例packagejsee.demo;importjavax.script.*;importjava.io.*;publicclassInvDemo{publicstaticvoidmain(Stringargs[])throwsException{謝謝閱讀//GettheJavaScriptengineScriptEngineManagermanager=newScriptEngineManager();感謝閱讀ScriptEngineengine=manager.getEngineByName("JavaScript");謝謝閱讀//RunInvScript.jsReaderscriptReader=newInputStreamReader(感謝閱讀InvDemo.class.getResourceAsStream("InvScript.js"));感謝閱讀try{engine.eval(scriptReader);謝謝閱讀}finally{scriptReader.close();}//InvokeaJavaScriptfunction精品文檔放心下載if(engineinstanceofInvocable){謝謝閱讀InvocableinvEngine=(Invocable)engine;謝謝閱讀Objectresult=invEngine.invokeFunction("demoFunction",1,2.3);精品文檔放心下載System.out.println("[Java]result:"+result);精品文檔放心下載System.out.println("Javaobject:"感謝閱讀+result.getClass().getName());謝謝閱讀System.out.println();}elseSystem.out.println("NOTInvocable");謝謝閱讀}}InvScript.js文件(如清單6所示)包含demoFunction()例程和之前的腳本示精品文檔放心下載例所用的相同printType()函數(shù)。清單6.InvScript.js示例println("Startscript\r\n");感謝閱讀functionprintType(obj){if(obj.getClass)println("Javaobject:"+obj.getClass().name);精品文檔放心下載elseprintln("JSobject:"+obj.toSource());感謝閱讀println("");}functiondemoFunction(a,b){感謝閱讀println("[JS]a:"+a);printType(a);println("[JS]b:"+b);printType(b);varc=a+b;println("[JS]c:"+c);printType(c);returnc;}println("Endscript\r\n");InvDemo.java的輸出如清單7所示,注意到其中的數(shù)值參數(shù)均被轉(zhuǎn)換成了謝謝閱讀JavaScriptdemoFunction()返回的值是作為Java精品文檔放心下載種轉(zhuǎn)換只會(huì)針對(duì)原始變量和字符串進(jìn)行。任何其他的對(duì)象在JVM和Javascript精品文檔放心下載引擎之間都是原樣傳遞的,反之亦然。清單7.InvDemo.java的輸出StartscriptEndscript[JS]a:1JSobject:(newNumber(1))[JS]b:2.3JSobject:(newNumber(2.3))[JS]c:3.3JSobject:(newNumber(3.3))[Java]result:3.3Javaobject:java.lang.Double精品文檔放心下載請(qǐng)注意javax.script.Invocable是一個(gè)可選接口,有些腳本引擎可能不會(huì)實(shí)現(xiàn)精品文檔放心下載該接口。不過,JDK6所帶的JavaScript引擎提供對(duì)該接口的支持。感謝閱讀編譯腳本腳本在每次執(zhí)行時(shí)都進(jìn)行解析會(huì)浪費(fèi)CPU謝謝閱讀謝謝閱讀選接口javax.script.Compilable提供,JDK6所帶的JavaScript引擎亦支持該感謝閱讀接口。CachedScript8)接受一個(gè)腳本文件并只有當(dāng)源代碼有修改時(shí)才會(huì)精品文檔放心下載進(jìn)行重編譯。getCompiledScript()方法會(huì)調(diào)用此腳本引擎的compile()謝謝閱讀回javax.script.CompiledScript對(duì)象,該對(duì)象的eval()方法會(huì)執(zhí)行腳本。感謝閱讀清單8.CachedScript類packagejsee.cache;importjavax.script.*;importjava.io.*;importjava.util.*;publicclassCachedScript{privateCompilablescriptEngine;精品文檔放心下載privateFilescriptFile;privateCompiledScriptcompiledScript;感謝閱讀privateDatecompiledDate;publicCachedScript(CompilablescriptEngine,FilescriptFile){精品文檔放心下載this.scriptEngine=scriptEngine;精品文檔放心下載this.scriptFile=scriptFile;謝謝閱讀}publicCompiledScriptgetCompiledScript()感謝閱讀throwsScriptException,IOException{謝謝閱讀DatescriptDate=newDate(scriptFile.lastModified());精品文檔放心下載if(compiledDate==null||scriptDate.after(compiledDate)){謝謝閱讀Readerreader=newFileReader(scriptFile);感謝閱讀try{compiledScript=scriptEpile(reader);謝謝閱讀compiledDate=scriptDate;}finally{reader.close();}}returncompiledScript;}}ScriptCache類(參見清單9)使用java.util.LinkedHashMap對(duì)象為所編譯的感謝閱讀腳本實(shí)現(xiàn)存儲(chǔ)庫。map的初始容量被設(shè)為所緩存腳本的最大數(shù)量并且加載系數(shù)是1。感謝閱讀這兩個(gè)參數(shù)就確保了該cacheMap不需要重新處理。謝謝閱讀默認(rèn)地,LinkedHashMap類會(huì)使用條目的插入順序。若不想使用默認(rèn)順序,謝謝閱讀LinkedHashMap()構(gòu)造函數(shù)的第三個(gè)參數(shù)必須是true以便使用條目的訪問順序。精品文檔放心下載達(dá)到緩存的最大容量后,removeEldestEntry()方法就會(huì)開始返回true,以便當(dāng)精品文檔放心下載每次向此緩存添加一個(gè)新的編譯了的腳本時(shí),一個(gè)條目都會(huì)自動(dòng)從cacheMap刪感謝閱讀除。通過聯(lián)合使用LinkedHashMap的自動(dòng)刪除機(jī)制和訪問順序,ScriptCache就確保謝謝閱讀LeastRecentlyUsedLRU感謝閱讀夠從緩存中刪除。清單9.ScriptCache類packagejsee.cache;importjavax.script.*;importjava.io.*;importjava.util.*;publicabstractclassScriptCache{謝謝閱讀publicstaticfinalStringENGINE_NAME="JavaScript";謝謝閱讀privateCompilablescriptEngine;感謝閱讀privateLinkedHashMap<String,CachedScript>cacheMap;謝謝閱讀publicScriptCache(finalintmaxCachedScripts){感謝閱讀ScriptEngineManagermanager=newScriptEngineManager();感謝閱讀scriptEngine=(Compilable)manager.getEngineByName(ENGINE_NAME);感謝閱讀cacheMap=newLinkedHashMap<String,CachedScript>(謝謝閱讀maxCachedScripts,1,true){protectedbooleanremoveEldestEntry(Map.Entryeldest){謝謝閱讀returnsize()>maxCachedScripts;精品文檔放心下載}};}publicabstractFilegetScriptFile(Stringkey);謝謝閱讀publicsynchronizedCompiledScriptgetScript(Stringkey)感謝閱讀throwsScriptException,IOException{精品文檔放心下載CachedScriptscript=cacheMap.get(key);精品文檔放心下載if(script==null){script=newCachedScript(scriptEngine,getScriptFile(key));感謝閱讀cacheMap.put(key,script);}returnscript.getCompiledScript();精品文檔放心下載}publicScriptEnginegetEngine(){精品文檔放心下載return(ScriptEngine)scriptEngine;感謝閱讀}}下一節(jié)將使用ScriptCache類、實(shí)現(xiàn)抽象的getScriptFile()方法并使用精品文檔放心下載getScript()從緩存檢索所編譯的腳本。構(gòu)建一個(gè)腳本運(yùn)行程序在本節(jié)中,您將了解如何創(chuàng)建一個(gè)簡單的Javaservlet來實(shí)現(xiàn)URL-腳本的映射感謝閱讀以便能夠從Webservlet還將會(huì)把幾個(gè)JavaEE謝謝閱讀對(duì)象公開為可在JavaScript代碼內(nèi)使用的變量。您還將了解如何使用腳本上下感謝閱讀文來用單一一個(gè)JavaScript引擎運(yùn)行多個(gè)并發(fā)的腳本。謝謝閱讀初始化servletservlet類的名稱是JSServletinit()10謝謝閱讀參數(shù)并創(chuàng)建一個(gè)ScriptCache對(duì)象。servlet的腳本緩存使用getRealPath()獲精品文檔放心下載得與給定URI相映射的腳本文件的路徑。清單10.JSServlet的init()方法感謝閱讀packagejsee.servlet;importjavax.script.*;importjavax.servlet.*;importjavax.servlet.http.*;感謝閱讀importjava.io.*;importjsee.cache.*;publicclassJSServletextendsHttpServlet{謝謝閱讀privateStringcacheControlHeader;謝謝閱讀privateStringcontentTypeHeader;謝謝閱讀privateScriptCachescriptCache;感謝閱讀publicvoidinit()throwsServletException{精品文檔放心下載ServletConfigconfig=getServletConfig();精品文檔放心下載cacheControlHeader=config.getInitParameter("Cache-Control");謝謝閱讀contentTypeHeader=config.getInitParameter("Content-Type");精品文檔放心下載intmaxCachedScripts=Integer.parseInt(感謝閱讀config.getInitParameter("Max-Cached-Scripts"));精品文檔放心下載scriptCache=newScriptCache(maxCachedScripts){謝謝閱讀publicFilegetScriptFile(Stringuri){精品文檔放心下載returnnewFile(getServletContext().getRealPath(uri));感謝閱讀}};}...}清單11中包含一些servlet的參數(shù),這些參數(shù)在web.xml文件內(nèi)指定。謝謝閱讀Cache-Controlservlet返回的此HTTP響感謝閱讀應(yīng)的一部分。no-cache值告知瀏覽器不要緩存此servlet感謝閱讀為text/plain對(duì)待。清單11.web.xml文件<web-app...><servlet><servlet-name>JSServlet</servlet-name>謝謝閱讀<servlet-class>jsee.servlet.JSServlet</servlet-class>感謝閱讀<init-param><param-name>Cache-Control</param-name>謝謝閱讀<param-value>no-cache</param-value>精品文檔放心下載</init-param><init-param><param-name>Content-Type</param-name>感謝閱讀<param-value>text/plain</param-value>謝謝閱讀</init-param><init-param><param-name>Max-Cached-Scripts</param-name>精品文檔放心下載<param-value>1000</param-value>謝謝閱讀</init-param><load-on-startup>1</load-on-startup>謝謝閱讀</servlet><servlet-mapping><servlet-name>JSServlet</servlet-name>感謝閱讀<url-pattern>*.jss</url-pattern>精品文檔放心下載</servlet-mapping></web-app>從清單11*.jss模式被映射給此servletJSServlet將會(huì)謝謝閱讀處理URL以.jssWeb瀏覽器內(nèi)輸入這樣的一個(gè)精品文檔放心下載URL或是單擊了一個(gè).jssHTTP請(qǐng)求給Web精品文檔放心下載如,Apache),而此服務(wù)器應(yīng)該被配置成將該請(qǐng)求分派給servlet容器(比如,感謝閱讀Tomcat)。如果servlet容器也充當(dāng)Web服務(wù)器,就無需額外的配置。感謝閱讀當(dāng)servlet容器獲得了URL以.jssservice()方法,精品文檔放心下載該方法是由JSServlet繼承自javax.servlet.http.HttpServlet的。此方法再感謝閱讀進(jìn)而調(diào)用doGet()或doPost(),最終調(diào)用哪一個(gè)取決于此請(qǐng)求的HTTP方法。兩謝謝閱讀個(gè)方法都可由JSServlet覆蓋,這一點(diǎn)在本節(jié)稍后的部分還會(huì)看到。精品文檔放心下載使用腳本上下文腳本引擎的線程模型每個(gè)腳本引擎實(shí)例都具JSR-223ScriptingfortheJavaPlatform(參見參考資精品文檔放心下載有一個(gè)默認(rèn)的上下文,料)定義了三類腳本引擎:在其中,可以用put()?能執(zhí)行并發(fā)腳本的多線程引擎,可以修改由其他線程方法存儲(chǔ)變量,而所執(zhí)看到的變量?線程隔離引擎,也是多線程的,但每個(gè)線程都具有其自身的引擎范圍來保存變量行的腳本的輸出則被默?無狀態(tài)引擎,作為線程隔離引擎定義,但引擎范圍在認(rèn)定向到System.out感謝閱讀任何腳本執(zhí)行后均保持不變服務(wù)器環(huán)境內(nèi),常希望腳本引擎的類型可通過運(yùn)行具有各自上下文的engine.getFactory().getParameter("THREADING")獲感謝閱讀并發(fā)腳本。得,而返回的結(jié)果可能會(huì)是"MULTITHREADED"、感謝閱讀javax.scriptAPI能滿"THREAD-ISOLATED"或"STATELESS"。精品文檔放心下載足這個(gè)需求,它能提供ScriptContext接口和SimpleScriptContext實(shí)現(xiàn)。精品文檔放心下載Mozilla的RhinoJavaScript引擎是個(gè)多線程引擎(參見側(cè)欄),允許執(zhí)行共享感謝閱讀精品文檔放心下載在不同線程內(nèi)的那些腳本的輸出,這意味著必須要針對(duì)每個(gè)HTTP請(qǐng)求創(chuàng)建一個(gè)感謝閱讀新的ScriptContext實(shí)例。清單12給出了JSServlet類的createScriptContext()謝謝閱讀文的writer屬性以便在腳本執(zhí)行時(shí)將腳本的輸出發(fā)送給response對(duì)象的編寫者。謝謝閱讀這意味著傳遞給腳本內(nèi)的print()或println()的任何東西都將會(huì)包含在此謝謝閱讀servlet的響應(yīng)內(nèi)。此外,createScriptContext()還通過腳本上下文的setAttribute()方法定義了感謝閱讀如下的腳本變量:表1.由JSServlet執(zhí)行的腳本內(nèi)的可用變量精品文檔放心下載腳本變量描述configservlet的javax.servlet.ServletConfig實(shí)例精品文檔放心下載applicationWeb應(yīng)用程序的javax.servlet.ServletContext實(shí)例謝謝閱讀sessionjavax.servlet.http.HttpSession對(duì)象精品文檔放心下載requestjavax.servlet.http.HttpServletRequest對(duì)象感謝閱讀responsejavax.servlet.http.HttpServletResponse對(duì)象精品文檔放心下載out用于輸出響應(yīng)的java.io.PrintWriter對(duì)象感謝閱讀factory腳本引擎的javax.script.ScriptEngineFactory謝謝閱讀factory變量可用來獲得有關(guān)JavaScript謝謝閱讀其余的變量的作用與它們?cè)贘SP頁面上的無異。清單12.JSServlet的createScriptContext()方法精品文檔放心下載publicclassJSServletextendsHttpServlet{謝謝閱讀...protectedScriptContextcreateScriptContext(謝謝閱讀HttpServletRequestrequest,HttpServletResponseresponse)精品文檔放心下載throwsIOException{ScriptContextscriptContext=newSimpleScriptContext();感謝閱讀scriptContext.setWriter(response.getWriter());精品文檔放心下載intscope=ScriptContext.ENGINE_SCOPE;感謝閱讀scriptContext.setAttribute("config",getServletConfig(),scope);謝謝閱讀scriptContext.setAttribute("application",getServletContext(),scope);精品文檔放心下載scriptContext.setAttribute("session",request.getSession(),scope);感謝閱讀scriptContext.setAttribute("request",request,scope);感謝閱讀scriptContext.setAttribute("response",response,scope);感謝閱讀scriptContext.setAttribute("out",response.getWriter(),scope);謝謝閱讀scriptContext.setAttribute("factory",感謝閱讀scriptCache.getEngine().getFactory(),scope);謝謝閱讀returnscriptContext;}...}runScript()13eval()方精品文檔放心下載法,將給定的腳本上下文作為參數(shù)傳遞。清單13.JSServlet的runScript()方法精品文檔放心下載publicclassJSServletextendsHttpServlet{精品文檔放心下載...protectedvoidrunScript(Stringuri,ScriptContextscriptContext)謝謝閱讀throwsScriptException,IOException{謝謝閱讀scriptCache.getScript(uri).eval(scriptContext);精品文檔放心下載}...}處理請(qǐng)求可以通過調(diào)用上述的runScript()方法來執(zhí)行與此HTTP請(qǐng)求的URL相映射的那個(gè)謝謝閱讀感謝閱讀本執(zhí)行完后進(jìn)行最后的清理工作。感謝閱讀感謝閱讀進(jìn)行一些處理。servlet的handleRequest()方法(如清單14所示)可設(shè)置這些HTTP報(bào)頭、運(yùn)謝謝閱讀行init.jss腳本、從請(qǐng)求的URI中刪除此上下文路徑、執(zhí)行具有所獲得的URI謝謝閱讀的腳本,然后運(yùn)行另一個(gè)名為finalize.jss的腳本。謝謝閱讀清單14.JSServlet的handleRequest()方法謝謝閱讀publicclassJSServletextendsHttpServlet{謝謝閱讀...protectedvoidhandleRequest(感謝閱讀HttpServletRequestrequest,HttpServletResponseresponse)謝謝閱讀throwsServletException,IOException{感謝閱讀if(cacheControlHeader!=null)謝謝閱讀response.setHeader("Cache-Control",cacheControlHeader);精品文檔放心下載if(contentTypeHeader!=null)精品文檔放心下載response.setContentType(contentTypeHeader);感謝閱讀ScriptContextscriptContext=createScriptContext(request,response);精品文檔放心下載try{runScript("/init.jss",scriptContext);感謝閱讀Stringuri=request.getRequestURI();感謝閱讀uri=uri.substring(request.getContextPath().length());謝謝閱讀try{runScript(uri,scriptContext);謝謝閱讀}catch(FileNotFoundExceptionx){精品文檔放心下載response.sendError(404,request.getRequestURI());感謝閱讀}runScript("/finalize.jss",scriptContext);謝謝閱讀}catch(ScriptExceptionx){x.printStackTrace(response.getWriter());精品文檔放心下載thrownewServletException(x);精品文檔放心下載}}...}JSServlet的doGet()和doPost()方法(參見清單15)用來調(diào)用精品文檔放心下載handleRequest()。清單15.JSServletdo的Get()和doPost()方法精品文檔放心下載publicclassJSServletextendsHttpServlet{感謝閱讀...publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse精品文檔放心下載)throwsServletException,IOException{感謝閱讀handleRequest(request,response);感謝閱讀}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponserespons感謝閱讀e)throwsServletException,IOException{謝謝閱讀handleRequest(request,response);謝謝閱讀}}開發(fā)服務(wù)器端腳本本節(jié)包含了服務(wù)器端腳本的幾個(gè)例子,向您展示了如何獲得請(qǐng)求參數(shù)、訪問感謝閱讀JavaBeans的屬性并生成JSON響應(yīng)。預(yù)處理和后處理JSServlet會(huì)調(diào)用init.jss(如精品文檔放心下載清單16所示)。若想估量執(zhí)行腳本所需時(shí)間,可以將開始時(shí)間存儲(chǔ)到一個(gè)變量精品文檔放心下載內(nèi),如下所示。清單16.init.jss腳本vardebug=true;vardebugStartTime=java.lang.System.nanoTime();感謝閱讀之后,可以在finalize.jss內(nèi)(參見清單17)計(jì)算執(zhí)行時(shí)間。該時(shí)間作為謝謝閱讀JavaScript注釋打印以便JSServlet能夠生成有效的JSON響應(yīng)。感謝閱讀清單17.finalize.jss腳本vardebugEndTime=java.lang.System.nanoTime();精品文檔放心下載if(debug)println("http://Time:"+(debugEndTime-debugStartTime)+"ns");感謝閱讀本系列后面的文章將向init.jss和finalize.jss添加更多的代碼。精品文檔放心下載獲得請(qǐng)求參數(shù)借助JSServlet調(diào)用的腳本可以通過request.getParameter()和謝謝閱讀request.getParameterValues()訪問請(qǐng)求參數(shù),這二者會(huì)返回Java對(duì)象。若想謝謝閱讀使語法更簡短或處理JavaScript對(duì)象而非Java感謝閱讀下面這些代碼行加入到init.jss(參見清單18)。謝謝閱讀清單18.在init.jss內(nèi)獲得請(qǐng)求參數(shù)。varparam=newObject();varparamValues=newObject();謝謝閱讀functioninitParams(){varparamNames=request.getParameterNames();精品文檔放心下載while(paramNames.hasMoreElements()){感謝閱讀varname=paramNames.nextElement();謝謝閱讀param[name]=String(request.getParameter(name));感謝閱讀paramValues[name]=newArray();精品文檔放心下載varvalues=request.getParameterValues(name);精品文檔放心下載for(vari=0;i<values.length;i++)精品文檔放心下載paramValues[name][i]=String(values[i]);精品文檔放心下載}}initParams();假設(shè)您使用清單19所示的URL請(qǐng)求一個(gè)名為ParamDemo.jss的腳本。感謝閱讀清單19.請(qǐng)求一個(gè)腳本的URL示例http://localhost:8080/jsee/ParamDemo.jss?firstName=John&lastName=Smit謝謝閱讀h在ParamDemo.jss(參見清單20)內(nèi),用param.firstName和param.lastName感謝閱讀可以得到這兩個(gè)請(qǐng)求參數(shù)。清單20.ParamDemo.jss示例println("Hello"+param.firstName+""+param.lastName);精品文檔放心下載訪問JavaBeanWeb應(yīng)用程序的application、session和request范圍可存儲(chǔ)bean實(shí)例,可以感謝閱讀分別使用ServletContext、HttpSession和HttpServletRequest的精品文檔放心下載getAttribute()和setAttribute()getBean()精品文檔放心下載和setBean()函數(shù)(如清單21所示),但這兩個(gè)函數(shù)必須位于init.jss文件內(nèi)感謝閱讀以便任何腳本均可調(diào)用它們。scope參數(shù)應(yīng)是如下字符串中的一個(gè):感謝閱讀?"application"?"session"?"request"清單21.init.jss的getBean()和setBean()函數(shù)精品文檔放心下載functiongetBean(scope,id){精品文檔放心下載returneval(scope).getAttribute(id);感謝閱讀}functionsetBean(scope,id,bean){精品文檔放心下載if(!bean)bean=eval(id);returneval(scope).setAttribute(id,bean);感謝閱讀}session范圍內(nèi)保存DemoBean(參見清單22精品文檔放心下載清單22.DemoBean.java示例packagejsee.demo;publicclassDemoBean{privateintcounter;publicintgetCounter(){returncounter;}publicvoidsetCounter(intcounter){精品文檔放心下載this.counte

溫馨提示

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

評(píng)論

0/150

提交評(píng)論