使用 Spring BlazeDS Integration 1.0.0.M1

工程 | Jeremy Grelle | 2008 年 12 月 17 日 | ...

更新:下方展示的大多数代码示例已过时,已被更近期的"使用 Spring BlazeDS Integration 1.0"文章中的示例取代。

今天,我们宣布了开源 Spring 项目组合最新成员 Spring BlazeDS Integration 的第一个里程碑版本的公开可用。该项目的目的是通过使用 Adobe Flex 作为前端客户端,使构建由 Spring 提供支持的富互联网应用程序 (RIA) 变得更加容易。它旨在通过结合熟悉的 Spring 编程模型,为使用开源 Adobe BlazeDS 项目及其强大的远程调用和消息传递功能提供一流的支持,从而实现这一目标。

这第一个里程碑版本是一个基础版本,专注于支持将 BlazeDS MessageBroker(处理来自 Flex 客户端的传入消息的中心组件)配置和引导为 Spring 管理的对象,通过 Spring DispatcherServlet 基础设施将 HTTP 消息路由到它,并轻松地将 Spring bean 导出为直接 Flex 远程调用的目的地。未来通往最终 1.0 的里程碑版本将在此基础上构建,提供更深入的功能,例如 Spring Security 集成、使用 Spring 的 JMS 支持进行消息集成、与 Spring 3.0 的 REST 支持结合使用的 AMFView,以及希望能够解决社区尚未想到但需要解决的更多问题。这个里程碑版本也是我们首次邀请社区参与的机会,您可以通过试用该版本,并在项目 Jira新的社区论坛中提供反馈。

体验 Spring BlazeDS Integration

BlazeDS 项目附带了许多出色的“体验”示例应用程序,可帮助您了解如何构建利用 BlazeDS 远程调用和消息传递功能的 Flex 应用程序。这些示例使用 BlazeDS MessageBrokerServlet 将消息路由到使用 BlazeDS 特定 XML 配置连接起来的 BlazeDS 管理的 Java 对象。这听起来不错,但您现有的基于 Spring 的基础设施怎么办?如果您可以在无需配置单独的 servlet 并使用熟悉的 Spring 编程模型的情况下利用 MessageBroker 的功能,那岂不是很好?这就是 Spring BlazeDS Integration 的用武之地。

我创建了一个修改版的 BlazeDS 体验示例应用程序,它使用了 Spring BlazeDS Integration。修改后的示例完整源代码可在此获取。您应该能够将该示例导入 Eclipse 并使用 WTP 运行它。应用程序成功部署后,您可以通过 http://localhost: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。默认情况下,目标的服务 ID 将与 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 社区扩展

征集社区反馈

奠定了这个基础后,我们希望看到 Spring BlazeDS Integration 发展成为使用 Flex 构建由 Spring 提供支持的 RIA 的重要组件。该项目是响应 Spring 社区持续的需求而启动的,旨在提供一流的解决方案来降低使用 Flex 和 Spring 构建应用程序的复杂性,并且应该通过满足社区的需求来继续发展。确保做到这一点的方法是再次邀请您亲自试用,并通过论坛Jira参与进来。我们欢迎您的反馈,并期待与您一起努力实现最终的 1.0 版本发布。

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速发展。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅即可为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

近期活动

查看 Spring 社区所有近期活动。

查看全部