2012-06-29 159 views
12

我想从java代码中调用java脚本函数。ReferenceError:“alert”未定义

这里是我的Java代码

public static void main(String[] args) throws FileNotFoundException { 
    try { 
     /** 
     * To call a anonymous function from java script file 
     */ 
     ScriptEngine engine = new ScriptEngineManager() 
       .getEngineByName("javascript"); 
     FileReader fr = new FileReader("src/js/MySpec.js"); 
     engine.eval(fr); 

    } catch (ScriptException scrEx) { 
     scrEx.printStackTrace(); 
    } 
} 

这里是我的Java脚本文件:

(function() { 
    alert("Hello World !!!"); 
})(); 

但是当我运行驱动程序类的主要方法,它给我如下错误:

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "alert" is not defined. (<Unknown source>#2) in <Unknown source> at line number 2 
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:110) 
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232) 
at Java6RhinoRunner.load(Java6RhinoRunner.java:42) 
at Java6RhinoRunner.main(Java6RhinoRunner.java:12) 

我知道的是它需要一些脚本引擎来执行它。

对于我在我的课加rhino.jar文件path.But这是行不通的。

我没有得到如何解决这个错误。 请帮忙。提前致谢。

回答

27

alert不是JavaScript的一部分,它是网络浏览器提供的window对象的一部分。所以它不存在于你正在使用它的上下文中(这也是setInterval,setTimeout和其他计时器相关的东西,FYI。)

如果你只是想做简单的控制台输出,Rhino为您的脚本提供了一个print函数,因此您可以用print替换alert。您的脚本还可以访问所有的Java类等,例如java.lang.System.out.println('Hello');可以从您的JavaScript脚本中运行(尽管它提供的print函数有点冗余)。您也可以使可用的Java变量到脚本很容易地通过ScriptEngine.put,如:

engine.put("out", System.out); 

...然后在你的脚本:

out.println('Hello from JavaScript'); 

......所以这是做输出第三条路从脚本。 :-)

见讨论the javax.script package documentation,特别ScriptEngine#put,或对于更复杂的情况,Bindings(和SimpleBindings)和ScriptContext

+1

就像使用类似的NodeJS,你可以执行的代码,但因为你没有在浏览器中运行,你不能有浏览器的好处,如警告框。 –