整合 Macromedia Flex和 Java

來源:互聯網
上載者:User

 給您現有的結構介紹一個RIA 架構

  現在你對RIA 概念的已經有些瞭解了, 讓我們看看怎麼把RIA 引入到您現有的結構中去。 其中我們也將著重論述怎樣把RIA表現在一個層狀應用中。 此外, 也會講到當用Flex與一些普遍的公開的架構的結合開發時存在的一些潛在的問題。 這些執行個體將有助於引入RIA 到您的結構中去。

  就讓我們先由辨認層狀結構開始。一個結構可能包括以下幾層: 展示層, 業務代表層,業務綜合服務層, 和持久層。 這是各自層的基本實現:

Flex + Business Delegates + Spring Framework + Hibernate

接下去的內容將集中講解每一層。

我現有的MVC 展示層是怎麼樣的?

  在Web應用程式中展示層是用來給使用者傳遞使用者介面, 處理後端服務要求, 並且儲存資訊資料模型用的。對剛接觸RIA的開發員最初可能會傾向於重新使用現有的Struts。 但是, 象Flex這些開發產品都提供了他們自己的MVC 結構。 難道您真地需要維護一個包括二個MVC 結構的展示層嗎?

  以下是當Flex客戶機通過Struts組件向Java 伺服器作出請求時的執行個體。在被更高層接收之前,Flex客戶機的請求會先被發送到Struts表示架構。 圖1 顯示了哪些是不做的:


圖1 。怎樣不整合Flex and Struts和其它Java組件。

  表示架構譬如Struts是由HTTP傳送HTML 請求來啟動並執行。 當用Flex客戶機來使用HTTP 協議時, 開發員就會出於對效能和物件導向的優點考慮,通過HTTP來使用遠程對象而反對提交請求的方式。 所以, 有序化的使用這兩個表示架構會提供協議配錯。 除非您有特定需要直接地用RIA來整合Strut ,這樣才可以避免。 圖2 顯示一個當使用Flex 和 Struts時更好的解決方案


圖2 。 介紹Flex 和 Struts與其它Java 組件

  圖2 建議怎麼安排分離的Flex組件 和 Struts組件共存。 但這是有條件的,這需要在當應用程式請求並行RIA 組件和輕量Struts組件的時候。

  開發員應該運用RIA 客戶機來做點什麼。對於那些熟悉頁面請求接聽模式的傳統Web開發員來說,這是一個明確的思想上的轉變。象Flex這樣的RIA 產品並非像Struts一樣是請求或回應驅動。 RIA 客戶機負責在任何情況下更新UI而不必回到伺服器。
  當使用RIA時Struts不只是您唯一想的事了。 熟悉這類型技術需要時間。 在經曆這些曲折以後, 最大的問題是Java伺服器端組件的綜合化。 這也並非是針對RIA概念。

Flex與業務層整合

  前面我們已經討論了一些展示層相關的,下面我們討論其它層在我們的應用結構是怎麼受影響的。我們已經重設了我們的展示層組件; 我們怎麼把它與業務層整合在一起呢?

  Flex是一個可擴充的RIA 架構,它提供了很多方式與您的J2.EE 組件通訊。Flex提供了HTTP 通訊,全球資訊網服務通訊,還有Macromedia 的私人的AMF (ActionScript 傳訊格式化) 網關。AMF 網關是一個高效能二進位協議,它近似於Flash remoting協議。遠程對象運用HTTP 協議被發送到AMF 網關。Flex為每個這些通訊協定提供MXML 標籤, 這樣一來極大的減少編製程式複雜度。 此外, Flex允許您以或非同步或同步方式對您的企業等級啟用遠程調用。 通過使用一種非同步遠程購買權, 使用者就能夠對客戶機進行一些操作並且即使當發生在傳統全球資訊網應用中時也不被攔截。 您能阻攔使用者與使用同步調用的UI交涉。

  讓我們來考慮一下怎麼讓Flex和我們的業務綜合化層整合呢。 為這我們將使用Spring架構作為我們的綜合化層, 但這對您選擇實施什麼綜合化層並沒有限制。讓我們假設一下您有您的服務運行在Spring microcontainer裡, 並且您需要由Flex調用遠程對象。

  因為Flex對Spring完全不瞭解,您也許可以考慮添加一個separate, 即一個薄層作為代表您的service components。 並且, 因為Spring對Java介面起到了很大作用,所以我們可以建立一個代表對象,這個代表對象實施著和Spring服務一樣的Java 介面。 這些代表對象將提供一個減弱了的網關,它從Flex和綜合化層中分離。 您需要做的唯一的事是在Flex設定檔中配置這些對象因此他們能與AMF 網關共同操作。 這裡有一個執行個體將說明代表對象是怎樣被配置在server-side flex-config.xml Flex設定檔裡的:
