領先一步
VMware 提供培訓和認證,助您加速發展。
瞭解更多更新:下方展示的大多數程式碼示例已過時,已被更近期的"使用 Spring BlazeDS Integration 1.0"文章中的示例取代。
今天,我們宣佈了開源 Spring 專案組合最新成員 Spring BlazeDS Integration 的第一個里程碑版本的公開可用。該專案的目的是透過使用 Adobe Flex 作為前端客戶端,使構建由 Spring 提供支援的富網際網路應用程式 (RIA) 變得更加容易。它旨在透過結合熟悉的 Spring 程式設計模型,為使用開源 Adobe BlazeDS 專案及其強大的遠端呼叫和訊息傳遞功能提供一流的支援,從而實現這一目標。
這第一個里程碑版本是一個基礎版本,專注於支援將 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 Integration。修改後的示例完整原始碼可在此獲取。您應該能夠將該示例匯入 Eclipse 並使用 WTP 執行它。應用程式成功部署後,您可以透過 https://: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 配置模型進行配置。因此,將 Spring 管理的 bean 暴露給 Flex 客戶端進行直接遠端呼叫,只需簡單地配置一個遠端呼叫匯出器 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。預設情況下,目標的服務 ID 將與 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 社群擴充套件。