犀牛打印功能

2022-09-04 05:20:30

我正在使用Rhino 1.7R4和env.js 1.2在Java中运行Javascript代码

我想从我的Javascript代码打印一个字符串到Java控制台。

根据:http://evilroundabout.blogspot.com.au/2009/11/javascript-printing-rhino.html

我应该使用:打印(“Hello world”);

但是当我这样做时,我得到:

org.mozilla.javascript.EcmaError: ReferenceError: "print" is not defined. (svg-renderer-highcharts-2.1.4.js#20)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3750)
at org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1794)
at org.mozilla.javascript.ScriptRuntime.getNameFunctionAndThis(ScriptRuntime.java:2188)
at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1308)
at script.renderSVGFromObject(svg-renderer-highcharts-2.1.4.js:20)

如果我使用 document.write,我看不到任何输出。


答案 1

我不认为这在嵌入式模式下有效,我认为这只适用于Rhino控制台。

您可以使用java.lang.system.out.println。这应该有效:-

java.lang.System.out.println("HELLO")

答案 2

您可以使用与犀牛壳相同的范围。rhino shell 依赖于一个名为 Global 的特殊构造的作用域实例,该实例定义了几个函数,如“print”。下面的示例演示如何使用全局和“打印”函数。这会将“Hello World!”打印两次到 stdout。

import org.mozilla.javascript.Context;
import org.mozilla.javascript.tools.shell.Global;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );

        Context cx = Context.enter();
        Global global = new Global(cx);
        cx.evaluateString(global, "print('Hello World!')", 
                "helloWorld.js", 1, null);
        Context.exit();
    }
}

在挖掘了Rhino shell可执行文件之后,我通过实验发现了这一点。

为了完整起见,这里是 Global 定义的其他全局函数:

"defineClass",
"deserialize",
"doctest",
"gc",
"help",
"load",
"loadClass",
"print",
"quit",
"readFile",
"readUrl",
"runCommand",
"seal",
"serialize",
"spawn",
"sync",
"toint32",
"version"