先週は次世代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を書く必要はありません。
それぞれのメソッドの使い方はサンプルで示していきます。
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クラスなので,必要に応じてキャストするようにします。