Flash Remoting 讓 Flash/Flex 客戶端透過 AMF 協議直接呼叫伺服端 Java 服務(Servlet、POJO、EJB),實現富客戶端與商業邏輯的無縫整合。本文以 JRun 4 應用伺服器為環境,示範從 Servlet 部署、Gateway 設定到 Flash ActionScript 2.0 呼叫的完整流程。
| 元件 | 版本/規格 |
| 應用伺服器 | JRun 4 (內建 default server) |
| Flash Remoting | Components AS 2.0 |
| 開發工具 | Flash MX 2004 Professional |
| Gateway URL | https://localhost:8100/flashservices/gateway |
二、JRun 4 部署配置步驟
2.1 註冊 Servlet:web.xml
編輯 C:\jrun4\servers\default\default-ear\default-war\WEB-INF\web.xml,在 <web-app> 內新增:
<servlet>
<servlet-name>MyServlet</servlet-name>
<display-name>MyServlet</display-name>
<description>This is a servlet of H2O</description>
<servlet-class>MyServlet</servlet-class>
</servlet>
2.2 部署 Servlet 類別檔
將編譯後的 MyServlet.class 放置於 WEB-INF/classes/ 目錄。
2.3 Servlet 實作:MyServlet.java
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
private String message = null;
public void init(ServletConfig config) throws ServletException {
message = "Hello from MyServlet";
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// 關鍵:將回傳值放入 FLASH.RESULT 屬性,Flash Remoting 會自動序列化回傳
request.setAttribute("FLASH.RESULT", message);
}
public String getServletInfo() { return "A test servlet."; }
public ServletConfig getServletConfig() { return null; }
public void destroy() { message = null; }
}
三、Flash MX 2004 ActionScript 2.0 呼叫端
import mx.remoting.NetServices;
import mx.remoting.Connection;
NetServices.setDefaultGatewayUrl("https://localhost:8100/flashservices/gateway");
var gatewayConnection = NetServices.createGatewayConnection();
// 服務名稱對應 Servlet 名稱 (MyServlet),第二參數為回應處理物件 (this)
var flashTestService = gatewayConnection.getService("MyServlet", this);
// 呼叫遠端服務 (對應 Servlet.service() 方法)
flashTestService.MyServlet();
// 回呼函數:方法名_Result 對應遠端方法名
function MyServlet_Result(result) {
var users = result;
trace(users); // 輸出: Hello from MyServlet
}
四、核心機制解析
| 環節 | 說明 |
| Gateway | JRun 內建 Flash Remoting Gateway,接收 AMF 請求、路由至對應服務、序列化回傳 |
| 服務對應 | getService("MyServlet", this) 中的服務名稱對應 web.xml 的 <servlet-name> |
| 方法映射 | Flash 呼叫 flashTestService.MyServlet() → Gateway 呼叫 Servlet service() 方法 |
| 回傳值傳遞 | Servlet 在 request.setAttribute("FLASH.RESULT", value) 設定回傳值,Gateway 自動偵測並序列化為 AMF 回傳 |
| 回呼命名慣例 | 遠端方法名_Result(result) 自動對應非同步回應處理 |
五、常見問題與除錯
| 現象 | 可能原因 | 解決方向 |
| Connection failed / Gateway 不可達 | JRun 未啟動、Port 8100 被佔用、防火牆阻擋 | 檢查 JRun 服務、netstat -an | findstr 8100、防火牆例外 |
| Service not found: MyServlet | web.xml 未註冊、Servlet 類別名稱錯誤、部署路徑錯誤 | 驗證 web.xml、確認 MyServlet.class 在 WEB-INF/classes |
| 呼叫無回應 / trace 無輸出 | Servlet 未設定 FLASH.RESULT、拋出未捕獲異常 | 檢查 service() 實作、JRun 日誌、Flash 輸出面板 |
| 中文亂碼 | AMF 編碼與 Servlet 回傳編碼不一致 | 確保 Servlet 回傳 UTF-8、Flash 系統編碼設定 |
六、擴展:從 Servlet 遷移至 POJO / CFC / EJB
Flash Remoting 支援多種伺服端服務類型,部署方式略有不同:
- POJO:將類別放入
WEB-INF/classes/ 或 WEB-INF/lib/,Gateway 自動偵測公開方法
- CFC (ColdFusion Component):放置於 ColdFusion 應用目錄
- EJB:需配置 JNDI 查找、Home/Remote 介面
- Spring Bean:整合 Spring-Flex / BlazeDS 專案
七、歷史背景與現代替代方案
本文技術基於 Flash Player 7/8 時代 (2004-2006),ActionScript 2.0、JRun 4、Macromedia Flash Remoting。現代替代方案:
- BlazeDS / GraniteDS:開源 AMF 實作,整合 Spring、Java EE
- Adobe LiveCycle Data Services:商業版支援 RTMP、資料管理服務
- REST/JSON + HTTP:通用標準,取代 AMF 成為主流
- WebSocket / Server-Sent Events:即時雙向通訊
- GraphQL:靈活查詢、單一端點
八、結語
Flash Remoting 在 RIA 發展歷史上佔有重要地位,實現了 Flash 客戶端與 Java 後端的高效二進位通訊。雖然 Flash 生態已隨 Adobe 終止支援而退出歷史舞台,但其「Gateway 路由 + 自動序列化 + 非同步回呼」的架構模式,深深影響了後續的 BlazeDS、Spring Flex、甚至現代 GraphQL Gateway 的設計哲學。理解此經典整合模式,有助於掌握富客戶端與後端服務解耦的核心思想。
- 上一篇文章: J2SE API 讀取 Properties 設定檔的六種標準方式完整指南
- 下一篇文章: Rails、OpenLaszlo 與 Eclipse 打造富網際網路應用 (RIA) 完整開發指南
Copyright ©
程式碼之家 All Rights Reserved