先週は次世代Java Plug-inのLiveConnectを使用して,HTMLドキュメントに埋めこまれたJavaScriptからJavaへのアクセスについて解説しました。今週は,その逆。LiveConnectを使用して,JavaからHTMLに埋めこまれたJavaScriptにアクセスしてみましょう。

JavaからJavaScriptへのアクセス

JavaではJavaScriptのオブジェクトはすべて,netscape.javascript.JSObjectクラスのオブジェクトとして扱われます。

JSObjectクラスはパッケージ名からもわかるとおり,NetscapeのLiveConnectに由来しています。このため,通常のAPIドキュメントにはJSObjectクラスのJavadocがありません。

JSObjectクラスと例外クラスのJSExceptionのJavadocはこちらのURLにあります。できれば,通常のAPIドキュメントに含めていただきたいところですね。

JSObjectクラスが定義しているメソッドは8種類しかありません。以下に列挙します。

    ●Windowオブジェクトの取得
  • getWindow
    ●関数コール
  • call
    ●スクリプトの評価
  • eval
    ●プロパティに対するメソッド
  • getMember
  • setMember
  • removeMember
    ●配列に対するメソッド
  • getSlot
  • setSlot

これらのメソッドはすべてJSException例外を投げます。ただし,JSException例外はランタイム例外なので,try ... catchを書く必要はありません。

それぞれのメソッドの使い方はサンプルで示していきます。

サンプルのソース (こちらからダウンロードできます)
Java2JavaScriptSample1.java
java2javascript1.html

HTMLドキュメントに埋めこまれたJavaScriptでは,Windowオブジェクトが重要になります。JSObjectクラスではstaticメソッドであるgetWindowメソッドで,Windowオブジェクトに対応するJSObjectオブジェクトを取得できます。

関数のコールや,スクリプトの評価などはすべてWindowオブジェクトに対応するJSObjectオブジェクトに対して行います。

たとえば,JavaScriptのsayHello関数をコールするには,次のように記述します。

        // Windowオブジェクトの取得
        window = JSObject.getWindow(this);
 
        // 関数コール
        String result = (String)window.call("sayHello", 
                                            new Object[] { "World" });
        System.out.println("call sayHello: " + result);

getWindowメソッドは前述したようにstaticメソッドで,Appletオブジェクトを引数にします。

JavaScriptの関数をコールするcallメソッドは第1引数が関数名,第2引数が関数の引数を配列にしたものです。callメソッドの戻り値は関数の戻り値で,その型はObjectクラスです。したがって,必要に応じてキャストを行います。

引数や戻り値は,先週解説した型変換の規則によって変換されます。ただし,JavaScriptの配列はJavaの配列に変換されません。詳しくは後述します。

JavaScriptのsayHello関数を以下に示します。

      function sayHello(message) {
          return "Hello, " + message + "!";
      }

文字列を連結して返しているだけの単純な関数です。

この例では直接関数をコールしましたが,関数をコールするスクリプトを評価することでも同じことが実現できます。JavaScriptのスクリプトを評価するにはevalメソッドを使用します。

        // スクリプトの評価
        result = (String)window.eval("sayHello('World');");
        System.out.println("eval sayHello(): " + result);

文字列でスクリプトを記述し,evalメソッドの引数に指定します。ここでは'World'を引数にしてsayHello関数をコールするスクリプトを記述してあります。

evalメソッドの戻り値はスクリプトを評価した結果になります。evalメソッドも戻り値の型はObjectクラスなので,必要に応じてキャストするようにします。