web-dev-qa-db-ja.com

ReferenceError:「アラート」が定義されていません

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 !!!");
})();

しかし、ドライバクラスのメインメソッドを実行すると、次のようなエラーが発生します。

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ファイルを追加しましたが、これは機能しません。

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

15
Sanjay Jain

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

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

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

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

out.println('Hello from JavaScript');

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

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

32
T.J. Crowder