通过这个包javax.script.*;可以实现java与脚本语言的互相调用,其中可调用的有二十余种脚本语言(AppleScript、Groovy、JavaScript、Jelly、PHP、Python、Ruby 和 Velocity),都是通过ScriptEngine及ScriptEngineManager来管理,下面通过一个实例来学习调用JavaScript代码。
package com.java.script; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; /** * 此类的 main() 方法将创建一个 JavaScript 脚本引擎, * 然后分别调用五个方法(在下文的清单中有显示)用于突出显示脚本包的特性 * main() 方法的主要功能是获取一个 javax.script.ScriptEngine 实例(清单 1 中的前两行代码)。 * 脚本引擎可以在特定的语言中加载并执行脚本。 * 它是 Java 脚本包中使用最为频繁、作用最为重要的类。 * 我们从 javax.script.ScriptEngineManager 获取一个脚本引擎(第一行代码)。 * 通常,程序只需要获取一个脚本引擎实例,除非使用了很多种脚本语言。 * * */ public class HelloScriptingWord { /** * @param args * createDate:2009-5-10 */ public static void main(String[] args)throws ScriptException,NoSuchMethodException { // TODO Auto-generated method stub ScriptEngineManager scriptEngineManager=new ScriptEngineManager(); ScriptEngine jsEngine=scriptEngineManager.getEngineByName("JavaScript"); if (jsEngine==null) { System.err.println("No script engine found for javascript"); System.exit(1); } System.err.println("执行HelloScript..."); invokeHelloScript(jsEngine); System.err.println("\n执行defingScriptFunction..."); defineScriptFunction(jsEngine); System.err.println("\n执行invokeScriptFunctionFromEngine..."); invokeScriptFunctionFromEngine(jsEngine); System.err.println("\n执行脚本函数从java代码..."); invokeScriptFunctionFromJava(jsEngine); System.err.println("\n从脚本执行java代码"); invokeJavaFromScriptFunction(jsEngine); } private static void invokeJavaFromScriptFunction(ScriptEngine jsEngine) throws ScriptException { // TODO Auto-generated method stub jsEngine.put("helloScritpingWorld", new HelloScriptingWord()); jsEngine.eval("println(helloScritpingWorld.getHelloReply('>>>>'));"); } public String getHelloReply(String name){ return "java method getHelloReply says,'Hello,"+name+"'"; } /*** * 执行定义的函数sayHello() * */ private static void invokeScriptFunctionFromEngine(ScriptEngine jsEngine)throws ScriptException { // TODO Auto-generated method stub jsEngine.eval("sayHello('world!')"); } /*** * 定义js函数 * */ private static void defineScriptFunction(ScriptEngine jsEngine)throws ScriptException { // TODO Auto-generated method stub jsEngine.eval("function sayHello(name){println('hello,'+name)}"); } /*** * 调用js println() * */ private static void invokeHelloScript(ScriptEngine jsEngine)throws ScriptException { // TODO Auto-generated method stub jsEngine.eval("println('Hello from JavaScript')"); } private static void invokeScriptFunctionFromJava(ScriptEngine jsEngine) throws ScriptException,NoSuchMethodException{ // TODO Auto-generated method stub // jsEngine.eval("println('hello from javascript')"); Invocable invocableEngine=(Invocable)jsEngine; invocableEngine.invokeFunction("sayHello","from java"); } }