一、建立Flex与Java交互的工程。
本文中讲到的交互是利用Blazeds的,因为这个是免费的,呵呵,我是穷人。
首先就是去下载Blazeds的压缩包,这个可以从官网或者CSDN、JavaEye上下到。解压缩这个包,将里面的Blazeds.war解压,后面建立工程时要使用。
在MyEclipse中建立一个web工程,名为FlexTest。(注意:这个工程的JDK一定是1.5或以上版本,本文使用6.0)
将刚才解压的Blazeds.war包中的“META-INF”与“WEB-INF”文件夹以及文件夹中的内容拷贝到工程的WebRoot下。WEB-INF中包含有Flex的配置文件以及Blazeds需要的Jar包。这时我们就可以在这个工程中写入Java代码了。本文以一个ROLES表为例,建立Roles实体类。代码如下:
package org.entity;
publicclass Camerabasic implements java.io.Serializable {
private String id;
private String cameraid;
private String name;
private String brand;
private String model;
private String cameratype;
private String factory;
private String contactphonenum;
private String focallength;
private String codingstyle;
private String installationaddr;
private String installer;
private String cadurl;
private String controldistance;
private String fov;
【get set方法省略】
}
注意,由于这个实体类需要当做Java代码中方法的返回值传递给Flex中的AS代码,所以需要继承Serializable接口,否则将导致异常的发生。
然后,在建立一个供Flex调用的Java类。代码如下
dao service省略。。。
在改例子中,使用的框架式spring+hibernate,写一个普通类供Flex调用的java类,如下:
package org.action.query;
import java.util.List;
import org.entity.Camerabasic;
import org.service.query.CameraService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
publicclass CameAction{
private CameraService cService;
public CameraService getcService() {
returncService;
}
publicvoid setcService(CameraService cService) {
this.cService = cService;
}
public List<Camerabasic> getdataMe(){
try {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
cService = (CameraService) context.getBean("cService");
} catch (Exception e) {
e.printStackTrace();
}
returncService.getAll();
}
}
这里就不连接数据库去操作了,因为本文重点放在Flex调用Java上,所以写个桩数据用以测试。
写完了这两个类,就需要在WebRoot/WEB-INF/flex/remoting-config.xml中配置用以调用这个Java类的信道了。具体代码如下:红色的为重点
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
class="flex.messaging.services.RemotingService">
<adapters>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<!-- 其中destination就是信道,properties是可以配置多个Java类,source是配置要调用Java类的包路径。 -->
<destination id="came">
<properties>
<source>org.action.query.CameAction</source>
</properties>
</destination>
</service>
到此,Java部分的代码就写完了。下面是Flex中的代码。
在Flex Builder中创建一个Flex工程。名称为FlexApp。如图所示
在Flex Builder中创建一个Flex工程。名称为FlexApp。如图所示
注意Project Location的Folder要选择MyEclipse建立的Web工程的WebRoot下。Server technology选择J2EE
点击[Next]按钮进入下一页。如图
注意Server location中Root folder要选择Java Web工程的WebRoot路径。Root URL是Java web工程的访问路径,由于使用的是Tomcat服务器,工程名为FlexTest,所以路径是http://localhost:8080/FlexTest/,而
Context root则是Java Web项目的工程名。完成后点击那个[Validate Configuration]进行验证,如果窗口上方显示如上图所示的“黄三角”就说明可以进行下一步操作了。
顺利建立完Flex工程后,需要注意是否报错,如果报错,请注意调整Flex SDK的版本。
没问题后,就要创建一个AS的类,用来接收Java程序的返回值了,也就是那个CameEntity。代码如下:
package com.controller
{
[Bindable]
[RemoteClass(alias="org.entity.Camerabasic")]
publicclass CameEntity
{
publicvar id:String;
publicvar cameraid:String;
publicvar name:String;
publicvar brand:String;
publicvar model:String;
publicvar cameratype:String;
publicvar factory:String;
publicvar contactphonenum:String;
publicvar focallength:String;
publicvar codingstyle:String;
publicvar installationaddr:String;
publicvar installer:String;
publicvar cadurl:String;
publicvar controldistance:String;
publicvar fov:String;
publicfunction CameEntity()
{
}
}
}
这里[Bindable]是可绑定的[RemoteClass(alias="org.entity.Camerabasic")]是和Java代码中的Camerabasic类关联起来。这样就可以利用类型转换来将Java对象转换为AS对象了。
现在让我们在Flex中调用这个Java代码吧。代码如下:青色标注为重点
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:iframe="com.view.iframe.*"
xmlns:sgclass="com.common.globe.sgclass.*"
width="100%" height="100%" gap="0" creationComplete="init()">
【creationComplete为该组件创建完成后调用的方法】
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
<s:RemoteObject id="getdataRe" destination="came">
<s:method name="getdataMe" result="getlist(event)">
</s:method>
</s:RemoteObject>
【RemoteObject的id为唯一标识,destination的值需要和java的remoting-config.xml中的destination中的id一致;s:method中的name值需要和java中的普通类中需要调用的方法名一致,result为回调函数,创建回调函数在此写逻辑方法,即在as中写】
</fx:Declarations>
<fx:Script>
<![CDATA[
import com.controller.CameEntity;
import mx.collections.ArrayCollection;
import mx.containers.Form;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
privatefunction init():void{
getdataRe.getdataMe();
【在此init()方法中,创建组件完成调用的方法,调用的方式为RemoteObject的id为唯一标识点 s:method中的name值,即可完成调用java后台的,返回数据,给result调用函数。】
}
privatefunction getlist(event:ResultEvent):void{
dataGrid.dataProvider = event.result as ArrayCollection;
}
【写该回调函数方法,ResultEvent得到调用java后台返回的数据,将返回的数据转换类型给dataGrid组件的id值。】
]]>
</fx:Script>
<s:Group width="100%" height="60">
<mx:Canvas x="0" y="120" width="100%" height="388">
<s:Label x="5" y="1" height="26" fontSize="18" text="查询结果"/>
<mx:DataGrid x="3" y="23" width="269" height="365" id="dataGrid">
<mx:columns>
<mx:DataGridColumn dataField="name" headerText="建筑名"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
</s:Group>
</s:VGroup>
有不理解的可以找我:QQ:2734469636