杰瑞科技汇

Java Flex教程该怎么学?

“Java Flex”通常指的是使用 Java 作为后端(服务器端),Flex 作为前端(客户端)来构建 Web 应用程序的一种经典技术组合。

Java Flex教程该怎么学?-图1
(图片来源网络,侵删)

Flex 本身是一种用于构建富互联网应用的前端技术,由 Adobe 公司开发,现在已经不再由 Adobe 主导开发,但其核心概念和技术(尤其是 Apache Flex 开源实现)仍然在学习历史项目和某些特定领域中有价值。

下面我将为你提供一个从入门到实践的 Java Flex 教程。


第一部分:核心概念理解

在开始编码之前,必须理解这个组合的运作方式。

1 Flex 是什么?

Flex 是一个开源的框架,用于创建具有丰富图形用户界面的 Web 应用程序,它的主要特点是:

Java Flex教程该怎么学?-图2
(图片来源网络,侵删)
  • 基于 Flash Player: Flex 应用最终被编译成 .swf 文件,在浏览器中通过 Adobe Flash Player 运行(现代浏览器已逐步淘汰 NPAPI,这使得 Flex 在新环境中的运行变得困难)。
  • MVC 架构: Flex 遵循 Model-View-Controller 设计模式。
    • Model: 数据模型,通常用 ActionScript 类定义。
    • View: 用户界面,由 MXML(一种基于 XML 的标记语言)和 ActionScript 组成。
    • Controller: 处理用户交互,通常是 ActionScript 代码。
  • 强大的 UI 组件: 提供了大量可定制的 UI 组件,如 DataGrid, Chart, Tree 等,非常适合构建企业级管理后台。

2 Java 在这里扮演什么角色?

Java 作为后端,主要负责:

  • 业务逻辑处理: 处理复杂的业务规则、数据计算等。
  • 数据持久化: 通过 JDBC、JPA、Hibernate 等技术操作数据库。
  • 为 Flex 提供数据服务: Java 后端通过特定的技术(如 BlazeDS, GraniteDS)将数据以 Flex 能理解格式(通常是 AMF)发送给前端。

3 连接桥梁:BlazeDS / GraniteDS

这是整个架构的核心,它们是一个开源的、基于 Java 的远程网关,它实现了 Action Message Format (AMF) 协议。

  • 工作流程:
    1. Flex 前端通过 RemoteObject 组件发起一个方法调用。
    2. 这个调用被序列化为 AMF 格式。
    3. AMF 数据通过 HTTP 请求发送到 Java 后端。
    4. BlazeDS/GraniteDS 在服务器端接收到 AMF,反序列化成 Java 对象。
    5. 调用指定的 Java 方法(通常是 Spring 管理的 Service)。
    6. Java 方法执行完毕,返回结果。
    7. 结果被序列化为 AMF 格式。
    8. AMF 数据被发送回 Flex 前端。
    9. Flex 前端接收 AMF,反序列化成 ActionScript 对象,并更新 UI。

第二部分:环境搭建

由于 Flex 生态已经比较陈旧,你需要安装一些“老”工具。

1 前端环境

  1. Flex SDK: 下载 Apache Flex SDK,推荐使用 4.16.1 这个比较新的稳定版本。
  2. 代码编辑器:
    • Flash Builder (推荐,但已停止销售): 这是官方的、功能最强大的 IDE,如果你能找到旧版本,是最好的选择。
    • Visual Studio Code + 插件: 安装 flexpde 或其他 Flex/ActionScript 插件,可以实现基本的语法高亮和代码提示。
  3. (可选) Flex Builder / Flash Builder 插件: 如果你使用 Eclipse,可以安装旧的 Flex Builder 插件。

2 后端环境

  1. JDK: 安装 JDK 8 或更高版本。
  2. IDE: IntelliJ IDEA (Ultimate Edition)Eclipse,IntelliJ 对 Spring 和 Maven 的支持更好。
  3. 构建工具: Maven,用于管理项目依赖,包括 BlazeDS。
  4. Web 服务器: Apache Tomcat,用于部署和运行你的 Java Web 应用。

3 连接库

你需要将 BlazeDS 或 GraniteDS 集成到你的 Java Web 项目中,最简单的方式是通过 Maven。

Java Flex教程该怎么学?-图3
(图片来源网络,侵删)

在你的 pom.xml 中添加 BlazeDS 依赖:

<dependency>
    <groupId>org.apache.flex.blazeds</groupId>
    <artifactId>flex-messaging-core</artifactId>
    <version>4.7.3</version> <!-- 使用一个稳定版本 -->
