このセクションでは、次のトピックについて説明します。
Java Plug-in では DOM にアクセスするのに 2 通りの方法を提供しています。JSObject
を使用する方法と、共通 DOM API を使用する方法です。 それぞれの方法およびセキュリティ上の考慮事項について、以下で説明します。
JSObject
Java アプレットは、Java から JavaScript への通信を行って Document Object Model (DOM) にアクセスするか、HTML ページ上で JavaScript 関数を呼び出す必要があります。 ブラウザを使用すると、Java ラッパークラス netscape.javascript.JSObject
を介した Java と JavaScript 間の通信が可能になります。 詳細は、「Java Packages for LiveConnect」を参照してください。
ブラウザ間で DOM 実装が異なるため、Java Plug-in が提供する JSObject
サポートは、Internet Explorer と Navigator で異なります。 このドキュメントでは、異なるブラウザ環境で JSObject
サポートがどのように機能するかを説明します。
JSObject
の動作方法 JSObject
を利用すると、HTML ページの DOM へのアクセスが容易になります。 ただし、ブラウザが異なると DOM の実装方法も異なるため、Java アプレットで JSObject
を使用すると、Java Plug-in の動作がブラウザによって異なる場合があります。特定のブラウザでの DOM 実装の詳細は、ブラウザの開発者ガイドを参照してください。
一般に、アプレットは次の方法で JSObject
にアクセスします。
import netscape.javascript.*; import java.applet.*; import java.awt.*; class MyApplet extends Applet { public void init() { JSObject win = JSObject.getWindow(this); JSObject doc = (JSObject) win.getMember("document"); JSObject loc = (JSObject) doc.getMember("location"); String s = (String) loc.getMember("href"); // document.location.href win.call("f", null); // Call f() in HTML page } } |
開始位置は、static
メソッドです。
public static JSObject getWindow(Applet a)
このメソッドにより、指定されたアプレットを含む Window
を表す JSObject
が返されます。 このメソッドは、パラメータとして java.applet.Applet
のみを取るため、アプレットから JSObject
にアクセスできますが、Bean がアプレットでない限り、Bean からアクセスすることはできません。
Window
オブジェクトの取得が完了したら、アプレットは次のメソッドを使用して HTML ページの DOM をナビゲートできます。
public Object call(String methodName, Object args[])
public Object eval(String s)
public Object getMember(String name)
public Object getSlot(int index)
public void removeMember(String name)
public void setMember(String name, Object value)
public void setSlot(int index, Object value)
public String toString()
Java Plug-in では、getWindow()
、call()
、eval()
、setMember()
、および getMember()
だけを使用することをお勧めします。getSlot()
、setSlot()
、removeMember()
、および toString()
の実装はブラウザに依存するため、実行結果は、Java Plug-in が稼動しているブラウザのバージョンおよびプラットフォームにより異なります。
JSObject
の使用方法の詳細は、「LiveConnect」ページの「Java to JavaScript Communication」セクションを参照してください。
Java コードをコンパイルして JSObject
を利用するには、CLASSPATH
内に netscape.javascript パッケージを保持する必要があります。 現在のところ、Java Plug-in 1.3 では、JAR ファイル JAWS.JAR
内に netscape.javascript が含まれています。 JSObject
を使用するアプレットをコンパイルするには、コンパイルする前に、 CLASSPATH
に JAWS.JAR
を追加する必要があります。
JSObject
は、Java Plug-in ではサポートされますが、Java 2 プラットフォームの AppletViewer ではサポートされないことに留意してください。 このため、JSObject
を使用するアプレットは、AppletViewer では動作しないか、例外が発生します。
JSObject
サポートの程度COM 経由で DOM にアクセスすることにより、Java Plug-in は IE での JSObject
をフルサポートします。
Netscape の Plug-in API 経由で DOM にアクセスすることにより、Java Plug-in は、Navigator 4 での JSObject
を限定的にサポートします。 Navigator 4 では、JSObject
を介して次の JavaScript オブジェクトにアクセスできます。
Anchor
Document
Element
Form
Frame
History
Image
Layer
Link
Location
Navigator
Option
URL
Window
他の JavaScript オブジェクトは Netscape 4 ではサポートされておらず、JSObject
を介してそういったオブジェクトにアクセスしようとすると、Java の例外が発生します。 こうした制約は Netscape 6 には該当しないので、Netscape 6 では JSObject
はフルサポートされます。
注: 異なるブラウザが同じ JavaScript オブジェクトをサポートするとしても、サポートされるオブジェクトのメソッドおよびプロパティが異なる場合があります。 使用するブラウザの JavaScript 開発者ガイドを参照してください。
JSObject
サポートの有効化セキュリティ上の理由で、Java Plug-in の JSObject
サポートは、デフォルトでは無効に設定されています。 Java Plug-in の JSObject
サポートを有効にするには、次に示すように、EMBED/OBJECT
タグ内に新規属性 MAYSCRIPT
が存在する必要があります。
APPLET
タグ: <APPLET code="XYZApp.class" codebase="html/" align="baseline" width="200" height="200" MAYSCRIPT> <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz"> No JDK 1.3 support for APPLET!! </APPLET> |
OBJECT
タグ: <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="200" height="200" align="baseline" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"> <PARAM NAME="code" VALUE="XYZApp.class"> <PARAM NAME="codebase" VALUE="html/"> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.3"> <PARAM NAME="MAYSCRIPT" VALUE="true"> <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz"> No JDK 1.3 support for APPLET!! </OBJECT> |
EMBED
タグ: <EMBED type="application/x-java-applet;version=1.3" width="200" height="200" align="baseline" code="XYZApp.class" codebase="html/" model="models/HyaluronicAcid.xyz" MAYSCRIPT=true pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"> <NOEMBED> No JDK 1.3 support for APPLET!! </NOEMBED> </EMBED> |
MAYSCRIPT
が false に指定されているか、MAYSCRIPT
が存在しない場合、JSObject
は無効になります。 EMBED/OBJECT
タグ内の MAYSCRIPT
属性の詳細は、「Java Plug-in での OBJECT
、EMBED
、および APPLET
タグの使用」を参照してください。
ここでは、Java Plug-in 1.4 の共通 DOM API について説明します。 この API は、さまざまなプラットフォームで稼動する異なるブラウザベンダーのブラウザに対して、ブラウザ内の DOM にアクセスするための標準 API を提供します。
注:Internet Explorer 6 と Netscape 6 ではフルサポートされていますが、ほかのブラウザでのサポートは制限されています。 |
この API は、Document Object Model (DOM) Level 2 勧告に基づいて構築されています (さまざまな w3c 勧告の詳細は、http://www.w3.org/DOM/ を参照してください)。 Document Object Model (DOM) は、IDL (Interface Definition Language) を使用して定義されたインタフェースセットで、Java 言語バインディングが含まれます。
共通 DOM API には、w3c で定義された、次のインタフェースパッケージが含まれます。
org.w3c.dom.*
org.w3c.dom.css.*
org.w3c.dom.events.*
org.w3c.dom.html.*
org.w3c.dom.stylesheets.*
org.w3c.dom.views.*
共通 DOM クラスを使用すると、org.w3c.dom
および org.w3c.dom.html
パッケージ内の API を介して、アプリケーションから基盤となるブラウザの DOM にアクセスできます。
各 DOM は、ブラウザ内の単一の XML/HTML ドキュメントの基盤表現を表します。各ブラウザは、ブラウザのフレーム/ウィンドウに複数の XML/HTML ドキュメントを表示できます。 このため、アプリケーションが共通 DOM クラスを介して DOM へのアクセスを要求した場合、重要なのはアプリケーションに関連付けられた DOM を返すことです。 アプリケーションに関連付けられた適切な DOM を取得するため、Java オブジェクトが DOMService.getService()
に渡されます。 DOMService
は、オブジェクトに関連付けられた適切な DOMService
実装を返します。それ以外の場合、例外がスローされます。 通常、Java オブジェクトは、アプレットまたは JavaBeans コンポーネントです。 ただし、この仕様は、DOMServiceProvider
が他の Java オブジェクトタイプを処理可能である場合、その使用を除外するものではありません。
DOM に対する操作を実行するには、DOMAction
を実装するオブジェクトを DOMService.invokeAndWait()
または DOMService.invokeLater()
に渡す必要があります。 次に、DOMAction.run()
が、DOM アクセスを処理するスレッド上で実行されます。
次に、Document オブジェクトのタイトルを取得する簡単な例を示します。
DOMService service = null; try { service = DOMService.getService(MyApplet);String title = (String) service.invokeAndWait(new DOMAction() { public Object run(DOMAccessor accessor) { HTMLDocument doc = (HTMLDocument) accessor.getDocument(); return doc.getTitle(); } }); } catch (DOMUnsupportedException e1) { } catch (DOMAccessException e2) { } |
複数の DOMServiceProvider
が存在するため、DOMServiceProvider
実装の共通 DOM クラスへのプラグインをサードパーティに許可することは重要です。 これを実現するため、新規 Java プロパティ com.sun.browser.dom.DOMServiceProvider
が定義されています。
このプロパティを定義する場合、DOMServiceProvider
実装のクラス名のリストを含める必要があります。各クラス名は、「|」文字で区切ります。
DOMService.getService()
の呼び出し時に、com.sun.browser.dom.DOMServiceProvider
により指定された DOMServiceProvider
実装が 1 つずつ呼び出され、プロバイダが、プロパティで指定された順序に従ってオブジェクトの DOM への関連付けを判別可能かどうかが確認されます。 2 つの DOMServiceProvider
が同一のオブジェクトを処理可能な場合、プロパティ内で最初に指定されたプロバイダが使用されます。
各ブラウザの DOM は実装方法が異なるため、DOM アクセス時のスレッドの安全性は期待されていません。 この仕様の DOM オブジェクト実装へのアクセスは、スレッドの安全性を確保するため、DOM アクセスをディスパッチするスレッドのみに制限する必要があります。 これを実現するため、DOM オブジェクトにアクセスするコードのスコープを、DOMAction.run()
ブロック内に限定する必要があります。 操作を呼び出す場合、DOM アクセスをディスパッチするスレッドで DOMAction.run()
が実行されるよう、DOMService.invokeAndWait()
または DOMService.invokeLater()
を使用する必要があります。
DOM オブジェクトの実装を DOMAction.run()
ブロック外部で呼び出してはなりませんが、アプリケーションはこれらの DOM オブジェクトをクラスのインスタンスメンバとしてキャッシュしたり、スレッド間でこれらの DOM オブジェクトを渡す場合があります。 ただし、DOM オブジェクトを任意のオブジェクトの static メンバとしてキャッシュすることは禁止されています。これは、static メンバが、基盤となる DOM オブジェクトのライフサイクル以上の期間存在する可能性があるためです。
任意のスレッドから呼び出し可能な共通 DOM クラス内の唯一のオブジェクトは、DOMService
です。 共通 DOM クラス内の他のオブジェクトへのアクセスは、DOMAction.run()
ブロック内に制限されています。それ以外の操作を行うと、例外がスローされます。
ブラウザ DOM は、ブラウザ内のすべてのサービスへのアクセスを提供します。このため、DOM への各呼び出し時に、セキュリティが適正にチェックされていることを確認するのは大切です。 DOMService.invokeAndWait()
または DOMService.invokeLater()
が呼び出されると、呼び出し側のセキュリティコンテキストの捕捉が行われます。 その後、対応する DOMAction.run()
が DOM アクセスを処理するスレッドで実行されると、DOM オブジェクト実装の呼び出し時に、呼び出し側のセキュリティコンテキストがブラウザ DOM に渡されます。 元の呼び出し側が DOM へのアクセスに必要な権限を保持していない場合、DOMAccessException
がスローされます。
DOM アクセスのセキュリティポリシーは、ブラウザにより異なります。 このため、Java アプリケーションが署名され、完全に信頼されていても、ブラウザ内の DOM オブジェクトへのアクセスで DOMAccessException
がスローされる場合があります。
DOM オブジェクトの実装は、ブラウザ DOM 内で実際の基盤をなすオブジェクトを表します。 XML/HTML ドキュメントは瞬時に変化するため、Java の DOM オブジェクトが有効ではなくなっている可能性があります。 無効な DOM オブジェクトへのアクセスが行われると、W3C DOM Level 2 仕様に従って、org.w3c.dom.DOMException
がスローされます。 DOMAction.run()
内の DOM オブジェクトにアクセスするコードを記述する開発者は、いつも DOM オブジェクトが有効であると見なすべきではありません。
この仕様を実装するサードパーティは、com.sun.browser.dom
パッケージ内の共通 DOM クラスの実装を提供する必要があります。 W3C DOM Level 2 API の実装は、W3C DOM Level 2 仕様にも適合している必要があります。 ただし、ブラウザによって、実装している W3C DOM API のサブセットが異なる場合があるため、サードパーティは、すべての org.w3c.dom
および org.w3c.dom.html
クラスの実装を提供する必要はありません。
com.sun.browser.dom
このセクションでは、com.sun.browser.dom
パッケージの API を定義します。
public abstract class DOMService
DOMService
が定義するサービス API は、アプリケーションに対し、document
オブジェクトへのアクセスを可能にします。この document
オブジェクトは、アプリケーションを埋め込むブラウザ window
の基盤となる DOM を表します。
|
public abstract class DOMServiceProvider
public abstract class DOMServiceProvider
のインスタンスを実装すると、指定された Java オブジェクト用の基盤となるブラウザ DOM へのアクセスが可能になります。 DOMServiceProvider
のインスタンスを、アプリケーションから直接取得してはなりません。
public abstract class DOMServiceProvider |
public interface DOMAccessor
DOMAccessor
は、ブラウザ DOM のエントリポイントにアクセスするために、DOMAction.run()
内で使用可能なインタフェースを表します。
public interface DOMAccessor |
public interface DOMAction
DOMAction
は、ブラウザの DOM で実行されるアプリケーション操作すべてをカプセル化します。
public interface DOMAction |
public class DOMUnsupportedException
この例外は、Java オブジェクトと DOM 間の関連性が見つからない場合、DOMService.getService()
および DOMServiceProvider.getDocument()
によりスローされます。
public class DOMUnsupportedException extends Exception |
public class DOMAccessException
DOMAction.run()
の内部でいずれかの DOM オブジェクトへのアクセスが行われた場合、その DOM オブジェクトが例外をスローすると、DOMService.accessAndWait()
によりこの例外がスローされます。
public class DOMAccessException extends Exception |