13

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

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

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

我应该使用: print("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 我看不到任何输出。

4

4 回答 4

21

我不认为这将在嵌入式模式下工作,我认为这只会在 Rhino 控制台中工作。

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

java.lang.System.out.println("HELLO")
于 2012-09-13T04:47:43.070 回答
15

您可以很容易地使用 rhino shell 使用的相同范围。rhino shell 依赖于一个名为 Global 的特殊构造的范围实例,它定义了几个函数,如“print”。下面的示例演示了如何使用 Global 和“打印”功能。这将打印“Hello World!” 两次到标准输出。

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"
于 2012-12-05T15:22:41.253 回答
7

您可以创建自己的:

function print() {
    for( var i = 0; i < arguments.length; i++ ) {
       var value = arguments[i];
       java.lang.System.out.print( value );
    }
    java.lang.System.out.println();
}

function printf( format ) {
    java.lang.System.out.printf( format, Array.prototype.slice.call(arguments) );
}
于 2012-09-13T04:46:22.227 回答
5

截至 2014 年 1 月,方法和属性列表

new org.mozilla.javascript.tools.shell.Global( org.mozilla.javascript.Context.enter() )

看起来如下:

defineClass
deserialize
doctest
gc
getConsole
getErr
getIn
getOut
getPrompts
help
init
init
initQuitAction
installRequire
isInitialized
load
loadClass
pipe
print
quit
readFile
readUrl
runCommand
runDoctest
seal
serialize
setErr
setIn
setOut
setSealedStdLib
spawn
sync
toint32
version
于 2014-01-02T19:50:44.847 回答