<object name="OrderBusinessDelegate">
   <source>
      com.meagle.flexro.FlexBusinessDelegate
   </source>
   <type>stateless-class</type>
   <use-custom-authentication>
      true
   </use-custom-authentication>
   <allow-unnamed-access>
      false
   </allow-unnamed-access>
   <roles>
      <role>OrderUser</role>
      <role>Admin</role>
   </roles>
</object>

  初看Flex你會發現它一些有附加能力,類似於像設定安全性啦,決定委派對象是否申明啦。當Flex發一個遠端對象呼叫到內層時,它將會干擾一個Flex的委派Java對象.委派對象將會負責對呼叫內層或者服務層 (比如Spring).作為結果的對象將通過AMF網關返回到Flex用戶端,這個對象被稱為ActionScript對象.這裡是一個MXML代碼的例子, Flex用戶端用MXML代碼來遠程調用並將結果儲存到一個資料模式中.
<mx:RemoteObject id="soapro"
   named="OrderBusinessDelegate"
   protocol="https"
   showBusyCursor="true">
   <mx:method name="saveNewOrder"
              result="saveNewOrder_result(event)"
              fault="faultHandler(event.fault)"/>
   <mx:method name="findOrderById"
              result="findOrderById_result(event)"
              fault="faultHandler(event.fault)"/>
   <mx:method name="updateOrder"
              result="updateOrder_result(event)"
              fault="faultHandler(event.fault)"/>
</mx:RemoteObject>

<mx:Model id="roModel" >
   <!-- The object graph for the Order object
           will be stored here -->
   <Order/>
</mx:Model>

  用ActionScript equivalents寫的Java的域對象在AMF網關裡來回傳遞。這個過程開始於一個請求,這個請求是從Flex伺服器通過AMF網關到應用程式的其他層。一個返回對象的圖,將會被通過其他Java層,最後通過一個AMF網關返回到伺服器。一旦這個對象通過網關他們就將被轉變為ActionScript equivalents。圖3詳細說明了這一過程:


圖3. Overview of the AMF gateway.

  更多關於在Flex 和Java tier之間的來回傳遞對象的說明是: 因為ActionScript 2.0 是一種物件導向的語言, 它是可能產生有Java equivalents的ActionScript 對象的。這使在AMF網關之間來回地傳遞對象變得比較容易和一致。被送回到Flash 外掛程式的 ActionScript 對象類似資料傳送對象(DTO) 。這是必要的因為這個Flash 外掛程式沒有任何Java 已耗用時間構成要素。下面是一個用Java寫成的一個Order domain object的一個熟悉例子:
package com.meagle.bo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* This object represents an order.
* @hibernate.class table="TestOrder"
* @author meagle
*/
public class Order {
   private int id;
   private double total;
   private int version;
   private String userName;
   private List orderLineItems = new ArrayList();

  // other fields and getter/setter methods not
  // shown to save space
}
Here is the ActionScript equivalent:

/**
* Generated Action Script Object
* for com.meagle.bo.Order. Do not edit!
*/
class com.meagle.bo.Order extends Object {

   public function Order(){}

   public static var regClass =
      Object.registerClass("com.meagle.bo.Order",
                            com.meagle.bo.Order);

