领先一步
VMware 提供培训和认证,助您加速进步。
了解更多今天,我们宣布了 Spring BlazeDS Integration——Spring 开源项目组合的最新成员——1.0 GA 版本公开发布。与此事件相呼应,我认为是时候更新我 之前的入门文章了。回顾一下
该项目的目标是让使用 Adobe Flex 作为前端客户端构建 Spring 驱动的富互联网应用程序更加容易。它旨在通过提供对使用开源 Adobe BlazeDS 项目及其强大的远程和消息传递功能与熟悉的 Spring 编程模型相结合的一流支持来实现这一目标。
现在,随项目分发版一起提供的是一个与 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 应用程序上下文,该上下文从 /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 安全设置集成所需的一切。有了此标签,通过使用 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 集成提供了对三种不同消息传递适配器的集成支持:
<flex:message-destination id="chat" />
这会设置一个名为“chat”的基本 AMF 目标。定义了此目标后,Flex 客户端就可以使用 Producer 和 Consumer 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 消息处理程序整合到其中的简单性。