领先一步
VMware提供培训和认证,以加速您的进步。
了解更多今天,我们宣布开源 Spring 项目组合中最新成员 Spring BlazeDS 集成的 1.0 GA 版本公开发布。Spring BlazeDS 集成。为了配合这一事件,我认为现在是时候更新我的之前的入门文章了。回顾一下
该项目的目的是简化使用 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。在这里,您将看到一个相当典型的根 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 应用程序上下文,该上下文从 /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 集成提供了对三种不同消息传递适配器的集成支持
<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 消息处理程序添加到组合中是多么容易。