   var id : Number;
   var orderLineItems : Array = new Array();
   var total : Number;
   var userName : String;
   var version : Number;

   // other fields and getter/setter methods not
   //shown to save space
}

  在ActionScript Order對象裡你應該注意Object.registerClass這個特別方法。AMF 網關用這個Object.registerClass  方法在Java 和 ActionScript之間來拆整對象。這個方法把用戶端的ActionScript 類註冊到對伺服器端的Java 類。因 為這些對象是很相似的,所以你在一個稍微不同的格式裡不想重寫你的域對象也是可理解的。像XDoclet 和螞蟻之類的工具允許你自動地產生這 些ActionScript  對象而不是手動地編碼。現在你能像在Flex客戶裡的ActionScript equivalents操作你的Java對象了

Flex與持久層整合

  在使用一個在web上定義好的耦合的體繫結構的應用程式中,你不直接和你的持久層對話。使用Flex不應該改變這個體繫結構。在大部分情況下,整合層將代替你和你的持久層對話。通常是使用Data Access Object (DAO)來完成的. Data Access Object (DAO) 是用來串連諸如資料庫的永久儲存的資料的。Flex用戶端不直接存取整合層甚至不直接瞭解這個層,因為它構築了一個緊密的連接。讓我們用Hibernate來作為持久層的一個例子。

  當在Macromedia's AMF gateway環境下使用Hibernate和遠程對象時,會有一對錯誤。Hibernate使用者知道你不能訪問一個不含有已初始化Hibernate會話對象的集合。訪問一個沒有被初始化的動態代理對象的集合會導致執行階段錯誤。The AMF 網關不知道如何特定的去尋找Hibernate動態代理對象。一個潛在的方法是面向方面的編程(AOP)。即將一個即將傳送給AMF網關的對象作為委代對象,移除動態代理。這是一個包含傳遞結果對象給攔截器,反覆尋找使用映射並沒有被初始化的代理對象的過程。如果找到什麼無用的代理對象或集合,將他們設定為null。這是一個cross-cutting關注,可以作為一個方面,進而使用AOP語言,比如JBoss AOP, AspectJ, Spring AOP等等。AOP攔截器應該被應用於業務代理層的對象。

圖4顯示的一個應用架構:

圖4在代理對象傳入AMF網關之前介紹了AOP攔截器 這進一步在高層減少了重複的群組件,比如整合層,持久層等等。
  值得慶幸的是AMF網關不知道緩衝雙向對象,所以無限的遞迴迴圈不會在傳送對象時發生。因此,在AMF網關上互相傳遞對象時,你可以完全保持這種關係。同時,因為對象是非串連的,並且會有拷貝,你需要使用Session.saveOrUpdateCopy(Object object)方法去儲存一個對象。這個方法必須使用,因為被傳回到AMF網關的對象不會在位元組碼資訊上加入對Hibernate有益的資訊。

驗證

  典型的J2EE web應用程式有許多種身分識別驗證模式。它有可能是基於容器的身分識別驗證模式,或者是一些自訂密碼的使用者驗證。像Flex之類的RIA 伺服器允許你在大多數的應用程式伺服器上使用Flash用戶端的自訂身分識別驗證格式和基於容器的身分識別驗證。此外,如果你看一看上面的業務授權結構的例子的話,你會發現,為了安全起見你可以分配任務給這些對象。甚至在AMF網關中還有很多異常分支,允許開發人員們擷取HttpRequest、HttpResponse和ServletConfig對象來改進您想使用的、帶有授權對象的安全性。

總結

  這篇論文引入了一些概念,目的是為了讓您瞭解當您使用諸如Flex之類的RIA時的權衡和潛在的缺陷。不論你使用的是Flex還是其它的RIA工具,在構築應用程式的時候都會考慮最重要的是什麼。當評估一個RIA架構時,要確定它有足夠的可擴充性來對應應用程式的需求。此外,在RIA和Java之間傳送對象時,需要注意要謹慎的構築綜合性的問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.