2012-06-29 9 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 !!!"); 
})(); 

しかし、私はドライバクラスのmainメソッドを実行すると、それは私に以下のようにエラー与えている:

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ファイルを自分のクラスパスに追加しましたが、これは動作しません。

このエラーを解決する方法はありません。 助けてください。事前に感謝します。

答えて

27

alertはJavaScriptの一部ではなく、ウェブブラウザによって提供されるwindowオブジェクトの一部です。したがって、それを使用しようとしているコンテキストには存在しません(これはsetInterval,setTimeout、その他のタイマー関連のもの、FYIも同様です)

単純なコンソールRhinoはスクリプトにprint関数を提供するので、alertprintに置き換えることができます。あなたのスクリプトもすべてのJavaクラスにアクセスすることができます。したがって、java.lang.System.out.println('Hello');はJavaScriptスクリプトから動作します(ただし、提供されたprint関数で少し冗長です)。また、ScriptEngine.put経由で簡単にスクリプトに利用できるJavaの変数を作ることができます。例:

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

...そして、あなたのスクリプトで:

out.println('Hello from JavaScript'); 

...それは、出力を行うための第三の方法ですので、スクリプトから。 :-)

Bindings

は(及びSimpleBindings)、ScriptEngine#put特に、又はより複雑なケースについて、the javax.script package documentationでの議論を参照して、ScriptContext

+1

NodeJSのようなものと同じように、コードを実行できますが、ブラウザで実行していないため、アラートボックスなど、ブラウザの利点はありません。 –