Macromedia (後為 Adobe 併購) Flash Player 擁有 98%+ 瀏覽器滲透率、啟動近乎即時、原生支援向量圖形/動畫/影音,若能直接呼叫 J2EE 後端業務邏輯,將兼具「零安裝部署」與「豐富互動體驗」。Flash Remoting MX 正是為此而生。
+----------------+ AMF over HTTP +-------------------------+
| Flash Client | <---------------------> | J2EE App Server |
| (ActionScript)| NetServices/Gateway | (Servlet/JSP/EJB/POJO) |
+----------------+ +-------------------------+
flashgateway.war),接收 AMF 封包,反序列化為 Java 物件,呼叫目標服務,將回傳值序列化為 AMF 回應。
// 1. 載入 NetServices 庫 (編譯期包含)
#include "NetServices.as"
// 2. 設定閘道 URL (對應 web.xml servlet-mapping /gateway)
NetServices.setDefaultGatewayUrl("https://localhost:8080/myapp/gateway");
// 3. 建立閘道連線
var gatewayConn = NetServices.createGatewayConnection();
// 4. 取得遠端服務代理 (對應 Java 類別完整名稱)
var userService = gatewayConn.getService("com.example.service.UserService", this);
// 5. 非同步呼叫方法,指定回調函數
userService.getUserById(123);
// 6. 回調函數命名慣例:方法名 + "_Result"
function getUserById_Result(userVO) {
trace("收到用戶: " + userVO.name + ", email: " + userVO.email);
// 更新 UI 元件...
}
// 7. 錯誤回調 (可選)
function getUserById_Status(error) {
trace("呼叫失敗: " + error.code + " - " + error.description);
}
package com.example.service;
public class UserService {
public UserVO getUserById(int id) {
// 呼叫 DAO/EJB/Spring Bean 取得資料
UserDAO dao = new UserDAO();
UserPO po = dao.findById(id);
if (po == null) return null;
// 轉換為傳輸物件 (VO) - 必須為 public 屬性或 getter/setter
UserVO vo = new UserVO();
vo.id = po.getId();
vo.name = po.getName();
vo.email = po.getEmail();
return vo;
}
}
// 傳輸物件 (Value Object) - 需實作 Serializable 或 public 欄位
package com.example.vo;
public class UserVO {
public int id;
public String name;
public String email;
}
Flash 原生支援 XML 解析與 DOM 操作,適合圖表、報表等資料密集型視覺化。
// 伺服器端產生 XML 文件 (ActionScript 可直接解析)
public XML getSalesChartData() {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("chart");
root.setAttribute("caption", "月銷售趨勢");
root.setAttribute("xAxisName", "月份");
root.setAttribute("yAxisName", "金額(萬)");
String[] months = {"Jan","Feb","Mar","Apr","May","Jun"};
int[] values = {42, 38, 55, 60, 48, 72};
for (int i=0; i
// 客戶端解析 XML 並繪製圖表 (使用免費 ActionScript 圖表庫)
function getSalesChartData_Result(xmlDoc) {
var nodes = xmlDoc.firstChild.childNodes; // 列表
var categories = [], series = [];
for (var i=0; i
| 維度 | Flash Remoting | JSP/HTML | Swing/Applet |
|---|---|---|---|
| 部署門檻 | 極低 (Flash Player 普及) | 極低 | 高 (需 JRE) |
| 互動豐富度 | 高 (向量圖形/動畫/影音) | 中 (受限 HTML/JS) | 高 |
| 客戶端運算分擔 | 是 (XML解析/圖表渲染在客戶端) | 否 (伺服器端渲染) | 是 |
| 資料傳輸效率 | 高 (AMF 二進制) | 低 (HTML/JSON) | 中 (RMI/序列化) |
| 後端整合 | 無縫 (POJO/EJB/Spring/JMS) | 原生 | 原生 |
| 安全性 | JVM SecurityManager + HTTPS | 標準 Web 安全 | JVM SecurityManager |