1.安装配置Flex3 到Eclipse,创建新的Flex3 For JavaEE的项目。如果不知道怎么建可参照 http://bvu.javaeye.com/blog/308830 这一个系列的文章,里面从JDK安装开始讲解,详细可用。
2.spring官方新出了一个暴露BlazeDS服务的一个新包org.springframework.flex.release.jar,这样就可以在spring的service文件上直接使用注释:@RemotingDestination(channels={"my-amf","my-secure-amf"})来实现此service可以使用Flex AS来调用。
3.创建一个AS文件
package com.services
{
import mx.controls.Alert;
import mx.messaging.Channel;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.mxml.RemoteObject;
public class CustomerService
{
private var channel : Channel;
public var service : RemoteObject=new RemoteObject();
public function CustomerService()
{
channel = new AMFChannel("my-amf", "http://localhost:8080/FlexBook/messagebroker/amf");
var cs : ChannelSet = new ChannelSet();
cs.addChannel(channel);
this.service.channelSet = cs;//这里指定channelSet,否则跨域访问报错
this.service.destination = "customerService";
this.service.showBusyCursor = true;
this.service.addEventListener(ResultEvent.RESULT, resultHandler);
this.service.addEventListener(FaultEvent.FAULT, faultHandler);
}
private function resultHandler(event : ResultEvent) : void
{
if (event.token.resultHandler == null)
{
return;
}
event.token.resultHandler(event.result);
}
private function faultHandler(event : FaultEvent) : void
{
if (event.token.faultHandler == null)
{
return;
}
var rootCause : Object = event.fault.rootCause;
if (rootCause != null)
{
event.token.faultHandler(event.fault.rootCause);
}
else if(event.fault.faultDetail==null)
{
Alert.show("Unknown Error, Please contact Administrator.");
}
else if(event.fault.faultCode == "Channel.Connect.Failed")
{
Alert.show("Whoa,Looks looks like your internet connection has issues,Please try again when the issues are resolved.");
}
else
{
Alert.show("Root Cause: /n"+rootCause+"/nExtra Details:/n"+event.fault.faultDetail);
}
}
}
}
其中ChanelSet和Chanel可从services-config.xml通过以下方式取得
var c:Channel=ServerConfig.getChannel("my-amf", false);
也就是说 channel = new AMFChannel("my-amf", "http://localhost:8080/FlexBook/messagebroker/amf");
可以用 : channel =ServerConfig.getChannel("my-amf", false); 替换,不过要把services-config.xml里<channel-definition id="my-amf" 的url改为:url="http://localhost:8080/FlexBook/messagebroker/amf" 而非原来的{servier.name}等
3.在MXML里调用
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import com.vo.Customer; //自定义的FLex前端vo用于接收java对象,所有属性和java对象完全相同,再用
//[Bindable]
//[RemoteClass(alias="com.mars.model.Customer")] 修饰指明和哪个java对象一致
import mx.controls.Alert;
import mx.rpc.remoting.mxml.RemoteObject;
import com.services.CustomerService;
private var ro : RemoteObject;
private function saveCustomer(event:Event):void
{
ro = new CustomerService().service;
var obj:Customer = new Customer();
obj.name=username.text;
obj.password = password.text;
ro.save(obj);
}
]]>
</mx:Script>
<mx:VBox x="132" y="31" height="100%" width="251">
<mx:Form width="251" height="414">
<mx:FormItem label="Name">
<mx:TextInput id="username"/>
</mx:FormItem>
<mx:FormItem label="Pass">
<mx:TextInput id="password"/>
</mx:FormItem>
<mx:FormItem label="EMail">
<mx:TextInput id="email"/>
</mx:FormItem>
<mx:Button label="Save" click="saveCustomer(event)"/>
</mx:Form>
</mx:VBox>
</mx:Application>
即可把前端的对象保存到数据库。如果觉得New CustomerService()就为了得到一个service来用不好,可以使用静态方法来实现。这里就不写详细代码了。