領先一步
VMware 提供培訓和認證,以加速您的進展。
瞭解更多更新:下方顯示的大多數程式碼範例都已過時,並被更當前的「使用 Spring BlazeDS Integration 1.0」文章中的範例所取代。
今天我們宣布開放原始碼 Spring 專案組合的最新成員 Spring BlazeDS Integration 的第一個里程碑版本公開發布。此專案的目的是讓使用 Adobe Flex 作為前端客戶端,更容易建置 Spring 驅動的豐富網路應用程式 (Rich Internet Applications)。它旨在透過提供一流的支援,結合使用開放原始碼的 Adobe BlazeDS 專案及其強大的遠端處理和訊息傳遞功能,以及熟悉的 Spring 程式設計模型,來實現此目的。
第一個里程碑主要是基礎版本,著重於支援將 BlazeDS MessageBroker(處理來自 Flex 客戶端傳入訊息的中心元件)配置和啟動為 Spring 管理的物件、透過 Spring DispatcherServlet 基礎架構將 HTTP 訊息路由到它,以及輕鬆地將 Spring bean 匯出為直接 Flex 遠端處理的目的地。未來里程碑會以這個基礎為基礎,以提供更深入的功能,例如 Spring Security 整合、使用 Spring 的 JMS 支援的訊息傳遞整合、與 Spring 3.0 的 REST 支援結合使用的 AMFView,以及希望能夠滿足社群的需求,而我們尚未想到的其他事項。此里程碑也是我們邀請社群參與的第一次機會,透過試用版本並在專案 Jira和新的社群論壇中提供意見。
我建立了一個修改版本的 BlazeDS 試用範例應用程式,它使用 Spring BlazeDS Integration。修改後的範例的完整來源在此處提供。您應該能夠將範例匯入 Eclipse 並使用 WTP 執行它。成功部署應用程式後,您可以透過 http://localhost: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 Integration 的一般方法是繼續使用標準 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。這是透過一個簡單的 HandlerMapping 結合 Spring 配置中的 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 社群擴充功能。