创建一个简单的远程应用:
- 从BlazeDS中将blazeds.war解压到应用服务器的部署目录下。比如,在JBoss下,解压到
/server/default/deploy/blazeds.war - 启动Eclipse和Flex Builder
- 创建一个新的Java项目来配置BlazeDS,向web应用中添加Java类。
- 将项目命名为“blazeds_server”
- 从现有资源中创建该项目,使用先前部署的BlazeDS WAR的WEB_INF文件夹路径,比如:
/server/default/deploy/blazeds.war/WEB-INF/ - 在build路径下添加src目录
- 将WEB-INF/classes目录作为输出目录
- 创建一个名为HelloWorld.java的新Java类,类的定义为:
public class HelloWorld {
public String sayHello(String name) {
return "hello, " + name;
}
} - 修改BlazeDS配置,使它支持向HelloWorld远程发送请求。这需要在WEB-INF/flex文件夹下的config.xml文件中添加消息终端的配置,具体配置可参照如下代码:
<destination id="HelloWorld">
<properties>
<source>HelloWorld</source>
</properties>
</destination> - 启动应用服务器,确定web应用可以通过下面这个地址访问(端口号由应用服务器配置决定):http://localhost:8080/blazeds/
(假如服务器配置并未允许显示目录下的内容的话,你会得到404错误,但这没什么关系) - 创建一个新Flex项目
- 将项目命名为“testHelloWorld”,应用服务器类型则选择“J2EE”
- 选择“Use remote object access service”和LiveCycle Data Services
- 将WAR文件部署的位置声明为根目录
- 将根ULR声明为:http://localhost:8080/blazeds(端口号由应用服务器配置决定)
- 将上下文根目录声明为:/blazeds
- 确定配置并点击“完成”
- 创建Flex应用,将下列代码替代testHelloWorld.mxml中的内容:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:RemoteObject id="ro" destination="HelloWorld"/>
<mx:TextInput id="n" change="ro.sayHello(n.text)"/>
<mx:Label text="{ro.sayHello.lastResult}"/>
</mx:Application> - 运行该应用,在文本框中输入你的名字,文本框的正下方你可以看到“hello, <你的名字>”,如下图所示:
注释:该Flex应用使用了RemoteObject类库来与支持BlazedDS的服务器通信。当用户在文本框中输入内容的时候,文本框的change事件促使RemoteObject向服务器发出请求。于是,服务器紧接着向定义了的远程终端Java类发送请求,这个时候也有可能调用Spring服务或者EJB session bean,但本例调用的是POJO。本例中,POJO的返回值仅仅是在向它发送的值之前添加了“Hello,”的字符串。在对象返回值的时候,这个返回值会系列化到AMF中,进而返回给Flex应用。然后,RemoteObject类库将该值赋值给ro.ro.sayHello.lastResult
)。最后的结果也可以通过RemoteObject上的result事件获得。数据绑定的过程中,文本框的标签就相应显示为POJO返回的字符串。BlazeDS同时也支持Java对象类的传递。
下一步,我们将创建一个使用BlazeDS消息系统的Flex应用。
- 首先,在WEB-INF/flex目录下的messaging-config.xml文件中添加消息终端配置。添加下面这个终端:
<destination id="chat"/>
消息终端的配置使得消息系统能够将消息转发给正在监听该终端消息的客户。消息终端可以配置持久时间和网络参数,同时也可以连接到其它的消息系统,比如JMS。 - 重新启动应用服务器,这样一来,BlazeDS会配置新的消息终端。
- 创建一个新Flex项目
- 将项目命名为“testChat”
- 应用服务器类型选择“J2EE”
- 选择“Use remote object access service”和LiveCycle Data Services
- 将部署的WAR文件位置声明为Root目录
- 将根URL声明为:http://localhost:8080/blazeds(端口号由应用服务器配置决定)
- 将上下文根目录声明为:/blazeds
- 确定配置并点击“完成”
- 创建一个简单的使用消息系统的聊天应用程序,用下列代码替代testChat.mxml中内容:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="cons.subscribe()">
<mx:Script>
import mx.messaging.messages.AsyncMessage;
</mx:Script>
<mx:Producer id="prod" destination="chat"/>
<mx:Consumer id="cons" destination="chat" message="c.text += event.message.body.msg + '\n'"/>
<mx:TextArea id="c" width="300" height="300"/>
<mx:TextInput id="m"/>
<mx:Button label="Send" click="prod.send(new AsyncMessage({msg: m.text}))"/>
</mx:Application> - 运行该应用。在页面底部的文本框中输入一条消息,点击“Send”。确定所发送的消息正确显示在第一个文本域中,同时确定在打开多个浏览窗口的前提下,消息也可以在这些窗口间传递。
注释:Producer对象允许Flex应用向消息系统中发送消息。另外,还有一个Java API(本例中没有用到)也可以用来向服务器上的消息系统发送消息。通过第三方适配器或服务器自带的JMS适配器,你也可以将自身的消息系统连接到其它的消息系统,但默认配置并不支持它与另外的消息系统的连接。用户点击“Send”的时候,某个匿名对象会创建一条新消息,并将消息体中的msg属性值设置为文本框中输入的内容。由于消息的类型是AsyncMessage,所以AsyncMessage类是必需引入的。Consumer对象使得Flex应用能够监听消息。应用会在其初始化的时候在消息系统中进行注册,之后,一旦收到消息,Consumer上的事件处理器则会将从消息体中取得聊天消息显示在文本域中。
BlazeDS和AMF的使用可以帮助减短开发周期,推动应用运行的速度。何不尝试一下BlazeDS,我们很期待你的反馈。在Adobe Labs站点的BlazeDS页面上,你可以找到很多BlazeDS的相关内容以及AMF的公开规范说明。