《BlazeDS开发指南》学习笔记.doc_第1页
《BlazeDS开发指南》学习笔记.doc_第2页
《BlazeDS开发指南》学习笔记.doc_第3页
《BlazeDS开发指南》学习笔记.doc_第4页
《BlazeDS开发指南》学习笔记.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(一):概述关键字: blazeds, flex, java, 开发指南 一、概述BlazeDS是Adobe公司发布的免费开源产品,是该公司另一个收费产品LCDS的简化开源版本,BlazeDS使用Java语言在服务端提供如下功能:1、提供客户端(Flex、AIR)通过AMF协议访问服务端(Java)数据的功能;2、提供服务端广播数据给多个客户端的功能;3、提供客户端与客户端实时通信的功能;一个BlazeDS应用程序包括两个部分:客户端应用程序和服务端J2EE应用程序,如下图:客户端程序:一个BlazeDS应用的客户端程序一般为Flex或AIR,而Flex或AIR程序通过Flex SDK中的控件RemoteObject、HTTPService、Producer、Consumer与BlazeDS服务端通信,另外,你也可以结合Flex、HTML和JavaScript技术来构建客户端程序,更可以在HTML和JavaScript中使用Ajax客户端库来与BlazeDS通信。服务端程序:BlazeDS服务端运行在基于J2EE的Web服务器中,通过如下配置可以使得一个J2EE Web服务器支持BlazeDS:1、拷贝BlazeDS的jar文件和相关依赖jar文件到WEB-INF/lib目录下;2、编辑WEB-INF/flex目录下BlazeDS的配置文件;3、在WEB-INF/web.xml文件中定义MessageBrokerServlet和Session监听器;二、特点下图详细展示了BlazeDS的主要特点:1、RPC Services(RPC服务):RPC服务被设计成为调用和响应的模式,这对应用程序访问外部数据是一种很好的选择,它能够使客户端异步请求远程服务并直接把结果返回,在具体程序中,可以使用客户端的RPC控件如HTTP GET或HTTP POST(HTTP Services)、SOAP(Web Services)、Java Objects(RemoteObject Services)访问RPC Services。如果你想通过使用RPC Services提供一些企业级功能,如不同域之间数据交换的代理功能、客户端认证、服务器端日志、本地化支持、RPC Services服务集中化管理等功能时,BlazeDS通过使用RemoteObject控件可以轻松实现,而不需要配置他们像SOAP-compliant网络服务。当客户端RPC控件调用远程服务时,该控件就会把服务端返回的数据保存在一个ActionScript对象中,这样,在程序中就能够很轻松的获取该要的数据,而这些客户端控件包括HTTPService、WebService、RemoteObject控件。2、Messaging Services(消息服务):消息服务就是通过服务器端来回的传送消息以实现客户端的异步交流,一条消息由唯一标识号、BlazeDS头、其他自定义头和消息体组成。客户端程序中发送消息的部分称为消息生产者(producers),在Flex程序中可以通过Producer控件定义,而接收消息的部分称为消息消费者(consumer),在Flex中可以通过Consumer控件定义,Consumer控件负责订阅和接收服务器端某一个目的地的消息,而Producer控件负责向该目的地发送消息。消息服务同时也支持通过JMSAdapter实现的桥接模式来访问外部的JMS服务器,这使得Flex程序能够与外部的Java应用程序实现数据交流。3、Service adapters:BlazeDS可以访问各种不同的数据持久化方案,比如数据库、JMS等其他持久化机制。4、The message-based framework(基于消息的框架):BlazeDS在客户端和服务器端来回的传送数据,他是一个基于消息的框架,主要运用了两种交换模式,第一种,请求/响应模式,客户端发送请求给服务端,服务端处理好之后返回一个包含结果的响应,RPC服务就是使用的这种模式;第二种,发布/订阅模式,服务端将数据发布给订阅了该消息的客户端列表,消息服务就是使用这种模式来发布数据给各客户端的,同时,消息服务也使用请求/响应模式来解决一些发布消息、数据交换等问题。5、Channels and endpoints(通道和端点):在网络上,客户端是通过通道与服务端传送数据的,通道负责封装消息格式、网络协议、解析方式、目的和应用代码,负责格式化和翻译消息为特定网络下的模式,然后分发给相应的端点。另外,通道使得客户端发送给服务端的消息变得有序性和对应性,这对数据传送的一致性和可预见性起到重要的作用。在服务器端,通道是与基于Java的端点发生交换的,端点负责解析消息成特定的协议模式,然后把它传送给普通Java形式的“消息代理人”(Message Broker),最终由消息代理人决定该消息发往何处,路由给恰当的目的地,详细如下图所示:6、Channel types(通道类型):BlazeDS提供以下几种通道:(1)标准AMF通道;(2)加密AMF通道;(3)HTTP通道(AMFX)。其中AMF和HTTP通道都支持无轮询的请求/响应模式和客户端轮询模式(模拟实时通信),而AMF和HTTP流通道模式提供了真正的数据流实时模式。(二):两个示例关键字: blazeds, flex, java, 开发指南 按照手册内容,这里给出两个客户端和服务端示例代码,你可以编译、部署到BlazeDS服务器中进行体验,我使用的编辑器是Eclipse 3.4 + Flex Builder Plunin3.0.1,BlazeDS使用的二进制包,服务器是Tomcat 6.0.18,而构建一个BlazeDS应用程序的一般流程如下:1、在WEB-INF/flex目录下的配置文件(一般为remoting-config.xml)中配置一个目的(destination),用他来进行客户端和服务端数据交换;2、在WEB-INF/flex目录下的配置文件(services-config.xml)中配置一个通道(channel),用它来封装数据以进行数据的网络传送;3、用MXML或者ActionScript编写Flex客户端;4、将客户端程序编译为SWF文件,并将它部署在BlazeDS服务器中。一、RPC服务例子Remoting Service是BlazeDS服务器中RPC服务的一种,它能够让客户端访问服务端POJOs的方法。在这个例子中,首先在服务端部署一个Java类:EchoService,用来返回客户端发送过来的字符串,具体代码如下:Java代码 1. packageremoting; 2. 3. publicclassEchoService 4. 5. publicStringecho(Stringtext) 6. returnServersays:Ireceived+text+fromyou; 7. 8. package remoting;public class EchoServicepublic String echo(String text) return Server says: I received + text + from you;echo()方法带有一个字符串的参数,并将它与另外一些字符串组合后返回。将该文件编译,把生成的EchoService.class文件拷贝到WEB-INF/classes/remoting目录下。接下来,在WEB-INF/flex/remoting-config.xml文件中定义目的,代码如下:Xml代码 1. 2. 3. remoting.EchoService4. 5. remoting.EchoServicesource定义了目的相对应的具体Java类,而channels定义了该目的使用的通道,而通道的定义则在WEB/flex/services-config.xml文件中定义,具体如下:Xml代码 1. 2. 3. 4. false5. 6. false服务端的工作完成了,如果使用的是BlazeDS的二进制版本(blazeds.war),在Flex Builder环境下,其中通道的定义默认就完成了,而在目的的定义中,存在一个默认的通道配置(default-channels),所以,在定义目的的时候如果是使用的默认通道配置也可以省略通道。客户端编码主要就是Flex的开发,用到的控件主要就是RemoteObject,在该示例中就是很简单的在文本框中显示返回的结果,代码如下:Xml代码 1. 2. 3. 4. 5. 25. 26. 27. 28. 29. 30. 31. 32. 将该文件编译成SWF文件,然后部署到BlazeDS服务器中,启动Tomcat服务器,在浏览器中浏览该文件,将会看到运行的结果,如下图。(三):两个示例关键字: blazeds, flex, java, 开发指南 在上一篇文章中已经介绍了第一例子,RPC服务,在该篇文章中介绍另一个例子,消息服务。二、消息服务例子消息服务可以使得客户端发送和接收其他客户端的消息,在该例子中,接收和发送消息是基于同一个BlazeDS目的(destination)的。首先,在WEB-INF/flex/messaging-config.xml文件中定义消息目的,代码如下:Xml代码 1. 上面使用的通道“my-amf-poll”在WEB-INF/flex/services-config.xml文件中定义,代码如下:Xml代码 1. 2. 3. 4. true5. 16. 7. true1上面定义了一个每隔一秒钟轮询一次的轮询通道,轮询是主动更新客户端数据的最简单方法,另外还可以配置的参数有piggybacking,long-polling和streaming。在Flex客户端程序中,使用Producer控件发送消息,使用Consumer控件接收服务端返回的消息。发送消息时,首先创建一个AsyncMessage类的实例,然后设置该实例的body属性为具体要发送的内容,最后调用Producer的send()方法将消息发送给服务器;对于接收消息,在程序初始化时,就应该调用Consumer的subscribe()方法订阅Producer指定destination的服务器消息,服务器端有消息返回时,会自动调用Consumer的message指定的方法,详细代码如下:Xml代码 1. 2. 3. 4. 5. 27. 28. 29. 30. 31. 32. 33. 将上面文件编译为SWF,并部署到BlazeDS服务器中,在浏览器中进行体验,如图:BlazeDS与Spring结合的工厂类分析关键字: blazeds, spring, flex, java BlazeDS开发指南的第十六章介绍了BlazeDS的一种扩展方法通过工厂类,可以自定义出各种控件以满足实际应用中的需求,在这章中给出了一个与Spring结合的方法,下面先给出具体代码,然后再详细分析一下,个人拙见,如有错误,希望指出,具体代码工程见附件,其中包括一个spring-flex.jar的包,在实际应用中可以直接拷贝到类路径中。Java代码 1. publicclassSpringFactoryimplementsFlexFactory 2. 3. /工厂源配置名称,在flex配置文件中用到。 4. privatestaticfinalStringSOURCE=source; 5. 6. /该方法用于初始化该工厂,会在配置文件中自动调用。 7. Override8. publicvoidinitialize(Stringid,ConfigMapconfigMap) 9. 10. 11. 12. 13. /该方法在一个destination被实例化时调用。 14. Override15. publicFactoryInstancecreateFactoryInstance(Stringid,ConfigMapproperties) 16. 17. SpringFactoryInstanceinstance=newSpringFactoryInstance(this,id,properties); 18. instance.setSource(properties.getPropertyAsString(SOURCE,source); 19. returninstance; 20. 21. 22. /返回一个指定source和property的工厂实例,该方法会在每次服务请求时自动调用。 23. Override24. publicObjectlookup(FactoryInstanceinst) 25. 26. SpringFactoryInstancefactoryInstance=(SpringFactoryInstance)inst; 27. returnfactoryInstance.lookup(); 28. 29. 30. classSpringFactoryInstanceextendsFactoryInstance 31. 32. /构造函数。 33. SpringFactoryInstance(SpringFactoryfactory,Stringid,ConfigMapproperties) 34. 35. super(factory,id,properties); 36. 37. 38. /由Servlet容器中获取上下文内容(context),然后根据配置源获取Spring中创建的Bean。 39. Override40. publicObjectlookup() 41. 42. ApplicationContextappContext=WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext(); 43. StringbeanName=getSource();/配置文件中声明的源(也即一个bean的名字)。 44. 45. try46. 47. returnappContext.getBean(beanName);/返回Spring中创建的bean。 48. 49. catch(NoSuchBeanDefinitionExceptionnexc)/没有找到指定的bean。 50. 51. ServiceExceptione=newServiceException(); 52. Stringmsg=Springservicenamed+beanName+doesnotexist.; 53. e.setMessage(msg); 54. e.setRootCause(nexc); 55. e.setDetails(msg); 56. e.setCode(Spring.Processing); 57. throwe; 58. 59. catch(BeansExceptionbexc)/创建bean出错。 60. 61. ServiceExceptione=newServiceException(); 62. Stringmsg=UnabletocreateSpringservicenamed+beanName+.; 63. e.setMessage(msg); 64. e.setRootCause(bexc); 65. e.setDetails(msg); 66. e.setCode(Spring.Processing); 67. throwe; 68. 69. 70. 71. Override72. publicStringtoString() 73. 74. returnSpringFactoryinstanceforid=+getId()+source=+getSource()+scope=+getScope()+.; 75. 76. 77. public class SpringFactory implements FlexFactory/工厂源配置名称,在flex配置文件中用到。private static final String SOURCE = source;/该方法用于初始化该工厂,会在配置文件中自动调用。Overridepublic void initialize(String id, ConfigMap configMap)/该方法在一个destination被实例化时调用。Overridepublic FactoryInstance createFactoryInstance(String id, ConfigMap properties)SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);instance.setSource(properties.getPropertyAsString(SOURCE, source);return instance;/返回一个指定source和property的工厂实例,该方法会在每次服务请求时自动调用。Overridepublic Object lookup(FactoryInstance inst)SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;return factoryInstance.lookup();class SpringFactoryInstance extends FactoryInstance/构造函数。SpringFactoryInstance(SpringFactory factory, String id, ConfigMap properties)super(factory, id, properties);/由Servlet容器中获取上下文内容(context),然后根据配置源获取Spring中创建的Bean。Overridepublic Object lookup()ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext();String beanName = getSource(); /配置文件中声明的源(也即一个bean的名字)。tryreturn appContext.getBean(beanName); /返回Spring中创建的bean。catch(NoSuchBeanDefinitionException nexc) /没有找到指定的bean。ServiceException e = new ServiceException();String msg = Spring service named + beanName + does not exist.;e.setMessage(msg);e.setRootCause(nexc);e.setDetails(msg);e.setCode(Spring.Processing);throw e;catch(BeansException bexc) /创建bean出错。ServiceException e = new ServiceException();String msg = Unable to create Spring service named + beanName + .;e.setMessage(msg);e.setRootCause(bexc);e.setDetails(msg);e.setCode(Spring.Processing);throw e;Overridepublic String toString()return SpringFactory instance for id= + getId() + source= + getSource() + scope

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论