19

JavaコードからJavaスクリプト関数を呼び出そうとしています。

これが私の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ファイルをクラスパスに追加しましたが、これは機能していません。

このエラーを解決する方法がわかりません。助けてください。よろしくお願いします。

4

1 に答える 1

40

alertJavaScriptの一部ではなく、windowWebブラウザによって提供されるオブジェクトの一部です。したがって、使用しようとしているコンテキストには存在しません(これは、、、およびその他のタイマー関連のものにも当てはまりますsetIntervalsetTimeout参考までに)。

単純なコンソール出力を実行したいだけの場合、Rhinoはスクリプトに関数を提供するので、に置き換えることがprintできます。スクリプトはすべてのJavaクラスなどにもアクセスできるため、たとえばJavaScriptスクリプトから機能します(ただし、提供されている関数では少し冗長です)。たとえば、次のコマンドを使用して、Java変数をスクリプトで簡単に使用できるようにすることもできます。alertprintjava.lang.System.out.println('Hello');printScriptEngine.put

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

...そしてスクリプトで:

out.println('Hello from JavaScript');

...これは、スクリプトからの出力を行うための3番目の方法です。:-)

特に、またはより複雑なケースについてはjavax.scriptパッケージのドキュメントの説明を参照してください(および)および。ScriptEngine#putBindingsSimpleBindingsScriptContext

于 2012-06-29T09:02:32.863 に答える