Rhino打印功能

时间:2012-09-13 04:32:10

标签: java javascript debugging scripting rhino

我正在使用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 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:14)

您可以使用与rhino shell相同的范围。 rhino shell依赖于一个名为Global的特殊构造的范围实例,它定义了几个函数,如“print”。下面的示例演示了如何使用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 executable之后通过实验发现了这一点。

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

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

答案 2 :(得分:6)

您可以创建自己的:

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) );
}

答案 3 :(得分: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