Flex


产品

  1. Adobe® Flex™ SDK

  2. Adobe® Flex™ Builder™

  3. Adobe® Flex™ Data Services

  4. Adobe® Flex™ Charting

Flex基础

应用程序模型

用容器(如Box)控件(如Button)来描述用户的操作界面

MVC模型

  1. 模型/Model 组件封装了数据和与数据相关的行为。

  2. 视图/View 组件定义了应用程序的用户界面。

  3. 控制器/Controller 组件则负责处理程序中的数据连接。

Flex 编程模型

Flex 包含了Flex 类库MXMLActionScript 编程语言,以及Flex 编译器调试器

MXML 和 ActionScript 编程语言都提供了访问Flex 类库的能力。

通常的做法是:使用MXML 去定义用户界面的元素,使用ActionScript 去定义客户端的逻辑并进行控制。

Flex 类库包括了Flex 组件管理器行为

Flex 元素

  • Flex framework

  • MXML

  • ActionScript 3.0

  • CSS

  • 图形资源

  • 数据

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Panel>
        <mx:TextArea text="Say hello to Flex!" />
        <mx:Button label="Close" />
    </mx:Panel>
</mx:Application>

发布方式

  1. 客户端模式,即应用程序只运行在客户端上而不需要服务器资源。

  2. 使用简单的RPC 访问服务器数据,即使用HTTPService(HTTP GET 或POST 请求)和WebService(通过使用SOAP)。

  3. Flex Data Services 模式,可以提供更为高级的特性,如数据同步、安全增强等等。

界面布局

样式

<mx:Style>
     {
        fontSize: 36px;
        fontWeight: bold;
     }
</mx:Style>

外部样式

<mx:Style source="styles.css"/>

控制应用程序的外观

  1. 大小/Sizes,即组件或应用程序的高度和宽度。

  2. 样式/Styles,即一组特性,如字体、排列方式、颜 色等。它们都是通过层叠样式( CSS)来进行设置的。

  3. 皮肤/Skins,即可以进行改变的组件视觉元素。

  4. 行为/Behaviors,即Flex 组件在视觉或听觉效果方面的变化。

  5. 视图状态/View state 可以让你通过修改它的基础内容,来改变组件或程序的内容和外观。

  6. 变换/Transitions 可以让你定义屏幕上发生改变的视图状态。

受约束的布局

受约束的布局可以确保用户界面中的组件在程序窗

口大小发生变化时,也能自动地作出调节。备注:可以通过使用嵌套的布局容器/nested layout container 来实现相同的目的

创建受约束的布局,你必须将容器的布局属性设置为绝对方式( layout="absolute")备注:帆布容器/canvas container 并不需要进行layout=”absolute”的属性设置,因为它默认是绝对布局方式。

在Flex 中,所有的约束都是被设置为与容器的相对距离,它们不可能被设置为相对于其它控件

控件

ComboBox,List,HorizontalList。

事件与行为

外部ActionScript

<mx:Script source="myFunctions.as" />

被事件触发的行为

mxml中的组件被赋予id后,在as中将可以直接作为对象进就行操作,如例子中的vBox

var locales:ArrayCollection = new ArrayCollection([{label:"en_us", data:"en_us"},{label:"zh_cn", data:"zh_cn"}]);

var child:ComboBox = new ComboBox();
child.dataProvider=locales;
vBox.addChild(child);

也可以在as中为事件绑定行为

//change事件绑定
localeComboBox.addEventListener(ListEvent.CHANGE,localeComboxChangeHandler);

多态页面

用ViewStack 组件、创建单独的MXML 文件、或者使用视图状态

创建行为

<mx:Glow id="buttonGlow" color="0x99FF66" alphaFrom="1.0" alphaTo="0.3" duration="1500"/>
<mx:Button x="40" y="60" label="View" id="myButton" mo
useUpEffect="{buttonGlow}" />

连接数据

