Flex4 中使用Spring flex 来集成BlazeDS 进行远程调用
原文:http://www.nomanland.net/2010/05/21/flex-series-guide-integration2/
Spring BlazeDS Integration 是什么?
Spring BlazeDS Integration 是 SpringSource 的开源项目,用于整合 Spring 与 BlazeDS。
为什么需要 Spring BlazeDS Integration?
正如“Flex4 系列教程之六 ”介绍的:不使用 Spring BlazeDS Integration 同样可以整合 Spring 与 BlazeDS。但这种整合方式不自然,需要额外维护一个 BlazeDS 配置文件,Spring BlazeDS Integration 会改善这种处境。
Spring BlazeDS Integration 需要的软件环境:
- Java 5 或更高
- Spring 2.5.6 或更高
- BlazeDS 3.2 或更高
Spring BlazeDS Integration 特征
- MessageBroker(BlazeDS 的核心组件)被配置为 Spring 管理的 Bean
- Flex 客户端发出的 HTTP 消息通过 Spring 的 DispatcherServlet 路由给 MessageBroker
- Remote objects 以 Spring 的annonation方式扫描托管在 Spring中
- 开放RDS服务器。以方便FB4 的(数据/服务)功能菜单的使用
注意事项:
- 下载 Spring Framework(截稿时最新版 spring-framework 3.0.2 ),解压备用
- 下载 Spring Framework dependencies(截稿时最新版 spring-framework 3.0.2 dependencies ),解压备用
- 下载 Spring BlazeDS Integration(截稿时最新版 spring-flex 1.5 ),解压备用
第一步:准备所需 jar 包
将以下 3 部分 jar 包拷贝到 sampleApp 项目的 lib 下
- Spring Framework
org.springframework.aop-3.0.2.RELEASE.jar
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.web.servlet-3.0.2.RELEASE.jar
org.springframework.web-3.0.2.RELEASE.jar - Spring Framework dependencies
org.aopalliance 内的 com.springsource.org.aopalliance-1.0.0.jar
edu.emory.mathcs.backport 内的 com.springsource.edu.emory.mathcs.backport-3.0.0.jar
net.sourceforge.cglib 内的 com.springsource.net.sf.cglib-2.2.0.jar
[注:]Spring 3 的依赖包用Ivy 或 Maven 管理会很方便,完成本系列教程后我会单独整理这部分。暂且手动拷贝吧 - Spring BlazeDS Integration
org.springframework.flex-1.5.0.CI-498.jar
第二步:修改 web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app
id="WebApp_ID"
version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>zara</display-name>
<context-param>
<param-name>flex.class.path</param-name>
<param-value>/WEB-INF/flex/hotfixes,/WEB-INF/flex/jars</param-value>
</context-param>
<!-- Http Flex Session attribute and binding listener support -->
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 定义spring 以及 spring flex 集成的配置 -->
<servlet>
<servlet-name>MessagebrokerServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/META-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map /spring/* requests to the DispatcherServlet -->
<servlet-mapping>
<servlet-name>MessagebrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
<!-- 定义spring 以及 spring flex 集成的配置 结束-->
<!-- 访问RDS 定义开始-->
<servlet>
<servlet-name>RDSDispatchServlet</servlet-name>
<display-name>RDSDispatchServlet</display-name>
<servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
<init-param>
<param-name>useAppserverSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>messageBrokerId</param-name>
<param-value>_messageBroker</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping
id="RDS_DISPATCH_MAPPING">
<servlet-name>RDSDispatchServlet</servlet-name>
<url-pattern>/CFIDE/main/ide.cfm</url-pattern>
</servlet-mapping>
<!-- 访问RDS 定义结束 -->
</web-app>
第三步:配置 web-application-config.xml
- 创建应用上下文配置文件 applicationContext.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- <context:component-scan base-package="com.alcor" /> <!-- 扫描规则 -->
- <import resource="jpa.xml" />
- <import resource="alcor.xml"/>
- <import resource="springFlex.xml"/>
- <!-- import resource="security.xml"/ -->
- </beans>
第四步:配置 springFlex.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:flex="http://www.springframework.org/schema/flex"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/flex
- http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
- <!-- 自定义处理器的方式并配合标签定义RO 开始
- <flex:message-broker>
- <flex:config-processor
- ref="messageBrokerConfigProcessor" />
- </flex:message-broker>
- <bean
- id="messageBrokerConfigProcessor"
- class="com.softvan.spring.flex.FlexMessageBrokerConfigProcessor">
- <property
- name="pattern"
- value="${shortName}RO" />
- </bean>
- 自定义处理器的方式结束-->
- <!--使用标准的配置文件注入方式 开始--><!--
- <flex:message-broker />
- <bean id="myService" class="com.alcor.test.MyService" />
- <flex:remoting-destination ref="myService" />
- --><!-- 使用标准的配置文件注入方式 结束 -->
- <!-- 使用标签注入方式 开始 -->
- <flex:message-broker>
- <flex:remoting-service default-channels="my-amf"/>
- </flex:message-broker>
- <!-- 使用标签注入方式 结束 -->
- </beans>
第五步:编写后台Bean,使用标签@RemotingDestination来透出接口,给flex client调用
- package com.alcor.test;
- import java.util.ArrayList;
- import java.util.List;
- import org.springframework.flex.remoting.RemotingDestination;
- import org.springframework.flex.remoting.RemotingInclude;
- import org.springframework.stereotype.Service;
- @Service
- @RemotingDestination
- public class MyService {
- @RemotingInclude
- public List<MyEntity> getMyEntities() {
- List<MyEntity> list = new ArrayList<MyEntity>();
- MyEntity entity = new MyEntity();
- entity.setFirstName("Hello");
- entity.setLastName("World");
- entity.setEmailAddress("hello@world.com");
- list.add(entity);
- MyEntity entity2 = new MyEntity();
- entity2.setFirstName("Hello");
- entity2.setLastName("Space");
- entity2.setEmailAddress("hello@space.com");
- list.add(entity2);
- MyEntity entity3 = new MyEntity();
- entity3.setFirstName("Hello");
- entity3.setLastName("Neighbor");
- entity3.setEmailAddress("hello@neighbor.com");
- list.add(entity3);
- return list;
- }
- }
注意:为了使用FB4 中的 (数据/服务)功能。在编辑器中可以访问后端的java bean。
必须在建立项目的时候,先建立一个web项目,然后再加入flex project的性能的方法。使得这个项目具有web应用和flex应用2重性。
不能直接建立一个flex project 选中使用WTP整合java/flex的功能。否则在IDE下无法使用(数据/服务)菜单访问后台的bean。