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一下项目,会重新生成。



你可能感兴趣的:(Flex)