数据源,url获取xml类型数据

flex 不直接连接数据库,而是用数据服务组件获取xml数据

<mx:HTTPService id="simpleData" url="..."/>

数据绑定,并非简单的引用,dataProvider与simpleData.lastResult.products.items是同步变化的

<mx:DataGrid dataProvider="{simpleData.lastResult.products.items}" >
            <mx:columns>
                <mx:DataGridColumn headerText="resources" dataField="resources" />
            </mx:columns>
        </mx:DataGrid>

事件绑定

<mx:Button label="load" click="simpleData.send();"/>

连接数据服务器

  1. WebService 提供对使用SOAP 的web 服务器的访问。

  2. HTTPService 提供对返回数据的HTTP URLs 的访问。

  3. RemoteObject 通过使用AML 协议提供对Java 对象(Java Beans、EJBs、POJOs)的访问。该选项目前仅适用于Flex Data Services 或Macromedia ColdFusion MX 7.0.2.

安全性

  1. swf与数据源必须同域

  2. 可以使用代理访问远程数据源,但是swf必须与代理服务器同域

  3. 安装crossdomain.xml(跨域策略/cross-domain policy)文件在数据源的宿主Web 服务器上。 crossdomain.xml 文件允许位于其它域中的SWF 文件对数据源的访问。

图表组件

  • 区域形图表/Area charts

  • 气泡形图表/Bubble charts

  • 烛形图表/Candlestick charts

  • 柱形图表/Column charts

  • 高低开合形图表/HighLowOpenClose charts

  • 线形图表/Line charts

  • 饼形图表/Pie charts

  • 标绘形图表/Plot charts

  • 扩展CartesianChart 控件来创建定制的图表

使用dataProvider 属性定义图表的数据

MXML

MXM 相关的技术标准有

  1. XML 标准。XML 文档使用标签去决定结构化信息的内容,以及它们之间的关系。

  2. 事件模型标准。Flex 事件模型是文档对象模型/Document Object Model (DOM)第三级事件的一个子集,该模型是由World Wide Web Consortium(W3C)起草制定。

  3. Web 服务标准Flex 提供与服务器交互的MXML 标签,遵循了Web 服务描述语言/Web Services Description Language(WSDL)的规则。具体包括了简单对象访问协议/Simple Object Access Pr otocol(SOAP)和超文本传送协议/Hypertext Transfer Protocol(HTTP)。

  4. Java 标准

Flex 提供了与服务器端Java 对象交互的MXML 标签,包括plain old Java objects(POJOs),Java

Beans 和企业级/Enterprise JavaBeans(EJBs)。

  1. HTTP 标准

Flex 提供了相应的MXML 标签去支持标准的HTTP GET 和POST 请求,以及对HTTP 返回数据的处理。

  1. 图形标准

Flex 还提供了相应的MXML 标签去使用JPEG,GIF 和PNG 图象。Flex 还能够将SWF 文件和Scala ble Vector Graphics(SVG)文件导入到应用程序中。

  1. 层叠样式表标准MXML 样式的定义和使用遵循了W3C Cascading Style Sheets (CSS)标准。

ActionScript

ActionScript 3.0 的特性完全实现了ECMAScript for XML (E4X)。 在flex中使用ActionScript

  1. <mx:Script>标签中插入ActionScript 代码块。

  2. 调用存储在system_classes 目录结构中的全局ActionScript 功能函数。

  3. 引用*user_classes *中的外部类和包来处理更为复杂的任务。

  4. 使用标准的Flex 组件。

  5. 使用ActionScript 类扩展已有的组件。

  6. 使用ActionScript 创建新的组件。

  7. 在Flash 创建环境中创建新的组件( SWC 文件)。

XML

创建xml对象

  • 字面量方式,AS可以自动识别,如果加上引号就不是XML类型而是String类型了
var textXmlObj:XML = <test><element>text</element></test>;  
  • XML字面量中可以加入动态内容
