在 Web 早期,Java Applet 提供強大圖形/運算能力,JavaScript 擅長 DOM 操作與事件響應。兩者結合可實現「JavaScript 做協調,Applet 做重活」的混合架構。雖 Applet 已退役,但其跨語言互操作模式(如 JS 呼叫 Java、Java 回呼 JS)在 WebAssembly、JavaFX WebView、Electron 混合應用中依然具參考價值。
瀏覽器提供 document.appletName 存取 Applet 的 public 欄位與方法。前提:成員必須宣告為 public。
public class HelloWorld1 extends Applet {
public String text = "Hello World!"; // 必須 public
public void paint(Graphics g) { g.drawString(text, 20, 20); }
}
<applet code="HelloWorld1.class" width="100" height="28" name="app"></applet>
<input type="button" value="請點擊這裡" onclick="SetText()">
<script>
function SetText() {
document.app.text = "世界你好!"; // 直接改欄位
document.app.repaint(); // 必須手動觸發重繪
}
</script>
repaint())public class HelloWorld2 extends Applet {
private String text = "Hello World!"; // 封裝為 private
public void paint(Graphics g) { g.drawString(text, 20, 20); }
// 對外開放的安全介面
public void setString(String newText) {
this.text = newText;
repaint(); // 內部自動處理重繪
}
}
<applet code="HelloWorld2.class" width="100" height="28" name="app"></applet>
<script>
function SetText() {
document.app.setString("世界你好!"); // 呼叫方法,無需手動 repaint
}
</script>
需引入 plugin.jar (JRE/lib) 或 deploy.jar,使用 netscape.javascript.JSObject:
import netscape.javascript.JSObject;
public class CallerApplet extends Applet {
public void callJS() {
JSObject window = JSObject.getWindow(this);
// 呼叫全域 JS 函數
window.call("javaCallback", new Object[] {"來自 Java 的訊息"});
// 存取 JS 物件屬性
window.setMember("javaData", new String[] {"A", "B", "C"});
// 執行 JS 代碼片段
window.eval("console.log('Java 執行 JS 代碼')");
}
}
<script>
function javaCallback(msg) { alert("Java 說:" + msg); }
</script>
<applet code="CallerApplet.class" name="caller" mayscript="true"></applet>
<button onclick="document.caller.callJS()">觸發 Java 回呼 JS</button>
關鍵屬性:<applet mayscript="true"> 必須啟用腳本權限。
| Java 類型 | JavaScript 類型 | 說明 |
|---|---|---|
| String | String | 直接對應 |
| 基本型別 (int, double, boolean) | Number, Boolean | 自動裝箱/拆箱 |
| Java 陣列 | JS Array | 如 String[] → ["a","b"] |
| Java 物件 | JS Object | 僅暴露 public 成員 |
| null | null |
| 技術 | JS↔Java 互操作方式 | 適用場景 |
|---|---|---|
| JavaFX WebView | JSObject / WebEngine.executeScript() | 桌面應用嵌入 Web |
| WebAssembly (WASM) | JS import/export 函數 | 高效能 Web 計算 |
| Electron + Java 子進程 | IPC (stdin/stdout/socket) | 桌面應用重邏輯分離 |
| Spring Boot + REST/gRPC | HTTP/JSON 或 Protobuf | 微服務架構 |
repaint())JSException,Java 回呼 JS 用 try-catch 包裹 eval/callJavaScript 與 Java Applet 的互操作曾是富客戶端開發的標配。理解其「封裝介面、雙向呼叫、權限模型」核心模式,有助於掌握現代混合技術棧 (WebAssembly、JavaFX、Electron) 中的跨語言協作精髓。技術棧更迭,工程思想永存。