三種互通模式總覽
| 方向 | 技術基礎 | 適用場景 | 瀏覽器支援 |
| JS → Java 靜態方法 | LiveConnect (Netscape 專有) | 呼叫 java.lang.System 等系統 API | 僅舊版 Netscape |
| JS → Applet 公開方法 | DOM document.applets[name] 或 document.getElementById() | 控制 Applet 狀態、傳遞參數 | 所有支援 Java 的瀏覽器 |
| Applet → JS | LiveConnect netscape.javascript.JSObject | 操作 DOM、呼叫 JS 函式、存取表單資料 | 需 MAYSCRIPT 屬性 |
模式一:JavaScript 呼叫 Applet 公開方法
前置條件
- Applet 類別宣告為
public
- 欲暴露的方法宣告為
public
<APPLET> 標籤設定 name 屬性
實作範例
<html>
<head>
<script>
function accessApplet() {
var applet = document.testText; // 對應 name="testText"
setTimeout(() => applet.setText('I like JavaScript!'), 1000);
setTimeout(() => applet.setText('I like JavaScript and Java!'), 2000);
setTimeout(() => applet.setText('I like Java!'), 3000);
setTimeout(accessApplet, 4000);
}
</script>
</head>
<body onload="accessApplet()">
<applet code="TestText.class" name="testText" width="450" height="150"></applet>
</body>
</html>
// TestText.java
import java.applet.Applet;
import java.awt.Graphics;
public class TestText extends Applet {
private String text = "";
public void setText(String s) { // 必須 public
text = s;
repaint();
}
public void paint(Graphics g) {
g.drawString(text, 20, 50);
}
}
模式二:Applet 呼叫 JavaScript (LiveConnect)
必要設定
<applet code="ReadForm.class" width="200" height="100"
name="readApp" MAYSCRIPT> <!-- 關鍵屬性 -->
</applet>
Applet 端實作
import netscape.javascript.JSObject;
import netscape.javascript.JSException;
public class ReadForm extends Applet {
public void init() {
try {
JSObject window = JSObject.getWindow(this); // 取得 window 物件
JSObject doc = (JSObject) window.getMember("document");
JSObject form = (JSObject) doc.getMember("textForm");
JSObject field = (JSObject) form.getMember("textField");
String value = (String) field.getMember("value"); // 讀取輸入框值
window.eval("alert('This alert comes from Java!')"); // 呼叫 JS 函式
} catch (JSException e) { e.printStackTrace(); }
}
}
JSObject 主要方法
| 方法 | 功能 |
| getWindow(Applet) | 取得包含 Applet 的瀏覽器視窗物件 |
| getMember(String) | 取得 JS 物件屬性/子物件 |
| setMember(String, Object) | 設定 JS 物件屬性 |
| call(String, Object[]) | 呼叫 JS 函式/方法 |
| eval(String) | 執行 JS 程式碼字串 |
| removeMember(String) | 移除 JS 物件屬性 |
| getSlot(int) | 取得陣列元素 |
| setSlot(int, Object) | 設定陣列元素 |
HTML 表單配合範例
<form name="textForm">
<input type="text" name="textField" size="20">
</form>
安全性與限制
- 同源政策:Applet 僅能存取同網域頁面的 JS 物件
- 權限檢查:未簽署 Applet 呼叫 JS 需
MAYSCRIPT,簽署 Applet 仍受沙箱限制
- 例外處理:JS 執行錯誤會拋出
JSException,必須捕獲處理
- 執行緒:JS 呼叫發生於 Applet 事件執行緒,避免長時間阻塞
現代替代架構
Java Applet 技術已被瀏覽器淘汰,現代 Web 開發建議:
- Java 後端 + REST/gRPC API:Spring Boot、Quarkus、Micronaut
- 前端框架:React、Vue、Angular、Svelte
- WebAssembly:透過 TeaVM、GWT、CheerpJ 將 Java 編譯為 WASM
- JavaFX WebView:桌面應用內嵌 Web 引擎雙向通訊