2012-06-29 157 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,你可以執行的代碼,但因爲你沒有在瀏覽器中運行,你不能有瀏覽器的好處,如警告框。 –