应需求,研究了一下Flex如何与Java后台进行通信。先把HelloWorld的程序写在这里吧:


首先要想说的是网络上传播着3种flex与java的整合方法:
第一种是java项目里通过add flex project nature 插入flex 项目。
第二种是flex项目变成web项目加入java文件。
第三种是java与flex分别独立开发,最后整合到一起。
首先说第一种,通过这种方法建立的flex project被直接包含在java项目里,但是最后保存mxml文件只会生成一个swf文件。所以除非你的java项目里已经有了插入swf的那个html,否则运行时会出现找不到文件的错误。所以如果只是单纯的开发一个flex项目,不推荐用第一种方法。
其次,我个人感觉第二种和第三种是一回事 如果有一个java project 需要插入flex project 那flex与java通信的那个java文件还是得在flex 项目里实现。 不知道我说的大伙有没有明白。简单的说如果你想开发一个带有flex文件的web项目,你可以用第二种方法完成flex开发然后直接部署到已有的web项目中。


什么是BlazeDS呢?BlazeDS是一个基于服务器的Java远程调用(remoting)和Web消息传递(messaging)技术,它能够使得后台的Java应用程序和运行在浏览器上的Flex应用程序相互通信。在各大搜索引擎里,关于BlazeDS的中文教程来来去去都是那几篇,而且都是使用Eclipse来开发Flex的(用Eclipse开发Flex跟Java很不错的)。这篇文章将会尝试着使用Flex Builder 3,用一个经典的“HelloWorld”例子来让你学会BlazeDS的使用方法。


首先要下载包文件:blazeds_bin_3-0-0-544.zip.将其解压,可以看到web-inf和meta-inf这两个文件夹。

在tomcat的webapps下面,建立一个文件夹,估且命名为blaseds,然后把上述的两个文件夹放在其下面。然后就开始开发工作了。


不论在哪写都可以,可以在IDE中,也可以在记事本中, 开发一个HelloWorld.java

package cn.riahome.java;
 public class HelloWorld {
public String getHelloWorld(){
return "Flex hello";
}
public HelloWorld(){

}
 }

生成HelloWorld.class之后,将其放在webapps\blaseds\WEB-INF\classes\cn\riahome\java文件夹下。(新建三个文件夹)


然后,把blaseds\WEB-INF\flex中的remoting-config.xml中,加上一个节点:

<destination id="helloWorld">
<properties>
<source>cn.riahome.java.HelloWorld</source>
</properties>
</destination>

上述,就完成了tomcat中的开发工作。下面进入到Flex中。


在Flash4中,新建一个项目,注意,要命名为HelloWorld,否则会出错。

并且,最好新建时,配置好与J2EE的连接:在服务器类型中,选择BlazeDS,在下一步中,

根文件夹:D:\soft\Tomcat 6.0\webapps\blaseds

根URL:http://localhost:8080/blaseds

上下文目录:/blaseds

然后完成。


上述配置也可以在新建好以后进行配置,但要注意,如果是新建好,再配置,则还要配置另外一项:


Flex编译器-->附加的编译器参数:

-services "D:\soft\Tomcat 6.0\webapps\blaseds\WEB-INF\flex\services-config.xml" -locale zh_CN

(如果在新建时配置好了J2EE,则这条会自动添加,否则要手动添加)


最后,写HelloWorld.mxml中写上代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
<mx:RemoteObject id="remoteObject" destination="helloWorld" source="cn.riahome.java.HelloWorld" result="resultHandler(event)" fault="faultHandler(event)"/>
</fx:Declarations>

<fx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;

private function resultHandler(event:ResultEvent):void
{
// 显示收到的 "Flex hello" 数据
Alert.show(event.result.toString(), "提示");
}

private function faultHandler(event:FaultEvent):void
{
Alert.show(event.fault.toString(), "提示");
}
]]>
</fx:Script>

<mx:Button label="发送" click="remoteObject.getHelloWorld()"/>
</s:Application>


运行,就可以看到Flex从java中获取数据了。


最后需要注意的是:<mx:RemoteObject>标签的destination属性值必须跟remoting-config.xml文件里destination标签的id值一致!


如果您还是测试不成功,请注意以下几点:
1、核实HelloWorld.class文件已经在[tomcat-home]\webapps\blazeds\WEB-INF\classes\cn\riahome\java目录下;
2、检查remote-config.xml文件里是否已经添加了上述的<destination>标签;
3、有没有重启Tomcat服务器;
4、检查<mx:RemoteObject>标签有没有这两个属性:destination=”helloWorld”、source=”cn.riahome.java.HelloWorld”
5、打开Flex Project的属性面板,查看 Flex Compiler 里的Additional compiler arguments选项,是否已经有“-services”指令,如下图(通常在新建Project的时候就自动添加的)




6、打开Flex Project的属性面板,再次检查 Flex Server 里的 Root folder、Root URL、Conntext root,按一下 Validate Location 按钮测试是否成功
7、检查所有代码有没有错误


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

升一下级,来个可以带参数的,而且发现上面写的flex文件有点复杂。

在java中,

public String getHelloWorldWithParam(String s){
return "Flex hello " + s ;
}

然后在mxml中,

<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
<mx:RemoteObject id="remoteObject" destination="helloWorld" source="cn.riahome.java.HelloWorld" result="resultHandler(event)" />
</fx:Declarations>

<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;

public function call():void{ 
var str:String = textArea.text; 
remoteObject.getHelloWorldWithParam(str);
}

public function resultHandler(event:ResultEvent):void{
var newStr:String = event.result as String;
Alert.show(newStr);
}

]]>
</fx:Script>
<mx:TextArea x="191" y="245" id="textArea"/> 
<mx:Button label="发送" click="call()"/>

就可以了。也不难。