版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
行文件的方法使用javax.scriptAPI本节给出了javax.scriptAPI的概览,展示了如何执行脚本来访问Java对象、谢谢阅读如何从Java代码调用JavaScript感谢阅读执行脚本javax.scriptAPI十分简单。可以先创建一个ScriptEngineManager实例,有了感谢阅读这个实例就能用下列方法中的任一个来获得ScriptEngine对象(参见清单1):感谢阅读•getEngineByName()•getEngineByExtension()•getEngineByMimeType()清单1.获得一个ScriptEngine实例importjavax.script.*;...ScriptEngineManagermanager=newScriptEngineManager();精品文档放心下载ScriptEngineengine=manager.getEngineByName("JavaScript");精品文档放心下载...engine.eval(...);getEngineFactories()感谢阅读JavaScript引擎是与JDK6捆绑的,不过ScriptEngineManager实现了一种发现感谢阅读机制,能发现支持JSR-223ScriptingfortheJavaPlatform的第三方引擎。只需精品文档放心下载将脚本引擎的JAR文件放入CLASSPATH即可。精品文档放心下载获得了javax.script.ScriptEngine实例后,就可以调用eval()来执行脚本了。精品文档放心下载也可以将JavaBindings实例传递给eval()方感谢阅读法。清单2所示的ScriptDemo.java示例导出两个名为demoVar和strBuf的变谢谢阅读量、执行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所示)包含一个printType()函数,该函数可用精品文档放心下载来输出每个脚本变量的类型。这个示例会调用strBuf对象的append()方法、修谢谢阅读改demoVar的值并设置一个名为newVar的新变量脚本。谢谢阅读如果传递给printType()的对象具有getClass()方法,那么它一定是个Java对精品文档放心下载象,该对象的类名由obj.getClass().name获得。这个JavaScript表达式调用精品文档放心下载此对象的java.lang.Class实例的getName()方法。如果此对象不具备getClass,精品文档放心下载那么printType()就会调用toSource()方法,而该方法是所有JavaScript对象精品文档放心下载都有的。清单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谢谢阅读括数组)均原样导出。清单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精品文档放心下载运行该脚本后,此引擎就会接受所有变量(包括新变量)并执行反转变换,将精品文档放心下载JavaScript原始变量和字符串转变成JavaJavaScript对象则被包感谢阅读装成Java对象,这些对象能使用某种特定于引擎的内部API,比如谢谢阅读ernal.NativeObject。感谢阅读APIJava代码和所执行脚本间的全部数精品文档放心下载据转换都应通过原始变量、字符串和Java对象(比如bean)完成,这是因为在感谢阅读JavaScript感谢阅读图在Java代码内访问本地JavaScript对象,相反,应该在JavaScript代码内精品文档放心下载使用Java对象。调用函数JavaScript调用Java精品文档放心下载将会了解如何从Java代码调用JavaScript谢谢阅读用的那个函数的脚本。然后,再将ScriptEngine实例强制转换为谢谢阅读javax.script.InvocableinvokeFunction()和invokeMethod()。感谢阅读如果脚本实现了Java接口的全部方法,那么也可以使用getInterface()获得一谢谢阅读个Java对象,该对象的方法用此脚本语言编码。InvDemo.java示例(如清单5所示)执行一个名为InvScript.js的脚本,它包精品文档放心下载含demoFunction()例程。在进行强制类型转换以将ScriptEngine实例转换为谢谢阅读Invocable之后,这个Java示例才能将函数名和参数传递给引擎的精品文档放心下载invokeFunction()方法,而此方法会返回由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()函数。清单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所示,注意到其中的数值参数均被转换成了谢谢阅读JavaScriptdemoFunction()返回的值是作为Java精品文档放心下载种转换只会针对原始变量和字符串进行。任何其他的对象在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精品文档放心下载请注意javax.script.Invocable是一个可选接口,有些脚本引擎可能不会实现精品文档放心下载该接口。不过,JDK6所带的JavaScript引擎提供对该接口的支持。感谢阅读编译脚本脚本在每次执行时都进行解析会浪费CPU谢谢阅读谢谢阅读选接口javax.script.Compilable提供,JDK6所带的JavaScript引擎亦支持该感谢阅读接口。CachedScript8)接受一个脚本文件并只有当源代码有修改时才会精品文档放心下载进行重编译。getCompiledScript()方法会调用此脚本引擎的compile()谢谢阅读回javax.script.CompiledScript对象,该对象的eval()方法会执行脚本。感谢阅读清单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对象为所编译的感谢阅读脚本实现存储库。map的初始容量被设为所缓存脚本的最大数量并且加载系数是1。感谢阅读这两个参数就确保了该cacheMap不需要重新处理。谢谢阅读默认地,LinkedHashMap类会使用条目的插入顺序。若不想使用默认顺序,谢谢阅读LinkedHashMap()构造函数的第三个参数必须是true以便使用条目的访问顺序。精品文档放心下载达到缓存的最大容量后,removeEldestEntry()方法就会开始返回true,以便当精品文档放心下载每次向此缓存添加一个新的编译了的脚本时,一个条目都会自动从cacheMap删感谢阅读除。通过联合使用LinkedHashMap的自动删除机制和访问顺序,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;感谢阅读}}下一节将使用ScriptCache类、实现抽象的getScriptFile()方法并使用精品文档放心下载getScript()从缓存检索所编译的脚本。构建一个脚本运行程序在本节中,您将了解如何创建一个简单的Javaservlet来实现URL-脚本的映射感谢阅读以便能够从Webservlet还将会把几个JavaEE谢谢阅读对象公开为可在JavaScript代码内使用的变量。您还将了解如何使用脚本上下感谢阅读文来用单一一个JavaScript引擎运行多个并发的脚本。谢谢阅读初始化servletservlet类的名称是JSServletinit()10谢谢阅读参数并创建一个ScriptCache对象。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的参数,这些参数在web.xml文件内指定。谢谢阅读Cache-Controlservlet返回的此HTTP响感谢阅读应的一部分。no-cache值告知浏览器不要缓存此servlet感谢阅读为text/plain对待。清单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将会谢谢阅读处理URL以.jssWeb浏览器内输入这样的一个精品文档放心下载URL或是单击了一个.jssHTTP请求给Web精品文档放心下载如,Apache),而此服务器应该被配置成将该请求分派给servlet容器(比如,感谢阅读Tomcat)。如果servlet容器也充当Web服务器,就无需额外的配置。感谢阅读当servlet容器获得了URL以.jssservice()方法,精品文档放心下载该方法是由JSServlet继承自javax.servlet.http.HttpServlet的。此方法再感谢阅读进而调用doGet()或doPost(),最终调用哪一个取决于此请求的HTTP方法。两谢谢阅读个方法都可由JSServlet覆盖,这一点在本节稍后的部分还会看到。精品文档放心下载使用脚本上下文脚本引擎的线程模型每个脚本引擎实例都具JSR-223ScriptingfortheJavaPlatform(参见参考资精品文档放心下载有一个默认的上下文,料)定义了三类脚本引擎:在其中,可以用put()•能执行并发脚本的多线程引擎,可以修改由其他线程方法存储变量,而所执看到的变量•线程隔离引擎,也是多线程的,但每个线程都具有其自身的引擎范围来保存变量行的脚本的输出则被默•无状态引擎,作为线程隔离引擎定义,但引擎范围在认定向到System.out感谢阅读任何脚本执行后均保持不变服务器环境内,常希望脚本引擎的类型可通过运行具有各自上下文的engine.getFactory().getParameter("THREADING")获感谢阅读并发脚本。得,而返回的结果可能会是"MULTITHREADED"、感谢阅读javax.scriptAPI能满"THREAD-ISOLATED"或"STATELESS"。精品文档放心下载足这个需求,它能提供ScriptContext接口和SimpleScriptContext实现。精品文档放心下载Mozilla的RhinoJavaScript引擎是个多线程引擎(参见侧栏),允许执行共享感谢阅读精品文档放心下载在不同线程内的那些脚本的输出,这意味着必须要针对每个HTTP请求创建一个感谢阅读新的ScriptContext实例。清单12给出了JSServlet类的createScriptContext()谢谢阅读文的writer属性以便在脚本执行时将脚本的输出发送给response对象的编写者。谢谢阅读这意味着传递给脚本内的print()或println()的任何东西都将会包含在此谢谢阅读servlet的响应内。此外,createScriptContext()还通过脚本上下文的setAttribute()方法定义了感谢阅读如下的脚本变量:表1.由JSServlet执行的脚本内的可用变量精品文档放心下载脚本变量描述configservlet的javax.servlet.ServletConfig实例精品文档放心下载applicationWeb应用程序的javax.servlet.ServletContext实例谢谢阅读sessionjavax.servlet.http.HttpSession对象精品文档放心下载requestjavax.servlet.http.HttpServletRequest对象感谢阅读responsejavax.servlet.http.HttpServletResponse对象精品文档放心下载out用于输出响应的java.io.PrintWriter对象感谢阅读factory脚本引擎的javax.script.ScriptEngineFactory谢谢阅读factory变量可用来获得有关JavaScript谢谢阅读其余的变量的作用与它们在JSP页面上的无异。清单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()方精品文档放心下载法,将给定的脚本上下文作为参数传递。清单13.JSServlet的runScript()方法精品文档放心下载publicclassJSServletextendsHttpServlet{精品文档放心下载...protectedvoidrunScript(Stringuri,ScriptContextscriptContext)谢谢阅读throwsScriptException,IOException{谢谢阅读scriptCache.getScript(uri).eval(scriptContext);精品文档放心下载}...}处理请求可以通过调用上述的runScript()方法来执行与此HTTP请求的URL相映射的那个谢谢阅读感谢阅读本执行完后进行最后的清理工作。感谢阅读感谢阅读进行一些处理。servlet的handleRequest()方法(如清单14所示)可设置这些HTTP报头、运谢谢阅读行init.jss脚本、从请求的URI中删除此上下文路径、执行具有所获得的URI谢谢阅读的脚本,然后运行另一个名为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)用来调用精品文档放心下载handleRequest()。清单15.JSServletdo的Get()和doPost()方法精品文档放心下载publicclassJSServletextendsHttpServlet{感谢阅读...publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse精品文档放心下载)throwsServletException,IOException{感谢阅读handleRequest(request,response);感谢阅读}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponserespons感谢阅读e)throwsServletException,IOException{谢谢阅读handleRequest(request,response);谢谢阅读}}开发服务器端脚本本节包含了服务器端脚本的几个例子,向您展示了如何获得请求参数、访问感谢阅读JavaBeans的属性并生成JSON响应。预处理和后处理JSServlet会调用init.jss(如精品文档放心下载清单16所示)。若想估量执行脚本所需时间,可以将开始时间存储到一个变量精品文档放心下载内,如下所示。清单16.init.jss脚本vardebug=true;vardebugStartTime=java.lang.System.nanoTime();感谢阅读之后,可以在finalize.jss内(参见清单17)计算执行时间。该时间作为谢谢阅读JavaScript注释打印以便JSServlet能够生成有效的JSON响应。感谢阅读清单17.finalize.jss脚本vardebugEndTime=java.lang.System.nanoTime();精品文档放心下载if(debug)println("//Time:"+(debugEndTime-debugStartTime)+"ns");感谢阅读本系列后面的文章将向init.jss和finalize.jss添加更多的代码。精品文档放心下载获得请求参数借助JSServlet调用的脚本可以通过request.getParameter()和谢谢阅读request.getParameterValues()访问请求参数,这二者会返回Java对象。若想谢谢阅读使语法更简短或处理JavaScript对象而非Java感谢阅读下面这些代码行加入到init.jss(参见清单18)。谢谢阅读清单18.在init.jss内获得请求参数。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();假设您使用清单19所示的URL请求一个名为ParamDemo.jss的脚本。感谢阅读清单19.请求一个脚本的URL示例http://localhost:8080/jsee/ParamDemo.jss?firstName=John&lastName=Smit谢谢阅读h在ParamDemo.jss(参见清单20)内,用param.firstName和param.lastName感谢阅读可以得到这两个请求参数。清单20.ParamDemo.jss示例println("Hello"+param.firstName+""+param.lastName);精品文档放心下载访问JavaBeanWeb应用程序的application、session和request范围可存储bean实例,可以感谢阅读分别使用ServletContext、HttpSession和HttpServletRequest的精品文档放心下载getAttribute()和setAttribute()getBean()精品文档放心下载和setBean()函数(如清单21所示),但这两个函数必须位于init.jss文件内感谢阅读以便任何脚本均可调用它们。scope参数应是如下字符串中的一个:感谢阅读•"application"•"session"•"request"清单21.init.jss的getBean()和setBean()函数精品文档放心下载functiongetBean(scope,id){精品文档放心下载returneval(scope).getAttribute(id);感谢阅读}functionsetBean(scope,id,bean){精品文档放心下载if(!bean)bean=eval(id);returneval(scope).setAttribute(id,bean);感谢阅读}session范围内保存DemoBean(参见清单22精品文档放心下载清单22.DemoBean.java示例packagejsee.demo;publicclassDemoBean{privateintcounter;publicintgetCounter(){returncounter;}publicvoidsetCounter(intcounter){精品文档放心下载this.counte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信访调解协议书
- 2025版住宅小区消防疏散指示标识安装合同范本3篇
- 2025年度个人股权担保贷款合同标准版
- 2025版托老院入住老人安全防护服务协议3篇
- 2025-2030全球1-戊基-1H-吲哚行业调研及趋势分析报告
- 2025-2030全球电子纤维鼻咽镜行业调研及趋势分析报告
- 行业透视对公业务市场细分与行业特性
- 二零二五年度厨师劳务派遣及餐饮企业员工福利协议4篇
- 二零二五年度车辆抵押贷款利率调整与通知合同3篇
- 二零二五年度菜鸟驿站快递业务快递员招聘与管理协议3篇
- 江西省部分学校2024-2025学年高三上学期1月期末英语试题(含解析无听力音频有听力原文)
- 农民工工资表格
- 【寒假预习】专题04 阅读理解 20篇 集训-2025年人教版(PEP)六年级英语下册寒假提前学(含答案)
- 2024年智能监狱安防监控工程合同3篇
- 2024年度窑炉施工协议详例细则版B版
- 幼儿园篮球课培训
- 基底节脑出血护理查房
- 工程公司总经理年终总结
- 【企业盈利能力探析的国内外文献综述2400字】
- 统编版(2024新版)七年级《道德与法治》上册第一单元《少年有梦》单元测试卷(含答案)
- 苏教版(2024新版)一年级上册科学全册教案教学设计
评论
0/150
提交评论