var text_node:String = "text";  
var textXmlObj:XML = <test><element>{text_node}</element></test>;  
  • 通过XML类创建实例
var myText:String = "text";  
var str:String = "<test><element>"+ myText + "</element></test>";  
var textXmlObj:XML = new XML(str);  
  • 从外部加载XML对象
 <mx:HTTPService id="simpleData" url="simpleData.xml" useProxy="false" result="test(event);"/> 

处理XML对象

<items>
    <item index="0">
        <name>Mobile Phone</name>
        <price>$199</price>
    </item>
    <item index="1">
        <name>Car Charger</name>
        <price>$34</price>
    </item>
</items>

使用E4X简化对XML的操作

 <mx:HTTPService id="simpleData" url="simpleData.xml" useProxy="false" result="test(event);" resultFormat="e4x"/>

查询

使用.操作符查询节点

simpleData.lastResult.item

使用[]访问指定索引的节点,将无法检测到数据变化,根节点被忽略

simpleData.lastResult.item[0]

使用..访问所有指定名称的节点,忽略上下级关系

simpleData.lastResult..name

使用@访问节点属性

simpleData.lastResult.item[0].@index

过滤节点(<>无法在mxml中使用,需要转义)

simpleData.lastResult.item.(price==34)

过滤属性

simpleData.lastResult.item.(@index==0)

修改获取的数据(不改变xml源对象)

simpleData.lastResult.item.(price=998)}

HttpService对象在加载外部XML后会自动把它转换成ArrayCollection对象

如果需要属性结构如(Tree组件),需要在HTTPService对象中加上resultFormat=e4x以XML的格式读取进来而不要转换为ArrayCollection

修改

如果绑定的xml数据发生的变化,如何将变化传递到引用?目前发现似乎是自动的,有待研究。

var myxml:XML = <books>
     <book name="flex tutorial">
         <price>30</price>
         <author>adobe</author>
     </book>
 </books>

添加节点,insert指定子节点位置插入,append添加到子节点末尾,prepend插入到子节点开头

myxml.insertChildAfter(myxml.book[0],<newbook name="After"/>);
myxml.insertChildBefore(myxml.book[0],<newbook name="Before"/>);
myxml.appendChild(<newbook name="Append"/>);
myxml.prependChild(<newbook name="Prepend"/>);   

添加属性

myxml.book[0].@date="2008";

修改xml对象,此处增加<author>标签content为奥多比

myxml.book[0].author="奥多比";

删除节点,属性,content

delete myxml.book[0].@name;
delete myxml.book[0].author;
delete myxml.book[0].price.text()[0];

备忘

IDEA 编译出错 java.net.SocketTimeoutException: Accept timed out

Stack Overflow

  1. Go to Settings > Compiler > Flex Compiler

  2. Choose Mxmlc/compx instead of the default Built-in compiler shell

  3. Compile your application

整合SpringMVC

Flex要想与Spring进行配合使用,需要一个附加的组件BlazeDS。BlazeDS可以将Flex前端的通信内容(amf 格式 Action Message format,一种flex定义的通信规则)转换为java的相关类和对象。

请求处理的简单流程是,flex客户端向服务器发送Request请求,服务器根据Web.xml中的映射,找到Spring配置文档中与flex相关的配置,这个配置就是MessageBroker,MessageBroker是Spring容器根据flex的services-config.xml文件生成的,在services-config.xml中指定了消息通道,Spring将请求交给这个通道(一般是默认通道),通道根据remoting-config.xml中配置的remoting-service和Adapter将flex的amf转换为java的实例信息。如果需要安全或者消息订阅(jms)还需要提供messaging-config.xmlproxy-config.xml配置文件。

