Flex + Java 整合开发全教程
第一部分:核心概念与准备工作
在开始编码之前,我们需要理解几个核心概念和准备好开发环境。

1 什么是 Flex 和 Java?
- Flex (前端/客户端): Flex 是一个用于构建富互联网应用程序的免费开源框架,它使用 ActionScript 3.0 (一种基于 ECMAScript 的语言) 和 MXML (一种基于 XML 的标记语言) 来创建用户界面,Flex 应用最终被编译成 SWF 文件,在 Flash Player 或 AIR (Adobe Integrated Runtime) 中运行,它擅长创建具有流畅动画、复杂交互和美观界面的客户端应用。
- Java (后端/服务器端): Java 是一种广泛使用的、面向对象的后端编程语言,我们将使用 Java 来处理业务逻辑、数据库操作、数据验证等“服务器端”任务,Java 应用通常运行在像 Tomcat、JBoss 或 WebLogic 这样的应用服务器上。
2 Flex 与 Java 如何通信?
Flex 客户端和 Java 服务器端不能直接调用对方的方法,它们之间需要一个标准的通信协议来交换数据,最常用和最标准的方式是:
Flex 客户端 --HTTP 请求--> Web 服务器 (如 Tomcat) --处理请求--> Java 应用 --返回数据--> Web 服务器 --HTTP 响应--> Flex 客户端
这个通信过程的核心是 HTTP,Flex 发送一个 HTTP 请求(通常包含请求数据),Java 应用接收请求,处理业务逻辑,然后通过 HTTP 响应将数据返回给 Flex,为了规范数据格式,我们通常使用 JSON 或 XML。
- Flex 的角色: 使用
HTTPService、WebService或RemoteObject组件来发起网络请求。 - Java 的角色: 创建一个 Web 服务(例如一个 Servlet),接收 Flex 发来的请求,并返回 JSON 或 XML 格式的数据。
3 开发环境准备
你需要安装以下软件:

