領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多今天我們宣布開放原始碼 Spring 專案組合的最新成員 Spring BlazeDS Integration 的 1.0 GA 版本正式發布。配合此事件,我想是時候更新我之前的入門文章。回顧一下
此專案的目的是更輕鬆地使用 Adobe Flex 作為前端客戶端來構建基於 Spring 的 Rich Internet Applications。它旨在通過提供對使用開放原始碼 Adobe BlazeDS 專案及其強大的遠端處理和訊息傳遞功能以及熟悉的 Spring 程式設計模型的頭等支援來實現此目的。
現在包含在 專案發布 中的是與 Adobe 合作構建的範例的完整集合,這些範例演示了各種功能的使用,稱為 Spring BlazeDS Integration Test Drive。這些範例是開始使用該專案的好方法,在這裡我將快速介紹一下所有內容是如何組合在一起的。
如果您想在您的 IDE 中跟隨操作,請繼續下載發布版本並按照 這些指示 使用 Maven 構建範例並將其匯入到 Eclipse 中。最終結果是您將在 Eclipse 工作區中匯入相當多的新專案。大多數專案用於單獨的 Flex 範例(即,它們包含 .mxml 和 .as 原始碼並編譯為 .swf 檔案)。實際的 WTP 可部署 Web 應用程式結構位於“testdrive”專案中,這也是我們首先關注的地方。
專案中首先值得關注的是 /testdrive/src/main/webapp/WEB-INF/web.xml。在這裡,您將看到一個相當典型的設定,用於通過 ContextLoaderListener 配置根 Web 應用程式上下文,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 Integration 的好處之一是,以前需要在這些 BlazeDS 特定檔案中定義的設定現在可以完全通過提供的 Spring XML 配置命名空間和 Java 註解來定義。這樣可以減少很多心理上下文切換,此外,如果您使用免費的 SpringSource Tool Suite,您可以在編輯 Spring 配置檔案時獲得完整的程式碼完成支援。
現在讓我們看一下範例的 Spring 應用程式上下文的一些方面。
該應用程式設定了一個根 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 基礎架構,包括 HandlerMapping 和 HandlerAdapter。您可以通過可選屬性和標籤進一步自訂,例如 services-config.xml 的位置、映射到 MessageBroker 的特定路徑等,但在常見情況下,這就是所需的全部。
message-service 子標籤正在為 BlazeDS MessageService 設定預設通訊通道(按優先順序)。此標籤完全是可選的,但通常需要類似的設定,因為 pub/sub 訊息傳遞的通訊通道要求往往與直接遠端處理的要求不同。有關一些指南,請參閱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>
然後,該基本 Spring bean 將通過 testdrive-servlet.xml 中的以下內容暴露給 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() + "%");
}
非同步 pub/sub 樣式通訊同樣簡單。Spring BlazeDS Integration 提供對三種不同訊息傳遞適配器的整合支援
<flex:message-destination id="chat" />
這會設定一個名為 "chat" 的基本 AMF 目的地。定義此目的地後,Flex 客戶端可以使用 Producer 和 Consumer API 通過它進行通訊。要了解如何使用此特定目的地,請查看 /chat/src/main/flex/chat.mxml 中的 Flex chat 範例原始碼。
連接由 JMS 目的地支援的訊息目的地類似,使用標籤的 jms-message-destination 變體
<flex:jms-message-destination id="jms-chat" jms-destination="chatTopic" />
此版本引用了 Spring 管理的 JMS 主題(在這種情況下在 /testdrive/src/main/webapp/WEB-INF/spring/infrastructure-context.xml 中定義)。查看 Flex jms-chat 範例的原始碼(位於 /jmschat/src/main/flex/jmschat.mxml),您會注意到它與使用基本 AMF “chat” 目的地的版本相同。
同樣,連接到 Spring Integration MessageChannel 只需要使用 integration-message-destination 標籤即可。請務必查看試用版中的 “POJO Messaging” 範例,了解將簡單的 POJO 訊息處理程式整合到混合中有多麼容易。