问题标签 [rhino]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
601 浏览

javascript - 我想在我的服务器上运行远程 javascript

我进行了搜索并提出了 Rhino 和 Jaxer 是可能的解决方案,但无论如何我想把问题放在那里,因为我不确定它们是否完全符合我的要求(特别是如果我无法控制javascript,所以我无法添加 runat="server" 例如)。

所以,我想从我的服务器调用第 3 方站点上的远程页面,并执行 javascript。

使用 CUrL,我可以轻松地抓取页面、内容、发布等,但我不能做的是运行 javascript。

我已经从构建一个在浏览器中调用 URL 的 .NET 应用程序到上述(Rhino 和 Jaxer)提出了解决方案,但我想看看是否有人以前有过这方面的经验,如果有,可能的问题是什么以及您是如何解决问题的。

干杯,

麦克风

0 投票
5 回答
4901 浏览

javascript - 从对象内调用时使用“eval”定义顶级函数时遇到问题

我已经(在 JavaScript 中)编写了一个封装在对象中的交互式 read-eval-print-loop。但是,我最近注意到为解释器指定的顶级函数定义似乎没有被解释器“记住”。经过一些诊断工作,我将核心问题简化为:

在这一点上,我希望以下两个语句能按预期工作:

相反,我得到的是该行的预期值t1,并且该t2行失败并出现未绑定的错误t2

IOW:运行此脚本后,我有一个定义t1,而没有定义t2。从内部调用 eval 的行为evaler与顶层调用有很大不同,因此全局定义不会被记录下来。确实发生的是调用 evaler.eval返回一个函数对象,所以我假设它t2被定义并存储在我无权访问的其他一些绑定集中。(它没有被定义为 中的成员evaler。)

有什么简单的解决方法吗?我已经尝试了各种修复方法,并没有偶然发现一种有效的方法。(我所做的大部分工作都集中在将对 eval 的调用放在匿名函数中,并改变调用方式、链接__parent__等)

关于如何解决这个问题的任何想法?

这是进一步调查的结果:


tl;dr:Rhino 在调用实例上的方法时会在作用域链中添加一个中间作用域。t2被定义在这个中间范围内,立即被丢弃。@Matt:您的“hacky”方法很可能是解决此问题的最佳方法。

我仍在为根本原因做一些工作,但是由于在 jdb 上度过了一段美好的时光,我现在对正在发生的事情有了更多的了解。如前所述,函数语句 likefunction t1() { return 42; }做了两件事。

  • 它创建一个函数对象的匿名实例,就像您使用表达式一样function() { return 42; }
  • 它将匿名函数绑定到当前的顶级作用域,名称为t1

eval我最初的问题是,当我从对象的方法中调用时,为什么我没有看到第二件事发生。

在 Rhino 中实际执行绑定的代码似乎在函数中org.mozilla.javascript.ScriptRuntime.initFunction

对于上述t1情况,scope这是我设置的顶级范围。这是我想要定义我的顶级函数的地方,所以这是一个预期的结果:

但是,在这种t2情况下,scope完全是另一回事:

NativeCall这是我预期的顶级范围的父范围:

这或多或少是我在上面写这个时所害怕的:“在直接 eval 的情况下,t2 被绑定在全局环境中。在 evaler 的情况下,它被绑定在 'elsewhere'” 在这种情况下,'elsewhere ' 结果是NativeCall... 的实例,该t2函数被创建,绑定到 中的一个t2变量NativeCall,并且当调用返回NativeCall时消失。evaler.eval

