在 清单 1 中,main() 方法将 ScriptEngine 传递给各个方法用于计算该方法的 JavaScript 代码。第一个方法如清单 2 所示。invokeHelloScript() 方法调用脚本引擎的 eval 方法计算和执行 JavaScript 代码中的特定字符串。ScriptEngine 接口定义了 6 个重载的 eval() 方法,用于将接收的脚本当作字符串或 java.io.Reader 对象计算,java.io.Reader 对象一般用于从外部源(例如文件)读取脚本。
清单 2. invokeHelloScript 方法
private static void invokeHelloScript(ScriptEngine jsEngine) throws ScriptException { jsEngine.eval("println('Hello from JavaScript')"); }
脚本执行上下文
HelloScriptingWorld 应用程序中的示例脚本 使用 JavaScript println() 函数向控制台输出结果,但是我们拥有输入和输出流的完全控制权。脚本引擎提供了一个选项用于修改脚本执行的上下文,这意味着我们可以修改标准输入流、标准输出流和标准错误流,同时还可以定义哪些全局变量和 Java 对象对正在执行的脚本可用。
invokeHelloScript() 方法中的 JavaScript 将 Hello from JavaScript 输出到标准输出流,在本例中为控制台窗口。(清单 6 含有运行 HelloScriptingWorldApplication 时的完整输出。)
注意,类中的这一方法和其他方法都声明抛出了 javax.script.ScriptException。这个选中的异常(脚本包中定义的惟一一个异常)表示引擎无法解析或执行给定的代码。所有脚本引擎 eval() 方法都声明抛出一个 ScriptException,因此我们的代码需要适当处理这些异常。
清单 3 显示了两个有关的方法:defineScriptFunction() 和 invokeScriptFunctionFromEngine()。defineScriptFunction() 方法还使用一段硬编码的 JavaScript 代码调用脚本引擎的 eval() 方法。但是有一点需要注意,该方法的所有工作只是定义了一个 JavaScript 函数 sayHello()。并没有执行任何代码。sayHello() 函数只有一个参数,它会使用 println() 语句将这个参数输出到控制台。脚本引擎的 JavaScript 解释器将这个函数添加到全局环境,以供后续的 eval 调用使用(该调用发生在 invokeScriptFunctionFromEngine() 方法中,这并不奇怪)。
(编辑:aniston)
|