领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多更新:下面显示的大多数代码示例已过时,并被更新的"使用 Spring BlazeDS 集成 1.0"文章中的示例所取代。
今天,我们宣布开源 Spring 项目组合的新成员 Spring BlazeDS 集成的第一个里程碑版本公开发布。Spring BlazeDS 集成项目的目的是简化使用 Adobe Flex 作为前端客户端构建 Spring 驱动的富互联网应用程序。它旨在通过提供一流的支持来实现此目的,以便将开源 Adobe BlazeDS 项目及其强大的远程处理和消息传递功能与熟悉的 Spring 编程模型结合使用。
第一个里程碑版本非常基础,专注于支持将 BlazeDS MessageBroker(处理来自 Flex 客户端的传入消息的核心组件)配置和引导为 Spring 托管对象,通过 Spring DispatcherServlet 基础设施将其路由到 HTTP 消息,以及轻松地将 Spring Bean 导出为 Flex 直接远程处理的目标。通往最终 1.0 版本的未来里程碑版本将以此为基础,提供更深层次的功能,例如 Spring Security 集成、使用 Spring 的 JMS 支持进行消息传递集成、与 Spring 3.0 的 REST 支持结合使用的 AMFView,以及希望进一步满足我们尚未想到的社区需求。此里程碑版本也是我们第一次邀请社区参与的机会,可以通过试用此版本并在项目 Jira和新的社区论坛中提供反馈。
我创建了一个 BlazeDS 试用示例应用程序的修改版本,该版本使用 Spring BlazeDS 集成。修改后的示例的完整源代码可在此处获取。您应该能够将示例导入 Eclipse 并使用 WTP 运行它。应用程序成功部署后,您可以在https://127.0.0.1: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 集成的总体方法是继续使用标准 BlazeDS XML 配置来处理相当静态且更关注基础架构的部分,例如通道定义,但允许在应用程序开发过程中更频繁更改的部分(例如远程处理目标)使用熟悉的 Spring 配置模型进行配置。因此,从 Flex 客户端导出 Spring 托管 Bean 以进行直接远程处理只是连接远程处理导出器 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。这是通过在 Spring 配置中结合使用简单的 HandlerMapping 和 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 社区扩展。