这就是事情变得有点模糊的地方......我没有做尽可能多的分析,但我目前的工作理论是需要范围来NativeCall确保在调用. (稍微备份堆栈帧,当函数“需要激活”并且具有非零函数类型时,它们被添加到作用域链中。我假设这些事情仅适用于简单的函数调用,但没有'没有追踪到足够确定的上游。也许明天。)thisevalerevaler.evalNativeCallInterpreter.initFrame

0 投票
1 回答
3155 浏览

java - 为什么 Rhino 对这个 javascript 不满意?

我已经在一些浏览器中成功地将我的代码与ANTLR javascript 目标中的 javascript 库一起使用,但现在我想在服务器上使用 Rhino,但遇到了一些麻烦。我有一些引用 Rhino 1.7R2 版本的 js-14.jar 文件的简单 java 代码。

这失败了,EcmaError其消息是:

它所指的 javascript 行是:

org.antlr.namespace在文件的前面被声明为一个函数,所以我不知道该怎么想。我也没有看到“命名空间”是javascript或Rhino中的保留字。

这是第org.antlr.namespace56 行的声明:

ANTLR javascript 目标页面提到 Rhino 是一个经过测试的平台,所以我想我可能只是在滥用 Rhino。有没有人有任何提示?

0 投票
2 回答
2708 浏览

c# - Rhino Mocks 验证从公共方法调用的私有方法

我一直在试图弄清楚这一点,我如何测试在我正在测试的类中使用 rhino 模拟调用私有方法。所以我的课会是这样的。

因此,我的单元测试是在类 Foo 和方法 DoSomething() 上进行的

0 投票
2 回答
3720 浏览

java - Rhino,从多个 javascript 文件中添加代码

我正在使用 Rhino 在 Java 应用程序中嵌入一些 javascript。我按照 Rhino 网站上的示例,通过调用 Context 的 evaluateString 方法执行脚本并将实际脚本作为字符串传递。

我有一大堆想要使用的现有 javascript 代码。我不想将它全部连接成一个巨大的字符串并将其传递给评估字符串。我宁愿能够加载代码,以便我可以从传递给 evaluateString 的代码中调用它(有点像 AddCode 方法在 Microsoft 的脚本控制中工作)。我想添加代码,就像我目前可以使用 ScriptableObject.putProperty 方法添加变量一样。

有没有办法做到这一点?有人可以提供代码片段或文档链接吗?谢谢!

0 投票
3 回答
493 浏览

java - Scripting java : 在脚本文件中创建一个类

我想在脚本文件 (javax.script) 中创建一个 java 类。请帮忙

0 投票
2 回答
8506 浏览

javascript - 如何在 Rhino 中创建一个“真正的”JavaScript 数组

好吧,我有点难过。我可能错过了一些明显的东西,但显然我只是看不到森林的树木:

我正在尝试调用一个期望其参数为数组的 JavaScript 函数,即它检查if (arg instanceof Array)...不幸的是,我(或 Rhino)似乎无法创建这样的数组:

唉,resultfalse

我在这里想念什么?

编辑
再多一点信息:两者都[] instanceof Array按预期new Array() instanceof Array返回。true如果我将元素添加到数组中,它们会以正确的索引(数字,从零开始)显示在 JavaScript 代码中:

使用此 JavaScript 函数输出时:

结果是:

所以它有效。除了我想要一个“真正的”数组:)

0 投票
3 回答
4439 浏览

java - 脚本java:从外部文件导入类

我想导入一个我已经写在外部文件夹中的类,例如:我的类Example.java位于c:\class\Example.java我的脚本中,比如使用

或者

这是在 ScriptEngine rhino 的脚本中
我该怎么做???

0 投票
1 回答
535 浏览

soap - 如何从 Rhino 中运行的脚本中的 E4X 对象创建和 Apache Axiom 元素?

我正在运行一个在 Rhino 中运行的脚本,它会创建一个像这样的 E4X 对象:

我想在 SOAP 消息中包含这样的 XML。我正在使用Apache Axis 2 ServiceClient创建肥皂消息。我正在寻找一种将 E4X xml 对象转换为 Apache AXIOM 元素的方法,以便可以通过调用将其添加到 SOAP 消息中:

ServiceClient.addHeader(org.apache.axiom.om.OMElement omElement)

0 投票
1 回答
582 浏览

java - 如何在 Eclipse 中将 Rhino 项目构建为可运行的 JAR?

我有一个 Rhino 项目,我在其中编写了一些 .js 文件,并且从 Eclipse 我通过org.mozilla.javascript.tools.shell.Main使用参数调用我的一个 .js 文件来启动我的程序,.js 文件"src/bot.js"。现在,为了在我的服务器上运行它,我希望能够将它构建到一个可运行的 JAR 中以便于部署。我该怎么做,或者我应该尝试采用完全不同的方法?