BlazeDS Test Drive里面示例了主要的功能:
- HTTPService
- Web Services
- Remote-Object
- Messaging
其实现是基于一个叫flex.messaging.MessageBroker的Servlet。各种消息通道的配置都存在于WEB-INF/flex/services-config.xml及其包含的3个XML文件中。下面简单介绍这四种不同的功能。
- HTTPService:
向服务器发送HTTP请求,典型用途是获取服务器端的XML内容。服务器端可以采用任何技术:JSP、Servlet、ASP、PHP等,只要在请求的URL里面指定即可。这是个异步请求,服务器会返回result或fault事件,分别对应成功和失败。可以把返回的结果直接绑定到DataGrid上。利用useProxy属性和crossdomain.xml可以跨域访问,这是解决沙箱效应的方法之一。
另一种方法就是不用HTTPService,而是写一个JS或PHP脚本,用Ajax(XMLHTTP Object) 去访问跨域URL。(跑题了)
示例:在proxy-config.xml配置HTTPService要请求的URL地址,在程序中用“destination”映射关系来访问该URL,如示例中的“catalog”。将J返回的XML内容绑定到<mx:DataGrid>控件上。
- main.mxml
- <mx:HTTPService id="srv" destination="catalog" useProxy="true"/>
- <mx:DataGrid dataProvider="{srv.lastResult.catalog.product}" width="100%" height="100%"/>
- <mx:Button label="Get Data" click="srv.send()"/>
- WEB-INF/flex/proxy-config.xml
- <destination id="catalog">
- <properties>
- <url>/{context.root}/testdrive-httpservice/catalog.jsp</url>
- </properties>
- </destination>
- WebService :
可以访问基于SOAP的web服务,其返回的对象自动被反序列化为ActionScript对象。数据绑定、沙箱问 题等与HTTPService相同。
示例:在proxy-config.xml配置WebService要请求的wsdl地址,在程序中用“destination”映射关系来访问该URL,如示例中的“ws-catalog”。将返回的对象绑定到<mx:DataGrid>控件上。
- main.mxml
- <mx:WebService id="srv" destination="ws-catalog" useProxy="true" showBusyCursor="true"/>
- <mx:DataGrid dataProvider="{srv.getProducts.lastResult}" width="100%" height="100%">
- <mx:columns>
- <mx:DataGridColumn dataField="productId" headerText="Product Id"/>
- <mx:DataGridColumn dataField="name" headerText="Name"/>
- <mx:DataGridColumn dataField="price" headerText="Price"/>
- </mx:columns>
- </mx:DataGrid>
- <mx:Button label="Get Data" click="srv.getProducts()"/>
- proxy-config.xml
- <destination id="ws-catalog">
- <properties>
- <wsdl>http://livecycledata.org/services/ProductWS?wsdl</wsdl>
- <soap>*</soap>
- </properties>
- <adapter ref="soap-proxy"/>
- </destination>
- Remote-Object:
让用户可以直接访问服务器上的对象的方法,要被访问的对象是一个JAVA类,和Servlet、JSP差不多,但是远程请求的这部分被隐藏起来了。返回的JAVA对象被自动反序列化为Actionscript对象,如果不加以指定类型,就成为一个动态对象。远程访问也是异步的,result或fault事件,分别对应成功和失败。
示例:在remoting-config.xml配置远程对象的类名,在程序中用“destination”映射关系来访问该类的示例,如示例中的“product”。将返回的java.util.ArrayList对象绑定到<mx:DataGrid>控件上。
- main.mxml
- <mx:RemoteObject id="srv" destination="product"/>
- <mx:DataGrid dataProvider="{srv.getProducts.lastResult}" width="100%" height="100%"/>
- <mx:Button label="Get Data" click="srv.getProducts()"/>
- remoting-config.xml
- <destination id="product">
- <properties>
- <source>flex.samples.product.ProductService</source>
- </properties>
- </destination>
- package flex.samples.product;
- import java.util.ArrayList;
- public class ProductService {
- public List getProducts() {
- List list = new ArrayList();
- list.add(new Product(100, "abc"));
- return list;
- }
- }
- public class Product implements Serializable {
- private int productId;
- private String name;
- public Product(int productId, String name) {...}
- public int getProductId() {
- return productId;
- }
- public void setProductId(int productId) {
- this.productId = productId;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- Messaging
消息本身包含消息头和消息体,消息头的格式是固定的,消息体的内容可以随意写。接触过状态机、分布式嵌入式系统编程的会很容易理解。
消息服务允许Flex客户端可以发布(Publish)和订阅(Subscribe)消息,相应的,客户端的被称为生产者(Producer)和消费者(Consumer),其实也就是发送和接受消息了。
当一个消息被发到已订阅的目的地(destination)时,就会触发一个客户端的message事件。发布的任何消息会发给所有订阅的人,即使是生产者自己。如果某一订阅方只想收到特定的消息,可以在订阅时使用selecor属性来指定过滤条件,只有符合条件的消息才会被服务器转发。如果想要服务器产生消息,可以产生一个flex.messaging.messages.AsyncMessage类的实例,用flex.messaging.MessageBroker发送出去。
示例:在服务器端发布消息。通过JSP或Servlet建立一个无限循环线程产生消息。在messaging-config.xml配置消息通道(channel),在程序中用“destination”映射关系来访问该通道,如示例中的“feed”。
- WEB-INF/flex/messaging-config.xml
- <destination id="feed">
- <!-- Destination specific channel configuration can be defined if needed
- <channels>
- <channel ref="my-streaming-amf"/>
- </channels>
- -->
- </destination>
示例:客户端可以发布和订阅消息,在messaging-config.xml配置消息目的地,在程序中用“destination”映射关系来访问该类的示例,如示例中的“chat”。注意,通道及其端点(endpoint)真正的定义是在service-config.xml中,messaging-config.xml中仅仅是引用它们。
- <mx:Producer id="producer" destination="chat"/>
- <mx:Consumer id="consumer" destination="chat" message="messageHandler(event.message)" selector="prop1 = 10" />
- <mx:Script>
- <!--[CDATA[
- import mx.messaging.messages.AsyncMessage;
- import mx.messaging.messages.IMessage;
- private function send():void
- {
- var message:IMessage = new AsyncMessage();
- message.headers = new Array();
- message.headers["prop1"] = 10;
- message.body.chatMessage = msg.text;
- producer.send(message);
- msg.text = "";
- }
- private function messageHandler(message:IMessage):void
- {
- log.text += message.body.chatMessage + "/n";
- }
- ]]-->
- </mx:Script>
- WEB-INF/flex/messaging-config.xml
- <destination id="chat"/>
- WEB-INF/flex/service-config.xml
- <channel-definition id="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel">
- <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/>
- </channel-definition>
可以看到,messaging包括两大类不同的消息通道。分别是streaming channel和polling channel,每一类又有一些扩展类型。
采用polling channel,可以配置为每隔一段时间就轮询一次,也可以配置让服务器在无数据时等待,直到有数据时才响应(长轮询)。轮询响应完成后后就结束连接。
采用streaming channel时,服务器的响应一直保持连接状态,这样服务器一次连接后,可以持续下发数据到客户端。由于HTTP连接不是双工的,所以一条AMF或HTTP通道实际上需要2条浏览器连接,分别用于上行和下行数据。这第二条连接仅在需要向服务器发送数据时才建立,之后立即释放。这种通道特别适合实时性高、客户端刷新的应用。比起轮询,这种模式有效减少了反复建立连接的开销。
IE和Firefox浏览器在每个session最大连接数上有些不同。如果因此导致streaming channel建立失败,则BlazeDS会自动使用messaging-config.xml配置的下一个连接。
实例:定义多个默认通道,作为备份。
- WEB-INF/flex/messaging-config.xml
- <default-channels>
- <channel ref="my-streaming-amf"/>
- <channel ref="my-polling-amf"/>
- <channel ref="per-client-qos-polling-amf"/>
- </default-channels>
如果不在XML中配置消息通道,也可以在Actionscript脚本中动态赋值。
- <mx:Script>
- <!--[CDATA[
- import mx.messaging.channels.StreamingAMFChannel;
- import mx.messaging.ChannelSet;
- import mx.messaging.channels.AMFChannel;
- import mx.messaging.events.MessageEvent;
- import mx.messaging.messages.AsyncMessage;
- import mx.messaging.messages.IMessage;
- private function initComp():void
- {
- var myStreamingAMF:AMFChannel = new StreamingAMFChannel("my-streaming-amf", "../messagebroker/streamingamf");
- var myPollingAMF:AMFChannel = new AMFChannel("my-polling-amf", "../messagebroker/amfpolling");
- myPollingAMF.pollingEnabled = true;
- myPollingAMF.pollingInterval = 2000;
- var channelSet:ChannelSet = new ChannelSet();
- channelSet.addChannel(myStreamingAMF);
- channelSet.addChannel(myPollingAMF);
- consumer.channelSet = channelSet;
- producer.channelSet = channelSet;
- }
- ]]-->
- </mx:Script>
相关推荐
### FLEX与BlazeDS原理概述 #### 一、FLEX与BlazeDS简介 - **FLEX**:Adobe Flex是一种用于构建跨平台桌面应用程序、移动应用和Web应用的开源框架。它支持丰富的用户界面(UI)组件和数据可视化功能,能够创建高度...
这有助于开发者快速上手,了解BlazeDS的工作原理和功能。 描述中的"flex sample"提到了Flex的示例应用。Flex是一种用于创建RIA的开发框架,它使用MXML和ActionScript编写,通过Flash Player或Adobe AIR在浏览器中...
为了更好地理解BlazeDS的工作原理,我们需要深入探讨其体系结构的关键组成部分。 ##### 1. Blazeds客户端体系结构 BlazeDS采用基于消息的框架与服务器端进行交互。这一框架使用通道来封装Flex应用程序与BlazeDS...
提到的“源码”标签可能意味着你可以找到或参考Blazeds的源代码来了解其工作原理,这对于定制和优化通信过程非常有用。而“工具”标签则提醒我们,Blazeds是一个工具集,包含了一些辅助开发和调试的功能。 总结来...
因此,实现Flex与Spring的集成主要在于配置Flex目标文件,使其能够利用Spring容器来管理实例化的Spring beans。 #### 二、集成原理与实践 **1. Flex数据服务支持工厂概念** Flex数据服务支持工厂的概念,目的是...
它是一个基于Web的界面,允许开发人员和系统管理员查看和管理BlazDS实例中的服务、目的地、消息队列等。通过ds-console.war,你可以方便地配置数据源、监控数据传输性能、调试消息传递,并进行安全性设置。这对于...
开发者可以通过这些示例学习如何在实际项目中使用BlazeDS与Flex 4进行交互,理解各种功能的工作原理。 在Flex 4的开发中,这些WAR包的作用如下: - **blazeds.war**:作为基础服务,提供AMF通道,使得Flex客户端...
文档"使用说明.doc"应包含如何配置和使用这个实例的详细步骤,包括设置Flash Player环境、导入lomboz项目、创建Flash Remoting通道(如NetConnection)以及配置Java服务器端接口等。这些步骤对于初学者来说至关重要...
5.1.3 BlazeDS功能特色 140 5.2 BlazeDS体系结构 141 5.2.1 BlazeDS的组件 143 5.2.2 构建一个简单的BlazeDS应用 148 5.2.3 消息的传输过程 150 5.2.4 BlazeDS的序列化机制 156 5.2.5 FlexClient和FlexSession...
本压缩包"blazeds.zip"包含了FlashMX/Flex的相关源码,特别关注的是其在Flex与Java之间的远程对象(RemoteObject)交互功能。 Flex是Adobe推出的富互联网应用(RIA)开发框架,基于ActionScript编程语言和MXML标记...
通过学习这一章节,读者可以了解如何配置BlazeDS服务,定义数据代理,并实现远程方法调用。 接着,“整合Flex和Spring.doc”将探讨如何将Flex应用程序与Spring框架集成。Spring是Java领域广泛使用的轻量级应用框架...
- 配置Flex与Java EE的集成,比如设置 BlazeDS 或 Adobe LiveCycle Data Services 进行AMF(Action Message Format)数据交换。 - 设计和实现ActionScript类来与Java服务交互。 - 在Java EE中创建RESTful服务或使用...
通过这个实例,你可以深入了解Flex与Java之间的交互原理,为后续的RIA开发打下坚实的基础。同时,这也是一种常见的前后端分离开发模式,对于理解现代Web应用的架构和工作流程具有很高的参考价值。
3. 使用BlazeDS或GraniteDS配置和调用Java服务。 4. 如何处理Flex与Java之间的数据传输,包括数据封装和解封。 5. 在Java后端处理Flex请求,例如实现业务逻辑和数据库操作。 6. 调试和测试Flex与Java集成应用的方法...
### Flex LCDS 的基础知识及应用实例 #### 一、什么是 Flex LCDS? LCDS (LiveCycle Data Services) 是一种由 Adobe 提供的数据服务技术,它主要用于增强 Flex 应用程序与后端服务之间的数据交互能力。LCDS 基于 ...
2. **配置服务**:在Java端,你需要创建一个Spring或其它IoC容器管理的服务,然后使用BlazeDS或LCDS提供的配置文件(如`services-config.xml`)来暴露这些服务。在Flex端,`services-config.xml`也需要配置以指向...
8. **示例图片**:这部分可能包含用于演示或解释flexstore应用功能的图像资源,如UI设计图、工作流程图等,帮助开发者理解应用的视觉呈现和工作原理。 综上所述,flexstore项目是一个综合性的示例,涵盖了Flex前端...