实现flex做前台,通过BlazeDS和spring,hibernate进行集成。
参考资料:
http://www.ibm.com/developerworks/cn/web/0912_zouxiang_flex_spring/
http://www.ibm.com/developerworks/cn/java/j-lo-jeeflex/
实现步骤:
1. 安装BlazeDS: 将 blazeDs.war复制到对应j2ee服务器的webapps目录下。
2. 新建flex 项目,选择j2ee,并选择使用 blazeDS进行
3。 修改web.xml中,加入listener
<listener> <listener-class>flex.messaging.HttpFlexSessionlistener-class> listener>
<servlet> <servlet-name>Spring MVC Dispatcher Servletservlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet servlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value>/WEB-INF/applicationContext.xmlparam-value> init-param> <load-on-startup>1load-on-startup> servlet>
修改applicationContex.xm 将servlet请求映射到 spring 管理的messagebroker中 ,定义 MessageBrokerFactoryBean 工厂 Bean 用于创建 MessageBroker
重点: 一定要注意增加的Lib包
1. 使用amf协议连接后端java程序
httpService通过http请求访问url,可以不使用BlazeDS,但BlazeDs提供了跨域访问和日志等服务。
WebService支持SOAP兼容的WebService
RemoteObject是效率最高、最常用的组件
2. 支持点对点、发布/订阅的消息服务
可以构建实时通信或多点数据同步的系统。
Flex通过客户端消息API发送消息到BlazeDS服务器中的destination,并从这接收消息。消息在Channel中传输,在Endpoint中处理。BlazeDS可以将消息推送到链接至它的客户端,此时BlazeDS使用destination广播消息,所有订阅此destination的Flex应用都可以接受消息。
BlazeDS还可以借助JMSAdapter支持嵌入或外部的JMS服务,使用JMS的topic和queue
3. 配置服务、安全服务和日志服务
使用BlazeDs提供的安全服务接口集成自定义或标准的Java EE应用服务器的验证与授权服务,用于验证Flex用户的合法性,类似于spring的安全验证;还提供基于Https的加密通信。
可以对日志的级别、目标、类别进行配置
客户端:
服务端
服务器调用序列图
Operation代表远程服务中的一个方法,如 mx.rpc.remoting.Operation是RemoteObject调用远程服务中的方法。
AsyncRequest实现异步请求,并保证异步请求的正确性
ChannelSet和Channel:存在于前端,用来传递消息的管道,不同的协议或格式有对应的Channel,如AMF协议使用AMFChannel,PollingChannel传递轮询消息。
MessageBrokerServlet:完成Channel和EndPoint的匹配,并将EndPoint处理结果回写入Http响应流。当收到Http请求后,MessageBrokerServlet的service方法将request,response保存到FlexContext对象中,然后验证客户端身份(可选),调用EndPoint处理请求。FlexContext是线程安全的容器,可以访问Request,Response,FlexClient,FlexSession对象。
EndPoint:接收Channel传递来的消息
Service: EndPoint委托其来处理消息,防止EndPoint和消息类型耦合,如AmfEndPoint可以接受RemotingMessage,也可接收HttpMessage,AmfEndPoint会把RemotingMessage委托给RemotingService。EndPoint根据消息的destination获得合适的service,并调用service的serviceMessage处理消息。有三类Service:RemotingService(RemotingObject), HTTPService(HttpService和WebService),MessageService(Producer)
Destination和Adapter:都是service的子组件。Destination表示消息的目的地,Adapter适配services和客户组件。Destination使用的Adapter不同代表不同的客户组件,如JMSAdapter的destination代表一个消息主题或队列,JavaAdapter的destination代表Java对象。Adapter解耦消息类型和处理方式,如ActionScriptAdapter和JMSAdapter都可处理AsyncMessage,而Service解耦消息类型和传输协议。Service通过destination找到Adapter,通过Adapter的invoke方法激活destination代表的客户组件
Message:前后台传递数据的方式,最重要的属性是destination和body,远程调用基于RPCMessage,消息服务使用AsyncMessage
Producer和Consumer都有destination(消息的远程目的地)和subtopic(消息的类别)属性,使用步骤:
1. 发布消息:创建AsyncMessage的实例,调用Producer.send方法
2. 订阅消息:Consumer.subscribe订阅,订阅完后就可以接受消息,有两种方法:主动(使用实时轮询channel,监听acknowledge事件)和被动(调用Consumer。Receive接受)。不需要接收消息时,使用Consumer.unsubscribe取消订阅
3. 代码实例:
<mx:Producer id=”producer” destination=”echo” />
<mx:Consumer id=”consumer” destination=”echo” message=”onReceive(event)”>
点按钮时:
Var msg:AsyncMessage=new AsyncMessage();
msg.body=“测试数据”
producer.send(msg)
接收消息:
Init() 中 consumer.subscribe()
Function onReceive(event:MessageEvent) {
event.message.body; //消息内容
消息服务配置 messaging-config.xml
配置 echo的destination
<destination id=”echo”>
<channels>
<channel ref=”my-polling-amf” />
</channels>
</destination>
提供了as对象和 Java对象、SOAP对象之间的序列化功能
使用方法:
在as类中 [RemoteClass]指定服务器端对应的类 (必须)
[RemoteClass(alias="cn.cstnet.cstnms.config.bean.TrafObj")]
[Transient]标记as中不需要序列化的属性
非public属性、只读、静态属性不能序列化
As——》Java
As中的Array索引可以为数字或字符串,如果为数字转换为List,如果为字符串转换为Map。
动态Object转换为Map
静态Object转换为Object
Undifined、null——》null
Java——》As
Collection——》ArrayCollection
Object[]——》Array
Map/Dictionary——》动态Object
Null——》null
自定义序列化
Flex端可实现IExternalizable,Java实现Externalizable
FlexClient对应浏览器的flash player实例,BlazeDS服务器接收到flash player的链接请求后,创建FlexClient对象保存私有会话数据,在一个Player中只有一个实例存在。
FlexSession代表Flex应用程序和BlazeDS服务的链接,是协议相关的,与Session的生命周期一致。
如果firefox多个tab打开多个flash player,他们对应一个FlexSession,多个FlexClient。而一个flash player中如果用到多种协议,如Http和RTMP,则会创建两个FlexSession
Channel是前端用到的,需要使用 –services指定编译参数
{context.root}对应工程属性 Flex Server
对于每个<destination>可以指定adapter和channel,scope,如果Java对象是全局无状态对象,可指定其scope为application
可以配置级别、显示格式(前缀、时间、日期、级别和类别等)、目标(默认的目标是ConsoleTarget,改为flex.messaging.log.ServletLogTarget可使用servlet日志文件作为目标)、过滤条件(类似于log4j.logger.com.ibatis,可参考接口flex.messaging.log.LogCategories)
假设需要根据数据库中的记录动态创建service adapter或destination,有两种方式:
1. 使用Bootstrap Service,在启动时动态配置
创建类继承于AbstractBootstrapService,在initialize方法中创建RemotingDestination
在xml中的<services>中配置该service
2. 使用远程对象,由外部条件触发
可以被动接受外部的输入,而不是主动从数据库中读取
定义远程java对象 DestinationBuilder;创建MessageDestination