</dependency>
<dependency>
    <groupId>org.apache.flex.blazeds</groupId>
    <artifactId>flex-messaging-remoting</artifactId>
    <version>4.7.3</version>
</dependency>

第三部分:实战教程 - 用户列表查询

我们将创建一个简单的应用:Flex 界面上有一个按钮,点击后从 Java 后端获取用户列表并显示在 DataGrid 中。

步骤 1: 创建 Java 后端项目 (使用 Spring Boot + Maven)

  1. 使用 Spring Initializr (https://start.spring.io/) 创建一个新项目,选择 Web 依赖。

  2. pom.xml 中添加 BlazeDS 依赖(如上所示)。

  3. 创建一个简单的用户实体类 User.java:

    package com.example.demo.model;
    public class User {
        private Long id;
        private String name;
        private String email;
        // 构造器、Getter 和 Setter
        public User() {}
        public User(Long id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
    }
  4. 创建一个服务类来处理业务逻辑 UserService.java:

    package com.example.demo.service;
    import com.example.demo.model.User;
    import org.springframework.stereotype.Service;
    import java.util.ArrayList;
    import java.util.List;
    @Service
    public class UserService {
        public List<User> getAllUsers() {
            List<User> users = new ArrayList<>();
            // 模拟从数据库获取数据
            users.add(new User(1L, "张三", "zhangsan@example.com"));
            users.add(new User(2L, "李四", "lisi@example.com"));
            users.add(new User(3L, "王五", "wangwu@example.com"));
            return users;
        }
    }
  5. 配置 BlazeDS: 这是最关键的一步,你需要告诉 BlazeDS 哪些 Java 类可以被 Flex 远程调用。

    • src/main/resources 下创建 flex 文件夹。

    • flex 文件夹中创建 remoting-config.xml:

      <?xml version="1.0" encoding="UTF-8"?>
      <service id="remoting-service"
               class="flex.messaging.services.RemotingService">
          <adapters>
              <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
          </adapters>
          <destination id="userService">
              <properties>
                  <source>com.example.demo.service.UserService</source>
              </properties>
          </destination>
      </service>
      • <destination id="userService">: 这个 ID 是 Flex 前端将要调用的目标名称。
      • <source>...</source>: 指定要暴露的 Java 类的全限定名。
  6. 配置 Web.xml:src/main/webapp/WEB-INF/web.xml 中添加 BlazeDS 的 Servlet 配置。

    <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
        <init-param>
            <param-name>services.configuration.file</param-name>
            <param-value>/WEB-INF/flex/services-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>
    • 这个配置会拦截所有发送到 /messagebroker/* 的请求,并将其交给 BlazeDS 处理。
  7. 创建 services-config.xml:src/main/webapp/WEB-INF/flex/ 目录下创建 services-config.xml,它将引用我们之前创建的 remoting-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <services-config>
        <services>
            <service-include file-path="/flex/remoting-config.xml" />
        </services>
        <!-- 其他配置... -->
    </services-config>

步骤 2: 创建 Flex 前端项目

  1. 创建项目结构:

    • 创建一个新文件夹,flex-client
    • 在其中创建 src 文件夹,用于存放 MXML 和 ActionScript 文件。
  2. 配置 Flex SDK: 确保 flex-config.xml(通常在 Flex SDK 的 frameworks 目录下)被正确引用,或者使用命令行编译器时指定 SDK 路径。

  3. 创建主应用程序 Main.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="application1_creationCompleteHandler(event)"
                   minWidth="955" minHeight="600">
        <fx:Script>
            <![CDATA[
                import mx.collections.ArrayCollection;
                import mx.controls.Alert;
                import mx.events.FlexEvent;
                import mx.rpc.events.FaultEvent;
                import mx.rpc.events.ResultEvent;
                // 定义一个与 Java User 对应的 ActionScript 类
                [RemoteClass(alias="com.example.demo.model.User")]
                public class User {
                    public var id:Number;
                    public var name:String;
                    public var email:String;
                }
                protected function application1_creationCompleteHandler(event:FlexEvent):void
                {
                    // 应用启动时,可以在这里做初始化
                }
                protected function getUsersButton_clickHandler(event:MouseEvent):void
                {
                    // 1. 调用 Java 后端方法
                    userService.getAllUsers();
                }
                // 2. 成功接收到数据后触发
                protected function userService_resultHandler(event:ResultEvent):void
                {
                    // Java 返回的 List<User> 会被自动转换为 ArrayCollection<User>
                    // 我们直接赋值给 DataGrid 的 dataProvider
                    userGrid.dataProvider = event.result as ArrayCollection;
                    Alert.show("数据加载成功!");
                }
                // 3. 调用失败后触发
                protected function userService_faultHandler(event:FaultEvent):void
                {
                    Alert.show("调用失败: " + event.fault.message);
                }
            ]]>
        </fx:Script>
        <!-- 定义一个 RemoteObject,连接到后端的 'userService' 目标 -->
        <mx:RemoteObject id="userService"
                         destination="userService"
                         showBusyCursor="true"
                         result="userService_resultHandler(event)"
                         fault="userService_faultHandler(event)">
        </mx:RemoteObject>
        <s:layout>
            <s:VerticalLayout paddingTop="20" paddingLeft="20"/>
        </s:layout>
        <mx:Button label="获取用户列表" click="getUsersButton_clickHandler(event)"/>
        <mx:DataGrid id="userGrid" width="500">
            <mx:columns>
                <mx:DataGridColumn dataField="id" headerText="ID"/>
                <mx:DataGridColumn dataField="name" headerText="姓名"/>
                <mx:DataGridColumn dataField="email" headerText="邮箱"/>
            </mx:columns>
        </mx:DataGrid>
    </s:Application>

步骤 3: 编译和运行

  1. 编译 Flex:

    • 打开命令行,进入 flex-client/src 目录。
    • 使用 Flex SDK 的 mxmlc 编译器编译 Main.mxml:
      "C:\flex_sdk\bin\mxmlc" Main.mxml
    • 编译成功后,会生成一个 Main.swf 文件。
  2. 部署 Java 后端:

    • 将你的 Spring Boot 项目打包成 WAR 文件。
    • 将 WAR 文件部署到 Tomcat 的 webapps 目录下。
  3. 创建 HTML 页面来加载 SWF:

    • 在 Tomcat 部署的 Java 应用(demo-0.0.1-SNAPSHOT)的根目录下,创建一个 index.html 文件。
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <title>Java Flex Demo</title>
      <script src="https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
      <script>
          swfobject.embedSWF("Main.swf", "flexApp", "100%", "100%", "11.2.0", "expressInstall.swf");
      </script>
      </head>
      <body>
      <div id="flexApp">你需要安装 Flash Player 来查看此内容。</div>
      </body>
      </html>
    • 注意: 你需要将编译好的 Main.swf 文件也放到这个目录下。
  4. 运行:

    • 启动 Tomcat。
    • 在浏览器中访问 http://localhost:8080/demo-0.0.1-SNAPSHOT/ (你的应用名)。
    • 你应该能看到 Flex 界面,点击按钮,数据就会从 Java 后端加载并显示在 DataGrid 中。

第四部分:现代替代方案

由于 Flex 依赖 Flash Player,在现代 Web 开发中已基本被淘汰,如果你要构建类似的应用,强烈推荐以下现代技术栈:

特性 Java Flex (旧方案) 现代方案 (Spring Boot + Vue.js/React)
前端技术 Flex (MXML/AS3), 依赖 Flash Player Vue.js / React / Angular (纯 JavaScript/TypeScript)
后端技术 Java (Spring) Java (Spring Boot)
数据交互 AMF (二进制,高效) JSON (文本,通用)
UI 组件库 Flex SDK 自带组件 Element UI, Ant Design, Material-UI
构建工具 手动编译 / Ant / Flex Builder Webpack / Vite
运行环境 浏览器插件 (Flash Player) 现代浏览器 (原生支持)
社区与生态 几乎停滞 非常活跃,文档、教程、插件丰富

现代方案的优势:

  • 无需插件: 直接在浏览器中运行,用户体验更好。
  • 生态强大: 拥有海量的第三方库和活跃的开发者社区。
  • 技术栈统一: 前端和后端都可以使用 JavaScript/TypeScript,降低了学习成本。
  • 更好的移动端支持: 可以方便地构建响应式布局或与移动端框架集成。

Java Flex 是一个曾经在 RIA 领域非常强大的技术组合,它通过 AMF 实现了前后端之间高效、类型安全的通信,理解它的架构和工作原理对于学习企业级应用开发的历史和思想非常有价值。

对于任何新的项目,都不建议再使用 Java Flex,你应该转向 Spring Boot + Vue.js/React 这样的现代全栈技术栈,它们能让你构建出更强大、更易于维护、更符合当前技术趋势的 Web 应用。

希望这份详细的教程能帮助你理解 Java Flex!

分享:
扫描分享到社交APP
上一篇
下一篇