点击这里给我发消息 点击这里给我发消息
首页 > 行业资讯 > flash>详细内容

基于flex4技术从零开发flex博客系统 : 3 使用Remoting服务

添加时间:2010-1-5
    相关阅读: 开发 WEB 技术 页面 程序 flash 框架

本文源代码下载地址:

  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了。

基于flex4技术从零开发flex博客系统 : 3 使用Remoting服务

基于flex4技术从零开发flex博客系统 : 3 使用Remoting服务

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

基于flex4技术从零开发flex博客系统 : 3 使用Remoting服务

  这是由于我们把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";

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

基于flex4技术从零开发flex博客系统 : 3 使用Remoting服务

基于flex4技术从零开发flex博客系统 : 3 使用Remoting服务

  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>

本文作者:未知
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册