領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多更新:下面展示的大部分程式碼示例已過時,並已被更早的 “使用 Spring BlazeDS Integration 1.0” 文章中的示例所取代。
今天,我們宣佈了 Spring 開源專案組合中最新成員 Spring BlazeDS Integration 的第一個里程碑版本公開發布。該專案的目的是透過提供對開源 Adobe BlazeDS 專案及其強大的遠端處理和訊息傳遞功能的頭等支援,並結合熟悉的 Spring 程式設計模型,從而更輕鬆地使用 Adobe Flex 作為前端客戶端來構建 Spring 驅動的富 Internet 應用程式。
這個第一個里程碑版本是一個非常基礎的版本,專注於支援將 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 的遠端處理目的地。預設情況下,目的地的 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 社群擴充套件。