HTMLに組み込む
JavaScriptの最大の利点は、多くのブラウザが標準でJavaScriptを実装しているという事実です。そのため、開発者はHTML内に直接JavaScriptをコーディングして実行することができます。また、利用者にとってはJavaScriptが使われていても、標準のHTMLページのまま違和感なく利用できることも大きな利点です。
現在のWebモジュールにとってHTMLページとの親和性は極めて重要です。JavaScriptではありませんが、例えばYouTubeの動画サービスがHTMLに組み込めるという点は革新的です。動画を再生するために新しいウィンドウを表示して専用プレイヤーで再生するユーザー・インターフェイスと比べてください。YouTubeスタイルの動画配信サービスは、ユーザーには別のモジュールを起動したり、利用しているという感覚を与えません。このスタイルは、Soapboxやニコニコ動画など、多くの動画配信サービスに影響を与えています。
では、Javaアプレットはどうでしょうか。Javaアプレットは最初からHTMLページに組み込むことが前提となっているため、Flashと同じようにHTML文書の特定の場所に埋め込むことができます。まずは、Javaアプレット未経験の方や、忘れてしまったという方のために、簡単なアプレットのサンプルを作って実行方法を確認しましょう。
昔、HTMLにアプレットを組み込むにはappletという専用の埋め込み要素が使われていました。しかし、XHTML 1.0 strictではapplet要素は認められておらず、Transitional、Framesetでも扱いは非推奨です。こうしたHTMLに対する外部リソースの組み込みについて、現在ではobject要素を使うことが推奨されています。しかし、object要素からのアプレットの実行はブラウザ間に互換性がないため、XHTMLに完全に準拠しなければならない場合を除けばapplet要素を使うというのも選択肢です。
事実上、Internet Explorerはobject要素でアプレットを起動することができますが、Firefoxなど他のブラウザではInternet Explorer用のobjectを認識せず、代わりに伝統的に使われてきたembed要素でアプレットを起動します。
通常、インターネット上で公開するアプレットに対しては伝統的に使われてきたapplet要素を使うべきです。applet要素からアプレットを起動するには、HTMLファイル内のアプレットを表示させたい場所に、次のようなコードを書き加えます。
<applet code="クラスファイルのURI" width="幅" height="高さ"></applet>
code
属性に、表示するクラスファイルのアドレスを指定します。このクラスファイルがアプレットとして実行されますが、アプレットとして実行可能なクラスはjava.applet.Applet
クラスを継承していなければなりません。
なお、本稿のサンプルはJava Runtime Environment(JRE) Version 6 Update 1がインストールされている環境で、Internet Explorer 7、Firefox 2.0.0.3で動作確認をしています。サンプルを実行するにはJRE 1.6.0以降がシステムにインストールされていなければなりません。最新のJREは、SunのWebサイトからダウンロードすることができます。
インストール方法やブラウザのアドオン設定などについては、それぞれのブラウザのヘルプを参照してください。
import javax.swing.*; public class Test extends JApplet { public void init() { JLabel label = new JLabel("Kitty on your lap"); getContentPane().add(label); } }
<html> <head> <title>sample</title> </head> <body> <applet code="Test.class" width="400" height="200"></applet> </body> </html>
sample00の「Test.java」をコンパイルし、生成されたクラスファイルをHTMLファイルから参照してアプレットとして表示してください。「applet.html」はapplet
タグを書いてアプレットを表示しているため、Internet ExplorerでもFirefoxでも同じように表示することができます。また、古いブラウザでも対応している利点があります。
object要素を利用する場合、ブラウザ間の互換性に注意しなければなりません。次のobject
タグはInternet Explorer系のブラウザで動作しますが、FirefoxなどGecko系ブラウザでは表示されません。
<object width="幅" height="高さ" classid="clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA"> <param name="code" value="クラスファイルのURI" /> </object>
object要素のclassid
属性には、使用するJava Plug-inを識別する定められた値を渡します。この値の形式は、常に"clsid:CAFEEFAC-xxxx-yyyy-zzzz-ABCDEFFEDCBA"という形になり、xxxx、yyyy、zzzzという部分にバージョンを表す番号が入ります。0016-0000-0000は、1.6.0を表しています。この場合、JRE 1.6.0以上のバージョンをブラウザに要求します。
object要素にはparam子要素で任意のパラメータを設定します。このパラメータの内容は、object要素に使われるアドオンやプログラムに依存します。name
属性にパラメータの名前を指定し、value
属性に、指定した名前のパラメータに関連付ける値を指定します。プログラムは、HTMLから指定されたこのパラメータを受け取ることができます。object要素を用いた場合、code
パラメータに実行するクラスファイルのURIを指定します。
Firefoxなど、Internet Explorer以外のブラウザで表示させたい場合、Javaのドキュメントではobject要素内にcomment子要素をおいて、この中にembed
タグを書くことを推奨しています。
<embed code="クラスファイルのURI" width="幅" height="高さ" type="application/x-java-applet"></embed>
基本的にapplet要素と同じですがtype
属性にアプレットのMIMEタイプを指定しなければなりません。Javaのドキュメントでは、バージョンも合わせて"application/x-java-applet;jpi-version=1.6.0"と書かれていましたが、本書執筆時点の最新のFirefoxではプラグインを認識しなかったため外しています。
この場合、Internet Explorerであればobject要素が認識されcomment子要素以下は無視し、Firefoxなどではobject要素が認識されず、comment内のembed要素が認識されることになります。
ただし、applet要素がXHTML strictに準拠しないという利用でobject要素を使う場合、commentやembedを使ってしまうと結局XHTMLに準拠しない形となってしまいます。当面は、XHTMLでは非推奨ながらも互換性の高いapplet要素を使うべきでしょう。
<html> <head> <title>sample</title> </head> <body> <p><object width="400" height="200" classid="clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA"> <param name="code" value="Test.class" /> <comment> <embed code="Test.class" width="400" height="200" type="application/x-java-applet"/></embed> </comment> </object></p> </body> </html>
sample00には、「applet.html」のほかに「object.html」ファイルがあります。こちらは、同じTest.class
クラスファイルをobject
タグまたはembed
タグで表示します。筆者の場合、 Windows XPのIE 7では表示されましたがWindows VistaのIE 7では表示されませんでした。object要素はXHTMLで推奨されているものの現実的には使い難い状況にあります。
アプリケーション・サーバがコンテンツのヘッダを自動生成し、XHTML strictに固定されているという場合、完全に準拠する方法は難しいものです。JavaScriptなどでアプレットを表示する新しいウィンドウを生成し、そこでXHTML Transitionalでapplet要素を使うという方法などの回避策が必要になるでしょう。もしくは、ブラウザ判定で出力するHTMLを分けるというような方法もあります。
Javaアプレットを表示するタグについてはこちらのドキュメントも参考にしてください。
パラメータを受ける
applet要素の子要素にparam要素を指定することで、HTMLからアプレットにパラメータを渡すことができます。使い方によっては、これは非常に柔軟で強力なアプレットを作り出すことができます。パラメータの情報から状況に応じた動きをする汎用性の高いアプレットを開発すれば、再コンパイルをすることなくアプレットの振る舞いを操作することができます。
加えて、古い時代のWebは静的なHTMLが中心でしたが、現在はアプリケーション・サーバーやWebサービス、データベースなどを組み合わせた動的なWebの時代です。サーバー側スクリプトでHTMLを動的に生成し、アプレットに渡すパラメータを自由に操ることも可能です。この方法であれば、アクセスしてきたユーザーごとに異なる実行結果を実現できます。
import javax.swing.*; public class Test extends JApplet { public void init() { String text = getParameter("text"); if (text == null) text = "パラメータ \"text\" が指定されていません"; JLabel label = new JLabel(text); getContentPane().add(label); } }
<html> <head> <title></title> </head> <body> <applet code="Test.class" width="400" height="200"> <param name="text" value="ごきげんよう" /> </applet> </body> </html>
sample01でアプレットに表示される文字列はHTMLのparam要素から渡したパラメータに従っています。そのため、アプレットを再コンパイルすることなく、表示する文字列をHTMLから変更することができます。
このサンプルはあまりにも単純ですが、この仕組みを使ってプログラム内の肝となるデータや振る舞いの大部分を変数化すれば、HTMLからアプレットを制御することができそうです。究極的には、Javaの内部にスクリプト言語のインタプリンタを実装することで、テキストから完全にアプレットを操作することも可能です。その方法については後述します。