快速业务通道

Java SE 6新特性: 对脚本语言的支持 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
这些属性;对应的,引擎级别的 Bindings 里的属性则是“局部变量”,它们只对同一个引擎实例可见,从而能为不同的引擎设置独特的环境,通过同一个脚本引擎运行的脚本运行时能共享这些属性。

ScriptContext 接口定义了下面这些函数来存取数据:

表 3. ScriptContext 存取属性函数

函数 描述
Object removeAttribute(String name, int scope) 从指定的范围里删除一个属性
void setAttribute(String name, Object value, int scope) 在指定的范围里设置一个属性的值
Object getAttribute(String name) 从上下文的所有范围内获取优先级最高的属性的值
Object getAttribute(String name, int scope) 从指定的范围里获取属性值

ScriptEngineManager 拥有一个全局性的 Bindings 实例,在通过 ScriptEngineFactory 实例创建 ScriptEngine 后,它把自己的这个 Bindings 传递给所有它创建的 ScriptEngine 实例,作为 GLOBAL_SCOPE。同时,每一个 ScriptEngine 实例都对应一个 ScriptContext 实例,这个 ScriptContext 除了从 ScriptEngineManager 那获得的 GLOBAL_SCOPE,自己也维护一个 ENGINE_SCOPE 的 Bindings 实例,所有通过这个脚本引擎运行的脚本,都能存取其中的属性。除了 ScriptContext 可以设置属性,改变内部的 Bindings,Java 脚本 API 为 ScriptEngineManager 和 ScriptEngine 也提供了类似的设置属性和 Bindings 的 API。

图 3. Bindings 在 Java 脚本 API 中的分布

Java SE 6新特性: 对脚本语言的支持 - 编程入门网

Java SE 6新特性: 对脚本语言的支持(5)

时间:2011-02-15 IBM 邱小侠

从 图 3 中可以看到,共有三个级别的地方可以存取属性,分别是 ScriptEngineManager 中的 Bindings,ScriptEngine 实例对应的 ScriptContext 中含有的 Bindings,以及调用 eval 函数时传入的 Bingdings。离函数调用越近,其作用域越小,优先级越高,相当于编程语言中的变量的可见域,即 Object getAttribute(String name) 中提到的优先级。从 清单 3 这个例子中可以看出各个属性的存取优先级:

清单 3. 上下文属性的作用域

import javax.script.*; public class ScopeTest {   public static void main(String[] args) throws Exception {     String script=" println(greeting) ";     ScriptEngineManager manager = new ScriptEngineManager();     ScriptEngine engine = manager.getEngineByName("javascript");     //Attribute from ScriptEngineManager     manager.put("greeting", "Hello from ScriptEngineManager");     engine.eval(script);     //Attribute from ScriptEngine     engine.put("greeting", "Hello from ScriptEngine");     engine.eval(script);     //Attribute from eval method     ScriptContext context = new SimpleScriptContext();     context.setAttribute("greeting", "Hello from eval method",       ScriptContext.ENGINE_SCOPE);     engine.eval(script,context);   } }

JavaScript 脚本 println(greeting) 在这个程序中被重复调用了三次,由于三次调用的环境不一样,导致输出也不一样,greeting 变量每一次都被优先级更高的也就是距离函数调用越近的值覆盖。从这个例子同时也演示了如何使用 ScriptContext 和 Bi

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号