flex,ssh2,blazeds整合(一)

环境
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一下项目,会重新生成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值