使用 Spring BlazeDS Integration 1.0.0.M1

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

更新:下面展示的大部分代码示例已过时,并已被更早的 “使用 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新的社区论坛 中。

试用 Spring BlazeDS Integration

BlazeDS 项目附带了许多出色的“试用”示例应用程序,以帮助理解如何构建利用 BlazeDS 远程处理和消息传递功能的 Flex 应用程序。这些示例使用 BlazeDS MessageBrokerServlet 将消息路由到由 BlazeDS 管理的 Java 对象,这些对象使用 BlazeDS 特定的 XML 配置进行连接。听起来不错,但您现有的基于 Spring 的基础设施呢?您是否希望在无需配置单独的 servlet 并使用熟悉的 Spring 编程模型的情况下,也能利用 MessageBroker 的功能?这正是 Spring BlazeDS Integration 发挥作用的地方。

我创建了一个修改版的 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 社区扩展

社区反馈征求

在此基础上,我们希望 Spring BlazeDS Integration 能够发展成为使用 Flex 构建 Spring 驱动的 RIA 的必需组件。该项目是为了响应 Spring 社区对一流解决方案的持续需求而启动的,旨在降低使用 Flex 和 Spring 构建应用程序的复杂性,并且它应该通过解决社区的需求来不断进步。我们确保这一点的方式是再次邀请您 亲自试用 并通过 论坛Jira 参与其中。我们欢迎您的反馈,并期待着共同努力实现最终的 1.0 版本。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有