2009-11-30 49 views
0

我已经在Rhino 1.7下使用Javascript编写了一些脚本,其中一个脚本启动了一个最小的http服务器并接受输入中的JS命令。现在从脚本调用javascript解释器

,如果我叫(从内部犀牛):

engine = ScriptEngineManager().getEngineByName("JavaScript"); 

我得到的内置JS引擎(从Java 1.6),这是犀牛的旧版本,并且缺少某些功能(如JavaAdapter的对多个接口)。

如何获得Rhino引擎而不是?我需要ScriptEngineManager.getEngineFactories()还是其他什么?

+0

对不起冗余,但是:“engine = ScriptEngineManager()...”是在你的JS中调用的吗?哪个在Rhino 1.7中运行,但是返回默认的Java 6 JS脚本引擎而不是Rhino?为什么你需要在你的JS里面有一个新的脚本引擎?或者你想获得当前的引擎/为什么你需要引用JS中的当前引擎? – 2009-11-30 16:10:34

+0

是的。我需要一个脚本来启动另一个解释器,以避免使用eval()。 第一个脚本启动一个HTTP服务器,它为单个页面提供HTML表单。 POST方法向服务器发送命令或文件名,服务器端脚本执行代码。 – 2009-12-01 11:19:57

回答

1

我自己发现了它(试错)。如上所述,Rhino不会注册引擎工厂。你可以得到当前的发动机(如上下文和脚本化的对象):

cx = Context.getCurrentContext(); 
scope = new ImporterTopLevel(cx); 

与这些对象,我可以运行我的脚本或使用evalString/evalReader命令行。

0

在调用你的初始脚本之前,为什么不在你的脚本中设置你用作上下文变量的引擎?这样,在脚本内部,您将可以访问运行它的引擎。

+0

我不确定我明白你的意思。 但是:更改运行javascript引擎的java代码是我试图避免的(否则我会在Java中实现整个http-server)。 – 2009-11-30 14:41:39

1

你想实现的是选择一个实现“JavaScript”的脚本引擎的特定版本。正确的方法是调用ScriptEngineManager.getEngineFactories(),然后检查getLanguageName()getEngineVersion()的结果。

+0

我已经做了,但犀牛不注册引擎工厂。 – 2009-12-01 11:15:55