使用 Spring BlazeDS Integration 1.0

工程 | Jeremy Grelle | 2009 年 6 月 11 日 | ...

今天,我们宣布了 Spring BlazeDS Integration——Spring 开源项目组合的最新成员——1.0 GA 版本公开发布。与此事件相呼应,我认为是时候更新我 之前的入门文章了。回顾一下

该项目的目标是让使用 Adobe Flex 作为前端客户端构建 Spring 驱动的富互联网应用程序更加容易。它旨在通过提供对使用开源 Adobe BlazeDS 项目及其强大的远程和消息传递功能与熟悉的 Spring 编程模型相结合的一流支持来实现这一目标。

试用 Spring BlazeDS Integration

自第一个 M1 版本以来,我们极大地扩展了功能集,包括
  • 完整的 Spring Security 集成
  • 异步消息支持(具有 3 种不同的消息目标类型)
  • 完整的 XML 配置命名空间
  • 用于远程处理的基于注解的配置选项
  • 众多高级定制钩子

现在,随项目分发版一起提供的是一个与 Adobe 合作开发的全面示例集合,这些示例演示了各种功能的使用,被称为 Spring BlazeDS 集成试驾。这些示例是快速上手该项目的绝佳方式,我将在此向您快速介绍它们是如何协同工作的。

如果您想在 IDE 中进行跟随操作,请继续下载分发版,并按照这些说明使用 Maven 构建示例并将其导入 Eclipse。最终结果是,您的 Eclipse 工作区将导入许多新项目。其中大部分项目是针对单个 Flex 示例的(即,它们包含 .mxml 和 .as 源文件,并编译为 .swf 文件)。实际的 WTP 可部署的 Web 应用程序结构位于“testdrive”项目中,我们将首先关注那里。

项目中值得一看的第一件事是 /testdrive/src/main/webapp/WEB-INF/web.xml。在这里,您将看到一个相当典型的配置,用于通过 ContextLoaderListener 配置的根 Web 应用程序上下文,以及 Spring 安全过滤器链的基本设置,还有 Spring DispatcherServlet 的此配置


<servlet>
    <servlet-name>testdrive</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>testdrive</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

