问题标签 [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.
javascript - 我想在我的服务器上运行远程 javascript
我进行了搜索并提出了 Rhino 和 Jaxer 是可能的解决方案,但无论如何我想把问题放在那里,因为我不确定它们是否完全符合我的要求(特别是如果我无法控制javascript,所以我无法添加 runat="server" 例如)。
所以,我想从我的服务器调用第 3 方站点上的远程页面,并执行 javascript。
使用 CUrL,我可以轻松地抓取页面、内容、发布等,但我不能做的是运行 javascript。
我已经从构建一个在浏览器中调用 URL 的 .NET 应用程序到上述(Rhino 和 Jaxer)提出了解决方案,但我想看看是否有人以前有过这方面的经验,如果有,可能的问题是什么以及您是如何解决问题的。
干杯,
麦克风
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
确保在调用. (稍微备份堆栈帧,当函数“需要激活”并且具有非零函数类型时,它们被添加到作用域链中。我假设这些事情仅适用于简单的函数调用,但没有'没有追踪到足够确定的上游。也许明天。)this
evaler
evaler.eval
NativeCall
Interpreter.initFrame
java - 为什么 Rhino 对这个 javascript 不满意?
我已经在一些浏览器中成功地将我的代码与ANTLR javascript 目标中的 javascript 库一起使用,但现在我想在服务器上使用 Rhino,但遇到了一些麻烦。我有一些引用 Rhino 1.7R2 版本的 js-14.jar 文件的简单 java 代码。
这失败了,EcmaError
其消息是:
它所指的 javascript 行是:
这org.antlr.namespace
在文件的前面被声明为一个函数,所以我不知道该怎么想。我也没有看到“命名空间”是javascript或Rhino中的保留字。
这是第org.antlr.namespace
56 行的声明:
ANTLR javascript 目标页面提到 Rhino 是一个经过测试的平台,所以我想我可能只是在滥用 Rhino。有没有人有任何提示?
c# - Rhino Mocks 验证从公共方法调用的私有方法
我一直在试图弄清楚这一点,我如何测试在我正在测试的类中使用 rhino 模拟调用私有方法。所以我的课会是这样的。
因此,我的单元测试是在类 Foo 和方法 DoSomething() 上进行的
java - Rhino,从多个 javascript 文件中添加代码
我正在使用 Rhino 在 Java 应用程序中嵌入一些 javascript。我按照 Rhino 网站上的示例,通过调用 Context 的 evaluateString 方法执行脚本并将实际脚本作为字符串传递。
我有一大堆想要使用的现有 javascript 代码。我不想将它全部连接成一个巨大的字符串并将其传递给评估字符串。我宁愿能够加载代码,以便我可以从传递给 evaluateString 的代码中调用它(有点像 AddCode 方法在 Microsoft 的脚本控制中工作)。我想添加代码,就像我目前可以使用 ScriptableObject.putProperty 方法添加变量一样。
有没有办法做到这一点?有人可以提供代码片段或文档链接吗?谢谢!
java - Scripting java : 在脚本文件中创建一个类
我想在脚本文件 (javax.script) 中创建一个 java 类。请帮忙
javascript - 如何在 Rhino 中创建一个“真正的”JavaScript 数组
好吧,我有点难过。我可能错过了一些明显的东西,但显然我只是看不到森林的树木:
我正在尝试调用一个期望其参数为数组的 JavaScript 函数,即它检查if (arg instanceof Array)...
不幸的是,我(或 Rhino)似乎无法创建这样的数组:
唉,result
是false
。
我在这里想念什么?
编辑:
再多一点信息:两者都[] instanceof Array
按预期new Array() instanceof Array
返回。true
如果我将元素添加到数组中,它们会以正确的索引(数字,从零开始)显示在 JavaScript 代码中:
使用此 JavaScript 函数输出时:
结果是:
所以它有效。除了我想要一个“真正的”数组:)
java - 脚本java:从外部文件导入类
我想导入一个我已经写在外部文件夹中的类,例如:我的类Example.java
位于c:\class\Example.java
我的脚本中,比如使用
或者
这是在 ScriptEngine rhino 的脚本中
我该怎么做???
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)
java - 如何在 Eclipse 中将 Rhino 项目构建为可运行的 JAR?
我有一个 Rhino 项目,我在其中编写了一些 .js 文件,并且从 Eclipse 我通过org.mozilla.javascript.tools.shell.Main
使用参数调用我的一个 .js 文件来启动我的程序,.js 文件"src/bot.js"
。现在,为了在我的服务器上运行它,我希望能够将它构建到一个可运行的 JAR 中以便于部署。我该怎么做,或者我应该尝试采用完全不同的方法?