使用 Spring BlazeDS 整合 1.0

工程 | Jeremy Grelle | 2009 年 6 月 11 日 | ...

今天我們宣佈開源 Spring 專案組合的最新成員 Spring BlazeDS 整合 1.0 GA 版本正式釋出。配合此事件,我認為是時候更新我的之前的入門文章了。回顧一下

該專案的目的是使使用 Adobe Flex 作為前端客戶端構建 Spring 驅動的富網際網路應用程式 (RIA) 更加容易。它旨在透過提供一流的支援,將開源 Adobe BlazeDS 專案及其強大的遠端呼叫和訊息傳遞功能與熟悉的 Spring 程式設計模型結合使用,從而實現這一目的。

試用 Spring BlazeDS 整合

自第一個 M1 版本以來,我們極大地擴充套件了功能集,包括
  • 全面的 Spring Security 整合
  • 非同步訊息支援(支援 3 種不同的訊息目的地型別)
  • 一個完整的 XML 配置名稱空間
  • 基於註解的遠端呼叫配置選項
  • 眾多高階定製鉤子

現在專案發行版中包含了與 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 應用程式上下文的一些方面。
The web application context configuration files. 應用程式設定了一個根 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 基礎設施,包括 HandlerMappingHandlerAdapter。你可以透過可選屬性和標籤進一步定製,例如 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>

然後,透過 testdrive-servlet.xml 中的以下內容,將該基本 Spring bean 暴露給 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 整合為三種不同的訊息介面卡提供整合支援

  1. BlazeDS ActionScriptAdapter 用於基本 AMF 訊息,包括使用提供的 MessageTemplate 將這些訊息從簡單的 POJO 推送到訂閱客戶端的能力
  2. JmsAdapter 用於連線到 Spring 管理的 JMS 目的地
  3. IntegrationAdapter 用於連線到 Spring Integration MessageChannel
使用這些介面卡的訊息目的地使用 XML 名稱空間進行設定,方式類似於遠端呼叫目的地。例如,請參閱 testdrive-servlet.xml 中的以下定義

<flex:message-destination id="chat" />

這設定了一個名為“chat”的基本 AMF 目的地。定義了此目的地後,Flex 客戶端可以使用 ProducerConsumer API 透過它進行通訊。要檢視此特定目的地如何使用,請檢視 /chat/src/main/flex/chat.mxml 中的 Flex 聊天示例原始碼。

連線由 JMS 目的地支援的訊息目的地類似,使用 jms-message-destination 標籤變體


<flex:jms-message-destination id="jms-chat" jms-destination="chatTopic" />

此版本引用了一個 Spring 管理的 JMS Topic(在本例中定義在 /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 Messaging”示例,看看將簡單的 POJO 訊息處理器引入其中有多容易。

進一步探索

透過這個快速介紹,我們只是觸及了 Spring BlazeDS 整合功能的皮毛。如果你有興趣構建一個 Spring 驅動的 RIA,我鼓勵你仔細研究試用版中的所有示例以瞭解更多資訊。同時,檢視我們一些活躍社群成員構建的這些額外的示例,並看看社群驅動的Spring ActionScript 專案,將 DI 的價值帶到 Flex 客戶端。

一如既往,如果你對如何進一步增加價值有任何想法,或者有任何其他反饋要分享,我們邀請你透過論壇Jira 參與進來。

獲取 Spring 電子報

透過 Spring 電子報保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助力你加速進步。

瞭解更多

獲取支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部