这取代了您在典型的独立 BlazeDS 应用程序中会找到的 MessageBrokerServlet 配置。/messagebroker/* 路径的映射对应于 /testdrive/src/main/webapp/WEB-INF/flex/services-config.xml 中 BlazeDS AMF 通信通道的典型设置,例如这个:


<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
    <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
        class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>

这是 BlazeDS 的主要配置文件。在检查示例中的此文件时,请注意“services”部分没有引用 remoting-config.xml 或 messaging-config.xml。Spring BlazeDS 集成的优点之一是,以前定义在这些 BlazeDS 特定文件中的设置现在可以完全通过提供的 Spring XML 配置命名空间和 Java 注解来定义。这样可以大大减少思维上的上下文切换,此外,如果您使用的是免费的 SpringSource Tool Suite,在编辑 Spring 配置文件时,您将获得完整的代码补全支持。

现在让我们看看示例的 Spring 应用程序上下文的一些方面。
Web 应用程序上下文配置文件。 该应用程序设置为具有一个根 Web 应用程序上下文,该上下文从 /testdrive/src/main/webapp/WEB-INF/spring 中找到的 *-context.xml 文件组装而成,以及一个与前面提到的 DispatcherServlet 本地化的子应用程序上下文,该上下文从 /testdrive/src/main/webapp/WEB-INF/testdrive-servlet.xml 组装而成(其名称和位置由约定确定)。我们已将所有 Flex 特定的配置分离到此子上下文中。

让我们更详细地检查 testdrive-servlet.xml。该文件以必要的 XML 序言开始,用于设置标准的 Spring“beans”配置命名空间以及新的“flex”命名空间。然后,您将看到的第一个是 BlazeDS MessageBroker 的基本设置


<flex:message-broker>
    <flex:message-service
        default-channels="my-streaming-amf,my-longpolling-amf,my-polling-amf" />
    <flex:secured />
</flex:message-broker>

message-broker 标签会触发 MessageBroker 作为 Spring 管理的 bean 进行引导,并自动设置所有必要的 Spring MVC 基础结构,包括 HandlerMappingHandlerAdapter。您可以通过可选的属性和标签进一步自定义内容,例如 services-config.xml 的位置、映射到 MessageBroker 的特定路径等,但在常见情况下,这就是所有必需的。

message-service 子标签正在为 BlazeDS MessageService 设置默认通信通道(按优先级排序)。此标签完全是可选的,但通常需要类似的设置,因为发布/订阅消息的通信通道需求往往与直接远程调用的通信通道需求不同。请参阅 BlazeDS 文档的此部分以获取一些指导。

secured 标签是启用与 /testdrive/src/main/webapp/WEB-INF/spring/security-context.xml 中定义的现有 Spring 安全设置集成所需的一切。有了此标签,通过使用 Flex 客户端 ChannelSet API 驱动的身份验证请求将被路由到 Spring 安全 AuthenticationManager。成功身份验证返回的 ActionScript 对象包含一些额外的有用信息,例如用户授予权限的数组。(有几个额外的安全功能和配置选项可用,但超出本文范围,因此如果您想了解更多详细信息,请参阅相关文档。)

一旦完成了此基本设置,您就可以开始创建远程调用和消息传递目标,以将您的 Flex 客户端应用程序连接到 Spring 驱动的服务。如果您查看 /testdrive/src/main/webapp/WEB-INF/spring/services-context.xml,您将看到几个数据访问对象的定义,包括这个:


<bean id="contactService" class="org.springframework.flex.samples.contact.ContactDAO">
    <constructor-arg ref="dataSource" />
</bean>

然后,该基本 Spring bean 通过 testdrive-servlet.xml 中的以下内容向 Flex 客户端公开进行远程调用:


<flex:remoting-destination ref="contactService" />

这会将该 bean 公开为一个名为“contactService”的远程目标(默认情况下,目标名称与导出的 bean 的 id 相同)。要从客户端访问此目标,我们只需要使用 Flex RemoteObject 类。例如,请参阅 /insync01/src/main/flex/insync01.mxml 中的以下代码片段:


<mx:RemoteObject id="ro" destination="contactService"/>

<mx:ApplicationControlBar width="100%">
    <mx:TextInput id="searchStr"/>
    <mx:Button label="Search" click="ro.findByName(searchStr.text)"/>
</mx:ApplicationControlBar>

<mx:DataGrid id="dg" dataProvider="{ro.findByName.lastResult}" width="100%" height="100%"/>

如您所见,一旦 RemoteObject 连接成功,您就可以轻松地调用其方法并将结果绑定到 Flex UI 控件,例如 DataGrid。Spring 管理的 MessageBroker 负责路由传入的 HTTP 消息以及 AMF 和 Java 之间的序列化。POJO 驱动的 Spring 编程模型在服务器端保持不变,正如在 /testdrive/src/main/java/org/springframework/flex/samples/contact/ContactDAO.java 中“findByName”方法的实现中所 evid evid evident 的那样。


public List<Contact> findByName(String name) {
    return this.template.query("SELECT * FROM contact WHERE UPPER(CONCAT(first_name, ' ', last_name)) LIKE ? ORDER BY first_name, last_name", 
        this.rowMapper, "%" + name.toUpperCase() + "%");
}

异步发布/订阅式通信同样简单。Spring BlazeDS 集成提供了对三种不同消息传递适配器的集成支持:

  1. BlazeDS ActionScriptAdapter,用于基本 AMF 消息,包括使用提供的 MessageTemplate 将这些消息推送到订阅客户端的能力
  2. JmsAdapter,用于连接到 Spring 管理的 JMS 目标
  3. IntegrationAdapter,用于连接到 Spring Integration MessageChannel
使用这些适配器的消息目标以与远程目标类似的方式使用 XML 命名空间进行设置。例如,请参阅 testdrive-servlet.xml 中的以下定义:

<flex:message-destination id="chat" />

这会设置一个名为“chat”的基本 AMF 目标。定义了此目标后,Flex 客户端就可以使用 ProducerConsumer API 进行通信。要了解此特定目标的使用方式,请查看 /chat/src/main/flex/chat.mxml 中的 Flex chat 示例源代码。

使用 jms-message-destination 变体标签,连接由 JMS 目标支持的消息目标的操作也很相似:


<flex:jms-message-destination id="jms-chat" jms-destination="chatTopic" />

此版本引用了一个 Spring 管理的 JMS 主题(在本例中定义于 /testdrive/src/main/webapp/WEB-INF/spring/infrastructure-context.xml)。查看 Flex jms-chat 示例的源代码 /jmschat/src/main/flex/jmschat.mxml,您会发现它与使用基本 AMF“chat”目标 的版本完全相同。

同样,连接到 Spring Integration MessageChannel 只需使用 integration-message-destination 标签即可。请务必查看试驾中的“POJO Messaging”示例,了解将简单 POJO 消息处理程序整合到其中的简单性。

进一步探索

通过这个快速介绍,我们只是触及了 Spring BlazeDS 集成的表面。如果您有兴趣构建 Spring 驱动的 RIA,我鼓励您完成试驾中的所有示例以了解更多信息。同时,请查看我们活跃社区成员构建的其他 示例,并查看社区驱动的 Spring ActionScript 项目,将 DI 的价值带到 Flex 客户端。

一如既往,如果您对我们如何进一步增加价值有任何想法或有其他反馈意见,我们欢迎您通过论坛Jira参与进来。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看所有