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里面指定即可。这是个异步请求,服务器会返回resultfault事件,分别对应成功和失败。可以把返回的结果直接绑定到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对象,如果不加以指定类型,就成为一个动态对象。远程访问也是异步的,resultfault事件,分别对应成功和失败。

    示例:在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”。

    startfeed.jsp <% try { Feed feed = new Feed(); feed.start(); out.println("Feed Started"); } catch (Exception e) { out.println("A problem occured while starting the feed: "+e.getMessage()); } %>

    Feed.java import java.util.*; import flex.messaging.MessageBroker; import flex.messaging.messages.AsyncMessage; import flex.messaging.util.UUIDUtils; public class Feed { private static FeedThread thread; public Feed() { } public void start() { if (thread == null) { thread = new FeedThread(); thread.start(); } } public void stop() { thread.running = false; thread = null; } public static class FeedThread extends Thread { public boolean running = true; public void run() { MessageBroker msgBroker = MessageBroker.getMessageBroker(null); String clientID = UUIDUtils.createUUID(); Random random = new Random(); double initialValue = 35; double currentValue = 35; double maxChange = initialValue * 0.005; while (running) { double change = maxChange - random.nextDouble() * maxChange * 2; double newValue = currentValue + change; if (currentValue < initialValue + initialValue * 0.15 && currentValue > initialValue - initialValue * 0.15) { currentValue = newValue; } else { currentValue -= change; } AsyncMessage msg = new AsyncMessage(); msg.setDestination("feed"); msg.setClientId(clientID); msg.setMessageId(UUIDUtils.createUUID()); msg.setTimestamp(System.currentTimeMillis()); msg.setBody(new Double(currentValue)); msgBroker.routeMessageToService(msg, null); System.out.println("" + currentValue); try { Thread.sleep(300); } catch (InterruptedException e) { } } } } }

    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 学习笔记 (一) --- BlazeDS的功能原理及配置实例相关推荐

  1. JavaWeb黑马旅游网-学习笔记02【注册功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  2. JavaWeb-综合案例(用户信息)-学习笔记02【登录功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  3. 模电学习笔记 (一) 晶体三极管工作原理

    大家好,我是一名从事硬件电路设计的小工程师一名.我决心从今天开始撰写自己的博客,一方面是为了对知识进行总结记录,加深理解与认识,另一方面希望大家可以多多批评指正,同时结识更多志同道合的朋友,一起学习进 ...

  4. Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  5. FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程

    FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程 很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序 ...

  6. Halcon学习笔记(一):Qt+Halcon联合开发配置

    Halcon学习笔记(1):Qt+Halcon联合开发配置 首先是新建一个QT项目qtest_hc 方法一: 1)QT项目文件 qtest_hc 添加库: #1.包含目录添加 INCLUDEPATH ...

  7. Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践

    文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...

  8. Cadence学习笔记第9讲-元件原理图库的创建-20191116

    Cadence学习笔记第9讲-元件原理图库的创建-20191116 本人 也是刚刚学习,如有错误欢迎指正. 在开始设计原理图前,我们需要创建所需要的器件的原理图,这时就需要库,原理图库来存放器件的原理 ...

  9. 最大熵学习笔记(二)最大熵原理

    生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Prin ...

  10. openGl新手入门学习笔记(二)下载glew,配置glew的环境与glew的初始化

    这里是一个想要入行游戏行业的平平无奇大学生,希望能够通过写博客来巩固自己学的知识. 一.现代OpenGl 在"openGl新手入门学习笔记(一)"里提到了古典openGl(旧版op ...

最新文章

  1. 推荐8个能极大提高办公效率的软件,让你告别加班
  2. CVPR2020事件相机(Event Camera)研究文章汇总
  3. python 决策树和随机森林_【python机器学习笔记】使用决策树和随机森林预测糖尿病...
  4. TLS实现代码段加密
  5. 微型计算机原理中LEA,微型计算机系统原理及应用(第2版)第2章
  6. 物联网蓝牙模WiFi无线模块技术和ZigBee技术再智能家具领域发展对比?
  7. iso22000食品安全管理体系_食品安全管理体系ISO22000:2018澄清了两个层次PDCA的区别,具体怎么样的...
  8. c++ 设计模式_设计模式行为型:观察者模式(ObserverPattern)
  9. 网友爆料乘顺风车被司机拿刀砍伤:或面临截肢危险...
  10. MNIST手写数字数据集格式,如何读取MNIST数据集?
  11. python数据分析与excel_读Python数据分析基础之Excel读写与处理
  12. 为ESXi 4.x / 5.x / 6.x / 7.x创建持久暂存位置(1033696)
  13. ucosiii 钩子函数
  14. Java|二叉树基础详解
  15. net user administrator /passwordreq:yes 错误
  16. 一个php+ajax的在线匿名聊天室,PHP任意环境都可用,无需复杂配置,移动端电脑端互通流畅,随时随地聊个痛快~
  17. 如何提高推荐量?新手必知 头条号推荐机制
  18. oracle漏洞pdf,Oracle DBA手记 4 数据安全警示录 pdf完整扫描版版
  19. wlan连接的笔记本电脑+开启移动热点+手机无法连接【已解决】
  20. 基于C#-winform的书店采购管理系统的设计

热门文章

  1. 浅析软文标题写作的三个问题
  2. Openbravo3.0 客户端代码开发与API
  3. 2018-2-13-windows-10预览版升级win10-7月29-10240.16384
  4. 《房地产证》与《房屋所有权证》或《房产证》有什么区别
  5. 清理服务器系统日志,win2008服务器清理系统日志
  6. 分享一下申请CSDN博客专家成功后的好处
  7. 分享55个计数统计PHP源码,总有一款适合你
  8. Pygame库200行代码实现简易飞机大战的小游戏
  9. 《数解道法》(一)前言
  10. 《创业36条军规》读书笔记