结合使用Spring和BlazeDS必须对MessageBroker进行配置。从flex客户端发来的Http 消息(messages)通过Spring的DispatcherServlet(在web.xml中配置)传递给Spring管理的MessageBroker(在Spring的配置文档中指明)。如果使用Spring管理的MessageBroker就不必配置BlazeDS的MessageBrokerServlet(在web.xml文档中指明)了。

依赖

  <properties>
    <spring.version>3.0.1.RELEASE</spring.version>
    <flex.version>4.6</flex.version>
  </properties>

  <dependencies>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.flex</groupId>
          <artifactId>org.springframework.flex</artifactId>
          <version>1.0.3.RELEASE</version>
      </dependency>

      <!-- flex library -->

      <dependency>
          <groupId>com.adobe.flex</groupId>
          <artifactId>messaging-common</artifactId>
          <version>${flex.version}</version>
      </dependency>
      <dependency>
          <groupId>com.adobe.flex</groupId>
          <artifactId>messaging-core</artifactId>
          <version>${flex.version}</version>
      </dependency>
      <dependency>
          <groupId>com.adobe.flex</groupId>
          <artifactId>messaging-remoting</artifactId>
          <version>${flex.version}</version>
      </dependency>
      <dependency>
          <groupId>backport-util-concurrent</groupId>
          <artifactId>backport-util-concurrent</artifactId>
          <version>3.1</version>
      </dependency>
      <dependency>
          <groupId>cglib</groupId>
          <artifactId>cglib</artifactId>
          <version>2.2.2</version>
      </dependency>
  </dependencies

配置web.xml

<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- MessageBroker Servlet flex mapping-->
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

Flex通过AMF通道的形式进行通信的,所谓的AMF通道就是指一种编码形式。MessageBroker可以将Flex格式的请求转换成具体的java的调用,并将反馈回的内容(response)编码成Flex能够识别的对象(amf)。

Srping容器

使用了默认位置的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:flex="http://www.springframework.org/schema/flex"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">

        <!-- 使用默认位置的配置文件/WEB-INF/flex/services-config.xml-->
       <flex:message-broker/>
    </bean>
</beans>

通道

在BlazeDS的配置文件services-config.xml中定义的通道必须与相应的映射相对应。

<channels>
    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
    <!-- {context.root}之后的messagebroker必须与ServletMapping相同 -->
    <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
              class="flex.messaging.endpoints.AMFEndpoint"/>
    </channel-definition>
</channels>

配置远程服务

这里有列举了两种发布方式,任选一种即可。

①创建使用注解发布的服务

package top.rainynight.flex2spring;

import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.flex.remoting.RemotingInclude;
import org.springframework.stereotype.Component;

@Component
@RemotingDestination
public class AnnotationRPC {

    public String read(String id) {
        return "annotation works";
    }

}

②创建使用xml发布的服务

package top.rainynight.flex2spring;

/**
 * Created by sllx on 2015-03-16.
 */
public class XmlConfRPC {
    public String read(String id) {
        return "xml works";
    }
}

发布配置发布方式任选一种即可

<context:component-scan base-package="top"/>

<bean id="xmlConfRPC" class="top.rainynight.flex2spring.XmlConfRPC">
 <flex:remoting-destination/>
</bean>

flex使用默认channel

flex配置编译参数

-services "pathToWebappRoot/WEB-INF/flex/services-config.xml" -locale en_US

测试

<?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" minWidth="955" minHeight="600" applicationComplete="applicationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.FlexEvent;
            import mx.messaging.events.MessageAckEvent;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;


            protected function resultHandler(event:ResultEvent):void
            {
                Alert.show(event.result.toString(),"result");
            }

            protected function faultHandler(event:FaultEvent):void
            {
                Alert.show(event.message.toString() ,"error");
            }

            protected function applicationCompleteHandler(event:FlexEvent):void
            {
                ro.read("1");
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:RemoteObject destination="annotationRPC" id="ro" result="resultHandler(event)" fault="faultHandler(event)" />
    </fx:Declarations>
</s:Application>