-
Flex SDK (软件开发工具包):
- 访问 Adobe 官网下载最新的 Flex SDK (
flex_sdk_4.6)。 - 重要: Adobe 已停止对 Flex 的官方支持,但社区版本仍在使用,你可以从 Apache Flex 获取社区版本。
- 下载后,解压到一个固定目录,
C:\dev\flex_sdk_4.6。
- 访问 Adobe 官网下载最新的 Flex SDK (
-
Java Development Kit (JDK):
确保你安装了 JDK 8 或更高版本,可以从 Oracle 官网下载。
-
集成开发环境:
(图片来源网络,侵删)- 对于 Flex: Flash Builder (商业软件,已停止更新) 是最强大的 IDE,对于免费选择,可以使用 Flash Develop 或在 Eclipse 中安装 Flexclipse 插件。
- 对于 Java: Eclipse IDE for Java EE Developers 或 IntelliJ IDEA 是非常好的选择,本教程将以 Eclipse 为例。
-
Web 服务器:
- Apache Tomcat: 轻量级、广泛使用,是开发 Java Web 应用的首选,下载并解压 Tomcat。
-
(推荐) BlazeDS:
这是一个由 Adobe 开源的、专门用于 Flex 和 Java 通信的开源报文服务,它极大地简化了 Flex 和 Java 对象之间的数据交换,特别是当你希望它们之间能直接传递对象(序列化/反序列化)时,我们将使用它来建立连接。
第二部分:实战项目 - "Hello, Flex + Java"
我们将创建一个简单的项目:Flex 客户端有一个输入框和一个按钮,用户输入名字,点击按钮后,Java 后端会返回一个问候语并显示在 Flex 界面上。
步骤 1: 创建 Java Web 项目 (后端)
- 打开 Eclipse,创建一个新的 Dynamic Web Project,命名为
HelloJavaBackend。 - 在
src目录下,创建一个包,com.example.service。 - 在该包中,创建一个简单的 Java 类
GreetingService.java,它将包含我们的业务逻辑。
// src/com/example/service/GreetingService.java
package com.example.service;
public class GreetingService {
public String getGreeting(String name) {
if (name == null || name.trim().isEmpty()) {
return "Hello, stranger!";
}
return "Hello, " + name + "! Welcome from Java!";
}
}
- 我们需要创建一个 Servlet 来暴露这个服务,让 Flex 可以通过 HTTP 访问它。
- 在
src下创建另一个包com.example.servlet。 - 创建一个 Servlet 类
GreetingServlet.java。
// src/com/example/servlet/GreetingServlet.java
package com.example.servlet;
import com.example.service.GreetingService;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class GreetingServlet extends HttpServlet {
private GreetingService greetingService = new GreetingService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 从请求中获取参数
String name = request.getParameter("name");
// 2. 调用业务逻辑
String greeting = greetingService.getGreeting(name);
// 3. 设置响应内容类型为 JSON
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
// 4. 将结果写入响应流
// 这里我们手动构建一个简单的 JSON 对象
String jsonResponse = String.format("{\"greeting\": \"%s\"}", greeting);
PrintWriter out = response.getWriter();
out.print(jsonResponse);
out.flush();
}
}
- 配置
web.xml: 在WEB-INF/web.xml文件中注册这个 Servlet。
<!-- WEB-INF/web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>HelloJavaBackend</display-name>
<servlet>
<servlet-name>GreetingServlet</servlet-name>
<servlet-class>com.example.servlet.GreetingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GreetingServlet</servlet-name>
<url-pattern>/greeting</url-pattern>
</servlet-mapping>
</web-app>
- 部署到 Tomcat: 右键点击项目 -> Export -> WAR file,导出为 WAR 文件,然后将此 WAR 文件复制到 Tomcat 的
webapps目录下,并启动 Tomcat。
步骤 2: 创建 Flex 项目 (前端)
-
使用 Flash Builder 或 Flex SDK 命令行工具:
- 如果你使用 Flash Builder,可以直接创建一个新的 Flex 项目。
- 如果你使用命令行,打开终端,切换到你之前解压的 Flex SDK 的
bin目录,然后运行:# -appname 是项目名, -source-path 指向你的源码目录 ./mxmlc -locale=en_US -source-path=/path/to/your/flex/src /path/to/your/flex/src/HelloFlex.mxml
这会生成一个
HelloFlex.swf文件。
-
创建 MXML 文件 (
HelloFlex.mxml): 这是我们的主界面。
<!-- HelloFlex.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="initApp()">
<fx:Script>
<![CDATA[
// 定义一个变量来存储服务器返回的数据
[Bindable]
public var greetingData:String = "";
// 定义服务对象
private var service:HTTPService;
// 应用初始化时调用
private function initApp():void {
// 创建 HTTPService 实例
service = new HTTPService();
service.url = "http://localhost:8080/HelloJavaBackend/greeting"; // Tomcat的URL + Servlet的URL pattern
service.method = "GET";
service.resultFormat = "text"; // 我们期望返回的是文本,然后手动解析JSON
// 添加事件监听器
service.addEventListener(ResultEvent.RESULT, onResult);
service.addEventListener(FaultEvent.FAULT, onFault);
}
// 按钮点击事件处理函数
protected function sendButton_clickHandler(event:MouseEvent):void {
// 从输入框获取值
var name:String = nameInput.text;
// 添加参数到URL
service.send({name: name});
}
// 成功接收到结果
private function onResult(event:ResultEvent):void {
// event.result 是服务器返回的字符串 (JSON)
var jsonString:String = event.result as String;
// 手动解析简单的JSON (实际项目中建议使用 as3corelib 等库)
// 假设返回格式是 {"greeting": "..."}
var startIndex:int = jsonString.indexOf("\"greeting\": \"") + 12;
var endIndex:int = jsonString.lastIndexOf("\"");
greetingData = jsonString.substring(startIndex, endIndex);
}
// 请求失败
private function onFault(event:FaultEvent):void {
trace("Fault: " + event.fault.message);
greetingData = "Error: " + event.fault.message;
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout paddingTop="20" paddingLeft="20" horizontalAlign="center"/>
</s:layout>
<!-- 用户输入框 -->
<s:TextInput id="nameInput" width="200" prompt="Please enter your name"/>
<!-- 发送按钮 -->
<s:Button id="sendButton" label="Send" click="sendButton_clickHandler(event)"/>
<!-- 显示问候语 -->
<s:Label id="greetingLabel" text="{greetingData}" fontSize="20" color="#0F5C8E"/>
</s:Application>
步骤 3: 运行和测试
- 确保 Tomcat 正在运行,并且你的 Java 后端 (
HelloJavaBackend) 已经部署。 - 打开
HelloFlex.swf文件(在浏览器中,或者使用 Flash Player Debug Player)。 - 在输入框中输入你的名字,"Alice",然后点击 "Send" 按钮。
- 你应该能在下方的 Label 中看到 "Hello, Alice! Welcome from Java!"。
恭喜!你已经成功完成了第一个 Flex + Java 整合项目!
第三部分:深入与进阶
上面的例子使用了最基础的 HTTPService 和手动 JSON 解析,在实际开发中,你会遇到更复杂的需求。
1 使用 BlazeDS 进行更高效的通信
HTTPService 虽然简单,但每次通信都是完整的 HTTP 请求/响应,开销较大,BlazeDS 提供了 AMF (Action Message Format) 协议,它是一种二进制协议,数据量小,传输效率高,并且支持 Flex 和 Java 对象之间的自动序列化和反序列化。
如何整合 BlazeDS:
-
下载 BlazeDS: 从 Adobe BlazeDS 下载。
-
配置 Java 项目:
- 将 BlazeDS 中的
flex、lib、resources目录下的 JAR 文件复制到你的 Java Web 项目的WEB-INF/lib目录下。 - 在
WEB-INF目录下创建flex文件夹。 - 复制
blazeds-config.xml,proxy-config.xml,remoting-config.xml,services-config.xml到WEB-INF/flex目录。 - 修改
web.xml,添加 BlazeDS 的MessageBrokerServlet。
- 将 BlazeDS 中的
-
配置
remoting-config.xml: 在该文件中定义一个 destination,指向你的 Java 服务。<destination id="greetingDestination"> <properties> <source>com.example.service.GreetingService</source> </properties> </destination> -
修改 Flex 代码: 将
HTTPService替换为RemoteObject。// Flex 代码修改 private var service:RemoteObject; private function initApp():void { service = new RemoteObject("destinationId"); // 使用 remoting-config.xml 中定义的 id service.getGreeting.addEventListener(ResultEvent.RESULT, onResult); service.getGreeting.addEventListener(FaultEvent.FAULT, onFault); } protected function sendButton_clickHandler(event:MouseEvent):void { var name:String = nameInput.text; // 直接调用 Java 方法! service.getGreeting(name); }这样,Flex 代码会直接调用 Java 的
getGreeting方法,参数和返回值会自动通过 AMF 传输,代码更简洁高效。
2 数据绑定与 MVC 模式
- 数据绑定: Flex 的
[Bindable]元数据标签是其核心特性之一,当一个被标记为[Bindable]的属性改变时,所有绑定到该属性的 UI 组件会自动更新,我们在示例中已经使用了greetingData="{greetingLabel.text}"。 - MVC 模式:
- Model (模型): 数据模型,如
User、Product等。 - View (视图): MXML 文件,负责 UI 展示。
- Controller (控制器): ActionScript 代码,处理用户交互,调用 Model 和 Service。
- 一个好的实践是使用 Cairngorm 或 Mate 等 Flex 框架来更好地组织代码,实现清晰的 MVC 分离。
- Model (模型): 数据模型,如
3 状态管理与用户认证
对于复杂应用,你需要管理应用的不同状态(如登录状态、加载状态、错误状态),可以使用 Flex 的 states 功能,或者使用状态管理框架,用户认证通常通过后端 Session 或 Token 机制实现,Flex 在每次请求中携带认证信息。
第四部分:现状与未来
1 Flex 的现状
- 已停止官方支持: Adobe 在 2011 年停止了对 Flex 的官方开发和维护。
- 社区仍在活跃: Apache Flex 社区接管了项目,并持续发布更新,修复安全漏洞,许多企业级应用仍在使用 Flex。
- 性能问题: Flash Player 在移动端的支持已被放弃,桌面端也逐渐被淘汰,这使得 Flex 在新项目中的选择变得非常有限。
2 现代替代方案
如果你现在要开始一个新项目,尤其是需要跨平台(包括移动端)支持,Flex 已经不是首选,现代的替代方案包括:
-
HTML5 + JavaScript + 后端框架:
- 前端: 使用 React, Angular, Vue.js 等现代前端框架,它们提供了丰富的组件库和响应式设计,完美支持 Web 和移动端。
- 后端: 你的 Java 后端(Spring Boot, Jakarta EE)可以保持不变,只需提供 RESTful API 或 GraphQL 接口供前端调用,这是目前最主流、最灵活的方案。
-
桌面应用框架:
- 如果你的目标是桌面应用,可以考虑 JavaFX (Java 官方推荐)、Electron (使用 Web 技术) 或 Tauri (Rust + Web 技术)。
3 总结
- Flex + Java 是一个曾经非常强大和成熟的RIA解决方案,特别适合构建功能复杂、界面美观的企业级桌面Web应用。
- 通过本教程,你掌握了它们之间通过 HTTPService 和 BlazeDS (RemoteObject) 通信的核心原理。
- 由于技术生态的变迁,Flex 已不再是新项目的推荐技术。
- 对于未来的开发,建议将精力集中在 现代前端框架 (React/Angular/Vue) 和 Java 后端 API 的结合上,这能让你跟上技术发展的潮流,并获得更广阔的职业前景。
希望这份详尽的教程能帮助你理解 Flex + Java 的整合开发!
