环境
Myeclipse 6.0 ,flex builder 3,blazeds
BlazeDS是一个基于服务器的Java远程调用(remoting)和Web消息传递(messaging)技术,使得后台的Java应用程序和运行在浏览器上的Flex应用程序能够相互通信。整合时只需将相关jar宝拷过来。
Ssh2配置无需多说
FLEX和J2EE交互,一般有HTTP,Web Services 和 AMF几种方式。通常使用BlazeDS,来利用AMF协议让FLEX和J2EE交互。
AMF(Action Message Format)是ActionScript对象序列化后的二进制流。用于Adobe Flash应用和远端服务的通讯。由于它是基于二进制的数据传输,所以相对于XML SOAP,json,WebService等基于字符串的数据格式,有数据体积小和效率高的特点。
1、考入blazeDS依赖的jar包
backport-util-concurrent.jar
commons-httpclient.jar
commons-logging.jar
flex-messaging-common.jar
flex-messaging-core.jar
flex-messaging-proxy.jar
flex-messaging-remoting.jar
2、j2ee后台建立一个service接口,和service的实现类,这里写了最简单两个类。
public interface FlexService {
public void test();
}
@Service("flexService")
public class IFlexService implements FlexService{
public void test() {
System.out.println("J2EE 收到flex请求");
}
}
3、
Web.xml添加以下内容
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
此监听器负责监听 Flex 远程调用请求,并进行一些初始化设置
<servlet>
<servlet-name>messageBroker</servlet-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>messageBroker</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
此servlet是处理 Flex 远程调用请求的 Servlet
4、配置blazeds所需的配置文件,需要放在/WEB-INF/flex/目录下,blazeDS 读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。
由于 BlazeDS 需要将 Java 接口 FlexService 暴露给 Flex 前端,因此,我们在配置文件 remoting-config.xml 中将 FlexService 接口声明为一个服务:
首先将这四个文件考入/WEB-INF/flex下(如果没有,新建此目录)
Remoting-config.xml加入
<destination id="flexService">
<properties>
<source>com.ssh2.service.IFlexService</source>
<scope>application</scope>
</properties>
</destination>
Source为flex调用的服务类实现类
或者
Remoting-config.xml加入
<destination id="flexService">
<properties>
<factory>flexFactory</factory>
<source>flexService</source>
<scope>application</scope>
</properties>
</destination>
Services-config.xml加入
<factories>
<factory id="flexFactory" class="com.ssh2.service.FlexFactoryImpl"/>
</factories>
这种情况。需要另外实现两个类
public class FlexFactoryImpl implements FlexFactory {
public FactoryInstance createFactoryInstance(String id, ConfigMap properties) {
SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);
instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()));
return instance;
}
public Object lookup(FactoryInstance instanceInfo) {
return instanceInfo.lookup();
}
public void initialize(String id, ConfigMap configMap) {
}
}
和
class SpringFactoryInstance extends FactoryInstance {
SpringFactoryInstance(FlexFactory factory, String id, ConfigMap properties) {
super(factory, id, properties);
}
public Object lookup() {
ApplicationContext appContext = WebApplicationContextUtils.
getRequiredWebApplicationContext(
FlexContext.getServletConfig().getServletContext()
);
String beanName = getSource();
try {
return appContext.getBean(beanName);
}
catch (Exception e) {
}
return null;
}
}
BlazeDS 将首先创建 FlexFactory 的实例—— FlexFactoryImpl;
当接收到 Flex 前端的远程调用请求时,BlazeDS 通过 FlexFactory 创建 FactoryInstance 对象,并传入请求的 Service ID。在这个应用程序中,被创建的 FactoryInstance 实际对象是 SpringFactoryInstance;
FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。
这种通过 BlazeDS 调用 FlexService 你可以另外做一些处理。
5、flex builder 3 创建flex项目
启动j2ee服务端
打开flex builder3 选择新建flex项目
应用服务器类型选择j2ee,use remote object access service选择
livecycle data services.
点击下一步
Root folder::服务器(此处tomcat)发布的项目路径,其下面需要能找到/WEB-INF/flex/
Root URL:j2ee服务端运行url地址
点击finish
编辑默认的mxml文件
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:RemoteObject id="flexServiceRO" destination="flexService">
<mx:method name="test"/>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import flash.utils.*;
import mx.controls.Alert;
import mx.rpc.AbstractOperation;
import mx.rpc.remoting.mxml.RemoteObject;
private function test():void{
Alert.show("Select a color:","Color Selection");
// flexServiceRO.send();
var ro : RemoteObject= new RemoteObject();
ro.destination = "flexService";
ro.concurrency = "last";
ro.makeObjectsBindable = true;
ro.showBusyCursor = false;
var op : AbstractOperation = ro.getOperation("test");
op.send();
}
]]>
</mx:Script>
<mx:Button label="发送请求" click="test();">
</mx:Button>
</mx:Application>
点击发送请求
发现j2ee服务端打印了。说明调用成功了。
注意:1、struts2配置的拦截器会拦截 /* 的请求
所以。可以重写StrutsPrepareAndExecuteFilter类。让他不拦截flex调用请求
public class MyStrutsPrepareAndExecuteFilter extends StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
String requestURI = ((HttpServletRequest) arg0).getRequestURI();
if(requestURI != null && requestURI.contains("/messagebroker"))
arg2.doFilter(arg0, arg1);
else
super.doFilter(arg0, arg1, arg2);
}
}
配入web.xml
2、如果删除了flex builder编辑输出的文件夹中的内容。可以clean一下项目,会重新生成。