領先一步
VMware 提供培訓和認證,助力你加速進步。
瞭解更多今天我們宣佈開源 Spring 專案組合的最新成員 Spring BlazeDS 整合 1.0 GA 版本正式釋出。配合此事件,我認為是時候更新我的之前的入門文章了。回顧一下
該專案的目的是使使用 Adobe Flex 作為前端客戶端構建 Spring 驅動的富網際網路應用程式 (RIA) 更加容易。它旨在透過提供一流的支援,將開源 Adobe BlazeDS 專案及其強大的遠端呼叫和訊息傳遞功能與熟悉的 Spring 程式設計模型結合使用,從而實現這一目的。
現在專案發行版中包含了與 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 應用程式上下文的一些方面。
應用程式設定了一個根 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 設定預設通訊通道(按優先順序順序)。此標籤完全可選,但通常需要類似的設定,因為釋出/訂閱訊息的通訊通道要求與直接遠端呼叫的要求往往不同。有關一些指導,請參閱此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 整合為三種不同的訊息介面卡提供整合支援
<flex:message-destination id="chat" />
這設定了一個名為“chat”的基本 AMF 目的地。定義了此目的地後,Flex 客戶端可以使用 Producer 和 Consumer 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 訊息處理器引入其中有多容易。