注:この Java Plug-in ガイドでは、Java SE 6 update 10 リリースより前にリリースされた機能について説明します。最新情報については、Java Rich Internet Application の開発および配備を参照してください。
このセクションでは、次のトピックについて説明します。
Java Plug-in は、2 つの方法で DOM にアクセスできます。1 つは JSObject
を、もう 1 つは共通 DOM API を介してアクセスを行う方法です。それぞれの方法およびセキュリティー上の考慮事項について、次で説明します。
JSObject
Java アプレットは、Document Object Model (DOM) にアクセスしたり、HTML ページ上で JavaScript 関数を呼び出したりするために、Java から JavaScript への通信が必要な場合があります。ブラウザを使用すると、Java ラッパークラス netscape.javascript.JSObject
を介した Java と JavaScript との間の通信が可能になります。詳細は、「Java Packages for LiveConnect」を参照してください。
ブラウザ間で JavaScript レンダリングエンジンの実装が異なるため、Java Plug-in が提供する JSObject
サポートは、Internet Explorer と Navigator で異なります。このドキュメントでは、異なるブラウザ環境で JSObject
サポートがどのように機能するかを説明します。
JSObject
のしくみJSObjec
t を利用すると、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()
public boolean equals(Object obj)
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.4.2 以降は、JAR ファイル plugin.jar
内に netscape.javascript が含まれています。JSObject
を使用するアプレットをコンパイルするには、コンパイルする前に、CLASSPATH
に plugin.jar
を追加する必要があります。
JSObject
は、Java Plug-in ではサポートされますが、Java SE プラットフォームの AppletViewer ではサポートされません。このため、JSObject
を使用するアプレットは、AppletViewer では動作しないか、例外が発生します。
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
タグの使用」を参照してください。
JavaScript および LiveConnect は、Netscape Communications Corporation のテクノロジです。Mozilla および Microsoft で実装される Javascript エンジンが異なっているため、LiveConnect を使用した Java と JavaScript 間のデータ整列化によって、ブラウザ間で異なるデータ型が生成されることがあります。ベンダー間での JavaScript 実装の主な相違点は、JavaScript データ型のサポート、Java と JavaScript 間でのデータ型のマッピング、および DOM 要素の実装です。
注:JavaScript のオリジナル仕様は、http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/guide/index.html から入手できます。 LiveConnect のオリジナル仕様は、http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/guide/lc.html#1037078 から入手できます。 |
このセクションでは、Java Plug-in 6 の共通 DOM API について説明します。この API は、さまざまなプラットフォームで稼動する異なるブラウザベンダーのブラウザに対して、ブラウザ内の DOM にアクセスするための標準 API を提供します。
注:Internet Explorer 6 とサポートされている Mozilla ではフルサポートされています。ほかのブラウザでのサポートは制限されています。 |
この 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(MyApplet); 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 は、アプリケーションに対し、アプリケーションを埋め込むブラウザ window
の基になる DOM を表す document
オブジェクトへのアクセスを可能にします。
|
上記の getService(Object obj)
メソッド内の Object obj
は、アプレットまたは Bean です。
public abstract class DOMServiceProvider
public abstract class DOMServiceProvider
のインスタンスを実装すると、指定された Java オブジェクト用の基になるブラウザ DOM へのアクセスが可能になります。DOMServiceProvider
のインスタンスを、アプリケーションから直接取得しないでください。
public abstract class DOMServiceProvider |
上記の canHandle(Object obj)
および getDocument(Object obj)
メソッド内の Object obj
は、アプレットまたは Bean です。
public interface DOMAccessor
DOMAccessor
は、ブラウザ DOM のエントリポイントにアクセスするために、DOMAction.run()
内で使用可能なインタフェースを表します。
public interface DOMAccessor |
上記の getDocument(Object obj)
内の Object obj
は、アプレットまたは Bean です。
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 |