使用 Spring BlazeDS 集成 1.0

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

今天,我们宣布开源 Spring 项目组合中最新成员 Spring BlazeDS 集成的 1.0 GA 版本公开发布。Spring BlazeDS 集成。为了配合这一事件,我认为现在是时候更新我的之前的入门文章了。回顾一下

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

试用 Spring BlazeDS 集成

自从第一个 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。在这里,您将看到一个相当典型的根 Web 应用程序上下文设置,该上下文通过 **ContextLoaderListener** 配置,Spring Security 过滤器链的基本设置,以及 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 基础设施,包括 **HandlerMapping** 和 **HandlerAdapter**。您可以通过可选的属性和标签进一步自定义内容,例如 services-config.xml 的位置、映射到 MessageBroker 的特定路径等,但在常见情况下,这已经足够了。

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

**secured** 标签是启用与在 /testdrive/src/main/webapp/WEB-INF/spring/security-context.xml 中定义的现有 Spring Security 设置集成的所有内容。使用此标签后,由使用 Flex 客户端 ChannelSet API 驱动的身份验证请求将路由到 Spring Security **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”方法的实现中很明显。


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从简单的 POJO 将这些消息推送到已订阅的客户端。
  2. JmsAdapter 用于连接到 Spring 托管的 JMS 目标。
  3. IntegrationAdapter 用于连接到 Spring Integration MessageChannel。
使用这些适配器的消息目标以类似于远程处理目标的方式使用 XML 命名空间进行设置。例如,请参阅 testdrive-servlet.xml 中的以下定义

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

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

连接到由 JMS 目标支持的消息目标的方式类似,使用标签的 **jms-message-destination** 变体


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

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

同样,连接到 Spring Integration **MessageChannel** 也是使用 **integration-message-destination** 标签的问题。请务必查看试用版中的“POJO 消息传递”示例,以了解将简单的 POJO 消息处理程序添加到组合中是多么容易。

进一步探索

通过这个简短的介绍,我们只是触及了Spring BlazeDS集成所能做的事情的表面。如果您有兴趣构建一个由Spring驱动的RIA,我鼓励您浏览测试驱动程序中的所有示例以了解更多信息。同时,查看一些活跃社区成员构建的这些其他 示例,并查看社区驱动的Spring ActionScript项目,以将DI的价值带到Flex客户端。

与往常一样,如果您有任何关于如何进一步增加价值的想法或任何其他反馈,我们邀请您通过论坛Jira参与进来。

获取Spring时事通讯

与Spring时事通讯保持联系

订阅

领先一步

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

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部