领先一步
VMware 提供培训和认证,助您加速进步。
了解更多更新:下面展示的大部分代码示例已过时,并已被更早的 “使用 Spring BlazeDS Integration 1.0” 文章中的示例所取代。
今天,我们宣布了 Spring 开源项目组合中最新成员 Spring BlazeDS Integration 的第一个里程碑版本公开发布。该项目的目的是通过提供对开源 Adobe BlazeDS 项目及其强大的远程处理和消息传递功能的头等支持,并结合熟悉的 Spring 编程模型,从而更轻松地使用 Adobe Flex 作为前端客户端来构建 Spring 驱动的富 Internet 应用程序。
这个第一个里程碑版本是一个非常基础的版本,专注于支持将 BlazeDS MessageBroker(处理来自 Flex 客户端的入站消息的核心组件)配置和引导为 Spring 管理的对象,通过 Spring DispatcherServlet 基础设施将其路由到 HTTP 消息,并轻松地将 Spring bean 导出为直接 Flex 远程处理的目的地。在最终的 1.0 版本之前,未来的里程碑版本将在此基础上构建,提供更深入的功能,例如 Spring Security 集成、使用 Spring 的 JMS 支持的消息传递集成、与 Spring 3.0 的 REST 支持结合使用的 AMFView,以及我们希望还能满足社区尚未想到的其他需求。此里程碑版本也是我们第一次邀请社区通过 试用该版本 并提供反馈,参与到 项目 Jira 和 新的社区论坛 中。
我创建了一个修改版的 BlazeDS 试用示例应用程序,该应用程序使用了 Spring BlazeDS Integration。修改后的示例的完整源代码 可在此处获得。您应该能够将该示例导入 Eclipse 并使用 WTP 运行它。成功部署应用程序后,您可以通过 https://:8080/samples/testdrive.htm 访问各个试用示例。(请注意,在启动应用程序之前,您必须启动 /sampledb 中的内置 HSQL 演示数据库。)在此,我将引导您了解示例中一些更有趣的部分,以说明开始构建 Spring 驱动的 Flex 应用程序所需的步骤。
项目中最值得一看的是 /samples/WEB-INF/web.xml。在这里,您将看到 Spring DispatcherServlet 的一个非常典型的设置
<!-- The front controller of this Spring Web application -->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/web-application-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all /spring requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
这取代了标准 BlazeDS 示例中的 MessageBrokerServlet 配置。此特定应用程序的设置采用了映射策略,该策略允许从同一个应用程序提供 Flex 直接远程处理内容和 RESTful 内容。如果您正在构建一个仅面向 Flex 客户端的应用程序,则可以使用更简单的映射策略,如参考手册中所述。
下一个要看的是 /samples/WEB-INF/config/web-application-config.xml 中的 Spring 配置。首先,请注意 MessageBrokerFactoryBean 的定义
<!-- Bootstraps and exposes the BlazeDS MessageBroker -->
<bean id="mySpringManagedMessageBroker"
class="org.springframework.flex.messaging.MessageBrokerFactoryBean" />
这会将 BlazeDS MessageBroker 引导为 Spring 管理的 bean,使用 /samples/WEB-INF/flex/services-config.xml 作为 BlazeDS 配置的默认位置。Spring BlazeDS Integration 的总体方法是继续使用标准的 BlazeDS XML 配置来处理相对静态且更偏向基础设施的部分(例如通道定义),但允许对应用程序开发过程中变化更频繁的内容(例如远程处理目的地)使用熟悉的 Spring 配置模型进行配置。因此,公开一个 Spring 管理的 bean 以供 Flex 客户端直接远程处理,只需连接一个远程处理导出器 bean 即可。进一步检查示例中的 Spring 配置,您将看到这一点
<!-- Implementation of ProductService using Spring's SimpleJdbcTemplate -->
<bean id="productService" class="flex.samples.product.JdbcProductService" >
<constructor-arg ref="dataSource"/>
</bean>
<!-- Expose the productService bean for BlazeDS remoting -->
<bean id="product"
class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter">
<property name="messageBroker" ref="mySpringManagedMessageBroker"/>
<property name="service" ref="productService"/>
</bean>
在这里,您可以看到一个简单的 Spring bean productService,它被导出为 Spring 管理的 MessageBroker 的远程处理目的地。默认情况下,目的地的 serviceId 将与 bean 名称相同。此服务可以从 Flex 客户端代码访问,例如在 /samples/WEB-INF/flex-src/testdrive-remoteobject/src/main.mxml 中的以下 MXML 示例中
<mx:RemoteObject id="srv" destination="product"/>
<mx:DataGrid dataProvider="{srv.getProducts.lastResult}" width="100%" height="100%"/>
<mx:Button label="Get Data" click="srv.getProducts()"/>
Spring 管理的 MessageBroker 负责处理在 productService bean 上调用 getProducts 方法的细节,以及在 Flex 的原生 AMF 数据格式和 Java 之间进行序列化。
这个流程中的最后一部分是用于将进入 DispatcherServlet 的 Flex AMF 消息请求路由到 MessageBroker 的配置。这通过一个简单的 HandlerMapping 和 Spring 配置中的 MessageBrokerHandlerAdapter 定义来实现
<!-- Maps request paths at /messagebroker to the BlazeDS MessageBroker -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/messagebroker/*=mySpringManagedMessageBroker
</value>
</property>
</bean>
<!-- Dispatches requests mapped to a MessageBroker -->
<bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/>
与 DispatcherServlet 的映射结合使用,最终结果是路径 /spring/messagebroker/* 的请求将被路由到 Spring 管理的 MessageBroker。请注意,/WEB-INF/flex/services-config.xml 中的 BlazeDS 通道定义与此映射相对应,例如
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>false</polling-enabled>
</properties>
</channel-definition>
当然,如果您愿意,您也可以在 Flex 客户端中单独设置这些通道(这样您就不必针对 services-config.xml 编译 Flex 源代码),甚至 使用 Spring ActionScript 社区扩展。