[Flex]flex选修课之第三课:使用Remoting服务

第三课:使用Remoting服务

在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有blazeDSWebORB同时有支持多个语言的版本,如同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的输出目录,即${DOCUMENTS}\gapp_flexblog\war。两个项目现在合二为一了,重新编译一下。这样以后再测试项目,就不用运行两个project了。
helloworld-entry

helloworld-alert

ok,上面弹出窗所示,正是服务端返回的内容。单出eclipse工具栏中的Deploy Google App按纽。发布完毕,运行,不好,出现了error:

endpoing-error.jpg

这是由于我们把endpoint写成了本地测试地址(http://localhost:8080/weborb.wo)所致。既然现在Flex程 序的输出目录与server端输出目录是相同的,我们可以把endpoing修改为”/weborb.wo”,修改后局部代码如下:

var ro : RemoteObject = new RemoteObject("GenericDestination");
ro.source = "sban.flexblog.HelloWorld";
ro.endpoint = "/weborb.wo";

编译,再次布署,访问,现在已经没有问题了:

remote-ok.jpg

helloworld-alert

远程也可以了,但是,
1,为什么RemotingObject的destination要用GenericDestination?为什么endpoint是/weborb.wo?
2,WEB-INF/flex目录下的四个文件的作用是什么?
3,为什么要拷贝weborb的三个jar文件到lib目录下?

等等类似的与Remoging有关的问题,准备下一课一探究竟。既然使用Remoting,我希望对server端,对client端的配置及工作原理都是一清二楚的。

 

上一课:flex4 lesson 2 : dynamic hello world interacting with server
本课源码:flex4-lesson3.zip

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