首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2EE 系統整合 ActiveX 列印元件:Java Applet 與 Cell 插件跨技術協作實戰

     編輯:Java 相關知識

專案背景

某資訊系統採用 Java Applet 呈現豐富客戶端介面,但 Java 列印 API 功能薄弱,難以輸出複雜單據報表。方案:在網頁內嵌隱藏的 ActiveX 控件——華表 Cell 插件(類 Excel 試算表元件),Applet 透過 JavaScript 橋接器將資料與格式推送給 Cell,由 Cell 負責分頁預覽與列印。

技術棧關鍵點

層級技術角色
表示層Java Applet (Swing)業務邏輯、資料收集、使用者互動
橋接層JavaScript + netscape.javascript.JSObjectApplet ↔ DOM ↔ ActiveX 通訊
列印層Cell ActiveX (CellPlugin.ocx)儲存格級排版、分頁、列印預覽、匯出 Excel/PDF

一、Applet 呼叫 JavaScript 與 ActiveX

1. 環境準備

  • JDK jre/lib/jaws.jar 加入 classpath(提供 netscape.javascript.JSObject)。
  • HTML <OBJECT> 標籤載入 Applet,設定 ID="MyPlugin"。

2. Applet → JavaScript → ActiveX 呼叫鏈

// Applet 端
import netscape.javascript.JSObject;

public class MyApplet extends Applet {
    public void init() {
        JSObject win = JSObject.getWindow(this);          // 取得 window
        JSObject doc = (JSObject) win.getMember("document"); // 取得 document
        win.call("callCellMethod", new Object[]{"SetCellString", 
            new Object[]{new Integer(1), new Integer(1), new Integer(0), "Hello Cell"}});
    }
}

3. JavaScript 橋接函數

<script language="JavaScript">
function callCellMethod(methodName, params) {
    // 取得隱藏的 Cell 控件
    var cell = document.all("DCellWeb1"); 
    // 動態呼叫 Cell 方法
    return cell[methodName].apply(cell, params);
}
</script>

4. HTML 內嵌隱藏 Cell 控件

<OBJECT classid="clsid:3F166327-8030-4881-8BD2-EA25350E574A"
        id="DCellWeb1" style="HEIGHT: 0px; WIDTH: 0px">
  <PARAM NAME="_Version" VALUE="65536">
  <PARAM NAME="_ExtentX" VALUE="14902">
  <PARAM NAME="_ExtentY" VALUE="6075">
  <PARAM NAME="_StockProps" VALUE="0">
</OBJECT>

二、JavaScript 呼叫 Applet(反向)

<!-- Applet OBJECT 標籤需有 ID -->
<OBJECT ID="MyPlugin" ...> ... </OBJECT>

<input type="button" value="觸發 Applet" 
       onClick="document.MyPlugin.appletMethod()" />

Applet 需宣告 public void appletMethod(),JavaScript 直接呼叫 document.MyPlugin.appletMethod()。

三、系統運行架構

[Client Browser]
  ├─ Java Applet (UI, Business Logic)
  │     │  JSObject.call("callCellMethod", ...)
  │     ▼
  ├─ JavaScript Bridge (callCellMethod -> cell.SetCellString)
  │     │
  │     ▼
  ├─ Cell ActiveX (Hidden) --> Print Preview / Print / Export Excel
  │
  └─ Servlet / EJB (Backend Data)

四、關鍵代碼封裝:Applet 通用橋接類

public class BridgeApplet extends JApplet {
    private JSObject win, cell;

    public Object callCellMethod(String name, Object[] params) {
        return getCell().call(name, params);
    }
    public Object callJavaScript(String name, Object[] params) {
        return getJSWin().call(name, params);
    }
    private JSObject getCell() {
        if (cell == null) {
            JSObject doc = (JSObject) getJSWin().getMember("document");
            JSObject all = (JSObject) doc.getMember("all");
            cell = (JSObject) all.call("item", new Object[]{"DCellWeb1"});
        }
        return cell;
    }
    private JSObject getJSWin() {
        if (win == null) win = JSObject.getWindow(this);
        return win;
    }
}

業務 Applet 繼承 BridgeApplet,即可直接呼叫 callCellMethod("SetCellString", new Object[]{col, row, page, value})。

五、優缺點與現代替代方案

優點缺點
複雜報表排版零代碼(Cell 類 Excel 介面設計)僅限 Windows + IE(ActiveX 架構)
Applet 專注業務,列印邏輯完全外包客戶端需安裝 OCX,簽名與安全策略維護成本高
支援匯出 Excel/PDF/圖片多種格式Java Applet 已被瀏覽器淘汰(Chrome 45+ 移除 NPAPI)

現代化替代建議

  • 前端渲染 + 列印:Vue/React + print.js / html2canvas / jspdf 客戶端生成 PDF 列印。
  • 後端生成 PDF:iText / Apache PDFBox / Flying Saucer 伺服端渲染 PDF,前端 window.print() 或下載。
  • WebAssembly:將 C++ 排版引擎編譯為 WASM,瀏覽器內高效能排版。

總結

「Applet + JavaScript + ActiveX」是早期企業級 Web 系統跨技術整合的典型模式。核心在於 netscape.javascript.JSObject 打通 Java ↔ JavaScript,再由 JavaScript 操作 DOM 中的 ActiveX 物件。雖技術棧已過時,但「表現與資料分離」、「輕量級橋接器」、「專業工具做專業事」的架構思想仍值得借鑑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved