サーバーにリクエストする
ネットワークから直接実行されるJavaアプレットは、ローカルディスク上のファイルに対して入出力を行うことはできません。当然、悪意あるプログラムからクライアントを守るためです。このセキュリティはサンドボックスと呼ばれ、アプレットはサンドボックス内で動作します。その代り、アプレットを配信したサーバーのドメインに対してHTTPリクエストを送信することは可能です。JavaScriptにおけるXmlHttpRequest
のように、自身を配信したサーバーと通信することができます。
つまり、Javaアプレットは必要に応じて自分自身を配信したサーバーに問い合わせ、必要なファイルや情報を取得することができます。ユーザーの入力や要求に応じてサーバーに接続し、新しいコンテンツをダウンロードして表示したり、データをサーバにアップロードすることが可能です。そのため、Ajaxと同じアプローチでページ遷移が発生しないサイトをデザインすることができます。
import java.io.*; import java.net.*; import javax.swing.*; public class Test extends JApplet { public void init() { String text = ""; String paramURL = getParameter("url"); if (paramURL == null) text = "URL が指定されていません"; else try { URL url = new URL(getDocumentBase(), paramURL); InputStream stream = url.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); while(true) { String line = reader.readLine(); if (line == null) break; text += line; } reader.close(); stream.close(); } catch(Exception err) { text = err.toString(); } getContentPane().add(new JLabel(text)); } }
<html> <head> <title>sample</title> </head> <body> <applet code="Test.class" width="400" height="200"> <param name="url" value="test.txt" /> </applet> </body> </html>
sample02は、アプレットと同じディレクトリに配置されている「test.txt」ファイルを読み込み、アプレットに表示するというプログラムです。テキストファイルは、アプレットがブラウザ上で実行されたときに動的に読み込んでいます。読み込むファイルのアドレスは、HTMLファイルのparam要素で指定されたurlという名前のパラメータで指定しています。そのため、読み込むファイルのアドレス自身も実行時に動的に決定されます。
このサンプルで読み込んでいるのは単純なテキストファイルですが、サーバー側スクリプトで動的に生成されるデータなどを要求すれば、アプレットの可能性が広がります。サーバー側スクリプトがクエリに従ってデータベースに問い合わせ、その結果をアプレットに返すといった方法が考えられます。こうすれば、アプレットは小さなJavaプログラムでありながら、膨大なデータベースの情報を背景に動作することになります。
JavaとJavaScriptの関係
さらに強力なアプレットの構築方法に、HTML内のJavaScriptとの連携があります。JavaScriptからJavaアプレットが公開するメソッドに簡単にアクセスすることができるため、文字列などの基本的な情報であればJavaとJavaScriptとの間でも交換することができます。
例えば、Swingによるユーザーインターフェイスの構築は煩雑なので、簡単なフォームをHTML+JavaScriptで構築し、入力された情報をアプレットに渡して処理するといった利用方法があります。JavaアプレットではJava標準クラスライブラリが提供する多くの優れた機能を使うことができるため、限られたJavaScript内では難しい処理も、比較的容易に実現することができます。画像の変換処理など、JavaScript単体ではできない高度なグラフィックス制御などでアプレットが役立つでしょう。
import javax.swing.*; public class Test extends JApplet { private JLabel label; public void init() { label = new JLabel("テキストを入力してください"); getContentPane().add(label); } public void setText(String text) { label.setText(text); } public String getText() { return label.getText(); } }
<html> <head> <title>sample</title> <script type="text/javascript"> function okClick(event) { var appletText = document.getElementById("text"); var inputMessage = document.getElementById("message"); appletText.setText(inputMessage.value); alert(appletText.getText()); } function getClick(event) { var appletText = document.getElementById("text"); var spanLabel = document.getElementById("label"); spanLabel.innerHTML = appletText.getText(); } </script> </head> <body> <applet id="text" code="Test.class" width="400" height="200"> </applet> <p> <input type="text" id="message" /> <input type="button" value="OK" onclick="okClick();" /> </p> <p> <span id="label">アプレットのテキストを表示します</span> <input type="button" value="取得" onclick="getClick();" /> </p> </body> </html>
sample03のHTMLファイルを表示すると、アプレットの下部にテキストボックスとボタンが表示されています。テキストボックスに任意のテキストを入力して[OK]ボタンを押すと、テキストがアプレットに転送され、表示されることを確認できます。
また[取得]ボタンを押すと、現在アプレットに設定されているテキストがspan要素の内容として表示されます。これは、アプレットのgetText()
メソッドを呼び出して、アプレットからデータを取得しています。
Javaアプレットは高度な機能と自由度の高いグラフィックス機能を持ち合わせていますが、その一方でHTMLとの親和性が低く、書式付の文書を表示するには適していません。そこで、文書の表示に適しているHTML+JavaScriptの組み合わせとアプレットを通信させ、それぞれのメリット、デメリットを補い合うという方法です。