本文源代码下载地址:
http://flashview.ddvip.com/2009_04/flex4-lesson3.zip
在flex中有多种对象可用于与server交互,有URLLoader、HttpService、WebService、RemotingObject、Socket,NetConnection等:
1,URLLoader与HttpService多种于加载静态文本文件。
2,WebService基于soap协议,效率虽不及Remoting,但可移植性好,与平台、语言完全解藕。
3,Remoting采用amf通讯协议,通讯效率被认为是WebServive的10倍。目前已有多种成熟的服务端框架可供选用,.Net有fluorineFx,php有amfphp,java有blazeDS。WebORB同时有支持多个语言的版本,如同pureMVC一般。python、ruby等也均实现了amf。
无论使用哪一种server端语言,Remoting均采用统一的配置。加上目前多种语言已实现amf通讯协议,移植已不成问题。因此,Remoting应该是flex目前最好的与server端交互的方式。
一,在Google App中使用WebORB
既如此,我想把我的hello world程序修改一下,用Remoting与server交互。我采用WebORB做为remoting server,配置步骤如下:
1,下载build of WebORB for Google App Engine解压缩至任何地方
2,把WEB-INF/classes目录的两个文件weborb-acl.xml, weborb-config.xml拷贝到gapp_flexblog/src目录下
3,把WEB-INF/lib目录下的三个jar文件拷贝到war/WEB-INF/lib目录下
4,把WEB-INF/flex目录直接拷贝到war/WEB-INF目录下
5,把WEB-INF/web.xml的内容与war/WEB-INF/web.xml进行merge,完成后内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!– parameter used by the ActiveMQ broker initializer. The parameter
contains the path to start the broker on –>
<context-param>
<param-name>ActiveMQBrokerPath</param-name>
<param-value>tcp://localhost:61616?trace=true</param-value>
</context-param>
<filter>
<filter-name>fileuploadfilter</filter-name>
<filter-class>weborb.util.upload.MultiPartFilter</filter-class>
<init-param>
<param-name>deleteFiles</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>fileuploadfilter</filter-name>
<url-pattern>*.wo</url-pattern>
</filter-mapping>
<listener>
<listener-class>weborb.thirdparty.ActiveMQStarter</listener-class>
</listener>
<listener>
<listener-class>weborb.ORBServletContextListener</listener-class>
</listener>
<!– Servlets –>
<servlet>
<servlet-name>greetServlet</servlet-name>
<servlet-class>sban.flexblog.server.GreetingServiceImpl</servlet-class>
</servlet>
<servlet>
<servlet-name>helloWorld</servlet-name>
<servlet-class>sban.flexblog.server.HelloWorldServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>weborb</servlet-name>
<servlet-class>weborb.ORBServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>weborb.DownloadServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/codegen.wo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>weborb</servlet-name>
<url-pattern>*.wo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>greetServlet</servlet-name>
<url-pattern>/gapp_flexblog/greet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/gapp_flexblog/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
welcome-file-list是欢迎页面列表。
二,使用remoting
在sban.flexblog命名空间下,添加一个HelloWorld.java文件,代码如下:
package sban.flexblog;
public class HelloWorld {
public String greet(String name)
{
return "Hi " + name + ", this message comes from remoting.";
}
}
呵呵,这个类非常简单,也不用继承HttpServlet什么的。好了,现在来写我们的客户端代码。把原Index.mxml文件修改内容如下:
<?xml version="1.0" encoding="utf-8"?>
<FxApplication xmlns="http://ns.adobe.com/mxml/2009">
<Script>
<![CDATA[
import mx.controls.Alert;
import flash.net.URLLoader;
import flash.net.URLRequest;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.AbstractOperation;
import mx.rpc.remoting.RemoteObject;
private function greetViaRemoting() : void
{
var ro : RemoteObject = new RemoteObject("GenericDestination");
ro.source = "sban.flexblog.HelloWorld";
ro.endpoint = "http://localhost:8080/weborb.wo";
var op : AbstractOperation = ro.getOperation("greet");
op.addEventListener(
ResultEvent.RESULT,
function(event : ResultEvent) : void
{
Alert.show( event.result.toString() );
}
);
op.addEventListener(FaultEvent.FAULT,
function(event : FaultEvent) : void
{
Alert.show(event.fault.toString());
}
);
op.send(vNameTxt.text);
}
]]>
</Script>
<VGroup>
<FxTextInput id="vNameTxt" text="sban" />
<HGroup>
<FxButton id="vSendBtn2" label="remoting greet"click="greetViaRemoting()" />
</HGroup>
</VGroup>
</FxApplication>
修改app_flexblog_client的输出目录为gapp_flexblog的输出目录。两个项目的输出现在合二为一了。这样以后再测试项目,就不用再分别运行两个project了。
ok,上面弹出窗所示,正是服务端返回的内容。单出eclipse工具栏中的Deploy Google App按纽。发布完毕,运行,不好,出现了error:
var ro : RemoteObject = new RemoteObject("GenericDestination");
ro.source = "sban.flexblog.HelloWorld";
ro.endpoint = "/weborb.wo";
编译,再次布署,访问,现在已经没有问题了:
endpoint用”/weborb.wo”在于web.xml有如下一段定义:
<servlet>
<servlet-name>weborb</servlet-name>
<servlet-class>weborb.ORBServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
…
<servlet-mapping>
<servlet-name>weborb</servlet-name>
<url-pattern>*.wo</url-pattern>
</servlet-mapping>
玄机在weborb.ORBServlet中,WebORB使用它做为处理remoting调用的入口。
我们之所以可以以GenericDestination作为RemoteObject的destination,源于在war/WEB-INF/flex/remoting-config.xml文件中有如下一段定义:
<destination id="GenericDestination">
<properties>
<source>*</source>
</properties>
</destination>