在Lotus Notes 8 中開發複合應用

genusBIT發表於2008-07-18

在 Lotus Notes/Domino 8 眾多新特性中,複合應用(Composite Application)是最具有革命性的一次突破,業界普遍認為,這種應用模式代表了 IBM 軟體在企業前端整合上的新思路。本文結合例項,系統而詳細地介紹瞭如何基於 Notes 8 建立複合應用,並給出了開發 NSF 元件以及 Eclipse 元件的方法和要點。讀者可以通過本文了解到複合應用開發的整個流程。

在 Notes 8 中開發複合應用

作為 Lotus 的售前工程師,回顧整個 2007 年,我最經常被客戶和合作夥伴問到的問題是:你認為 Domino/Notes 8( 以下簡稱 ND 8) 中最大的技術突破是什麼?是生產力工具?還是對 DB2 的正式支援 ?

毫無疑問,上述這些功能都是 ND 8 非常出彩的地方,即使放在整個 ND 的發展史上看也將會佔有一席之地。但最終我的答案只有一個:ND8 中最大的突破當然是複合應用(Composite Application)。因為這的確是一種非常有“內涵”和革命性的新型應用模式。

很難簡單的說明覆合應用究竟意味著什麼?從企業 Web 2.0 的觀點,你可以說它代表著混搭 Mashup 的思想;站在企業整合的角度,它是 SOA 在使用者前端的具體實現;對使用者而言,它是一種全新的介面體驗;而對傳統的 Lotus 開發者來說,複合應用帶給了他們新的挑戰和機遇。

所以無論你出於什麼原因開啟了 Notes 8 客戶端,複合應用都是你絕對無法視而不見的亮點,因為它代表的是 ND 的未來——也許還不僅僅是代表 ND 的未來,而是整個 IBM 軟體在企業前端上的未來。


複合應用的基本定義與 Property Broker 程式設計模式

那麼什麼是複合應用(Composite Application)?一個標準的定義如下:複合應用是 為了滿足特定的業務目的而被放在一起的一套元件。如果覺得這個定義太抽象,那麼下面這個例子可以給大家一個感性認識。


圖 1. 複合應用範例
圖 1. 複合應用範例

這是一個用 Notes 8 開啟的應用(ComAppTest.NSF),你一眼能看出它和過去你所見到 Notes 的幀結構、檢視、表單等等這些元素全不相同但又似曾相識。在這個應用中,你看到了左上方展示新聞列表的 Notes 檢視,看到了右下方展示每篇新聞內容的 Notes 表單。此外,你還會看到左下方的圖片縮略表,和右上方的圖片大圖展示,但它們都不是 Notes 元素,而是兩個 Eclipse 外掛。所有這些東西(當然,它們有個正式的名稱——元件),為了一個業務目的(展現新聞內容和圖片)而組裝在一起,這就構成了一個複合應用

不只是組裝,元件之間還可以傳遞訊息。還是看上面這個例子,當我們點選左上方新聞列表中的某篇新聞時,會把該新聞的新聞編號傳遞給其他元件,這樣右下方的 Notes 表單元件會根據該編號顯示新聞的詳細資訊,右上方的 Eclipse 元件會根據該編號顯示新聞的圖片內容。這裡我們把所傳遞這個資訊叫做“屬性”(Property),把各個元件根據外來屬性所做的動作稱為“操作”(ActionOperation)。通過 Notes 8 環境中提供的 Property Broker 機制,複合應用可以在不同的元件之間傳遞屬性,執行操作。這種程式設計模式,我們也稱之為 Property Broker 的程式設計模式。


圖 2. Property Broker 程式設計模型
圖 2. Property Broker 程式設計模型

Property Broker 程式設計模式的基本設計理念總結如下:

  • 屬性是型別化的可交換資料
  • 操作是消費屬性的行為
  • 元件定義自身的屬性和操作
  • 連線(Wire)將屬性和操作相關聯

在這種程式設計模式下,程式的開發很大程度上就是元件的開發。而開發元件首先要定義元件的屬性和操作,並把這種定義通過 WSDL 描述出來。然後實現元件屬性的釋出,以及其他元件如何接收屬性並執行對應的操作。開發好元件之後,使用者可以把這些元件加入到一個複合應用中去,並通過連線(wire)將型別匹配的屬性操作相關聯。這樣在複合應用執行時,以上圖為例,當新聞列表發出了一篇新聞的 News ID 作為屬性時,property broker 將通過連線查詢到與之相關的元件和操作,並把該 News ID 值傳遞給相應元件(上例中為縮圖展現元件),由該元件執行縮圖展現操作。

熟悉 IBM WebSphere Portal 開發的人會意識到,這和 Portal 中的點選即動Click To Action 以下簡稱 C2A)的功能非常類似。事實上,不只是形似,Notes 8 中的複合應用在實現上與 Portal 的 C2A 也有非常緊密的關係。舉個例子,為了描述每個元件的屬性和操作,需要有一個 WSDL 描述檔案,而 Notes 8 中這個檔案的格式幾乎完全照搬了 C2A。

如果探循的再深一些你會發現,整個複合應用的概念最早正是來自於 IBM WebSphere Portal。所以我們強調一點:複合應用並不是繫結到 Notes 8 的一種應用模式。複合應用有很多種實現載體(Portal,Lotus Expeditor 等等),Notes 8 上的複合應用只是其中一種。

但無論那種模式,複合應用體現了使用者前端元件化,標準化的趨勢。誰說 SOA 只做企業系統後端的整合?複合應用是對 SOA 前端的一次非常好的詮釋。

複合應用的建立

用 Notes 8 可以開啟兩種形式的複合應用,基於 Portal 的和基於 NSF 的,二者的差別主要在於存放應用檔案(XML 格式)的方式不同。這裡主要介紹基於 NSF 的複合應用。在 Notes 8 中建立一個複合應用是非常簡單的一件事情,因為基於 NSF 的複合應用就是一個 NSF 資料庫,在建立時,和一個傳統的 NSF 資料庫沒有什麼區別。所不同的是選擇模板時必須選擇空白組合應用程式模板。


圖 3. 在 Notes 8 中建立複合應用
圖 3. 在 Notes 8 中建立複合應用

建立之後,你將得到一個空白的複合應用頁面。接下來點選 操作 中的 編輯複合應用,Notes 8 會啟動 CAE(Composite Application Editor)。通過這個工具,你可以把 NSF 元件或者 Eclipse 元件拖拽到這個複合應用的頁面上。此外,通過這個工具,你也可以建立多頁面的複合應用。


圖 4. 複合應用編輯器
圖 4. 複合應用編輯器

建立空白複合應用 NSF,然後填充元件,這就是建立一個複合應用的過程。這個過程本身並不複雜。不過隨之而來一個非常關鍵的問題:這些 NSF 元件和 Eclipse 元件是如何開發的?





回頁首


NSF 元件的開發

對一個複合應用的元件而言,最基本的部分是屬性和操作。所以對元件的開發而言,最重要的部分也將圍繞著屬性和操作來進行,大體上可以分為三個步驟:定義屬性和操作,屬性的釋出,操作的實現

下面我們將用上面這個複合應用中的兩個元件為例,描述 NSF 元件開發的過程。

這兩個 NSF 元件一個是 Notes 檢視(ImageNewsList),用於展示新聞列表。一個是 Notes 表單 (ImageDescForm),用於顯示新聞具體內容。

定義屬性和操作

屬性和操作的定義過程首先是一個思考的過程:將一個 Notes 元素封裝成一個元件,需要它對外發布什麼屬性,接收什麼屬性,完成什麼操作。這個分析的過程與具體的編碼實現同等重要。因為在設計元件時,模組化與可重用性是元件非常關鍵的要素,所以在構思一個元件時,考慮的不僅僅是實現功能,還應該考慮如何從一個特定功能中抽取出可通用的服務。

ImageNewsList 是一個非常典型的 NSF 元件。作為一個 Notes 檢視,它本身提供了將新聞文件列舉的功能,現在考慮把它封裝成 NSF 元件,我們希望它能夠在單擊檢視中的每個新聞文件時,對外傳送一個屬性:該篇新聞的新聞號。


圖 5. NSF 元件——ImageNewsList
圖 5. NSF 元件——ImageNewsList

為此,我們需要給這個檢視所在的 NSF 資料庫定義一個 WSDL,在 Domino Designer 8 中增加了這樣一個名為“連線屬性”的新設計元素。在這個 WSDL 中我們將描述可對外發布的屬性 NewsIDChanged。作為一個 XML 檔案,WSDL 可以通過文字編輯器直接編寫(複合應用的熟練開發者一般青睞這種方式),也可以利用 Domino Designer 8 裡附帶的 WSDL 視覺化編輯器 Property Broker Editor 進行編輯,後者會自動生成 XML 程式碼。


圖 6. Property Broker Editor——定義屬性
圖 6. Property Broker Editor——定義屬性

如圖,我們在 WSDL 中直接加入了一個叫 NewsIDChanged屬性。該屬性的型別是 ImageNewsIDType(這是一個自定義的型別),名稱空間是com.ibm.xna。屬性叫什麼名稱並不重要,重要的是名稱空間和型別,因為這才是 Property Broker 在匹配屬性和操作時的依據。

該屬性在 WSDL 檔案中的程式碼片斷如下:


清單 1. WSDL 中對屬性的定義
                





接下來介紹如何在 WSDL 中定義操作。屬性用於對外發布,而操作用於接收屬性,所以每一個操作的定義都是和一個屬性相關的。ImageDescForm 是一個 Notes 表單,該表單將接收前面定義的這個 NewsIDChanged 屬性,並執行一個操作 ShowImageDesc,該操作將在表單中展現新聞號為 NewsIDChanged 的新聞文件的文字資訊。


圖 7. NSF 元件——ImageDescForm
圖 7. NSF 元件——ImageDescForm

這樣一個操作在 Property Broker Editor 中的定義如下:


圖 8. Property Broker Editor——定義操作
圖 8. Property Broker Editor——定義操作

如圖,操作 ShowImageDesc 與屬性 NewsIDChanged 關聯,一旦元件接收到 NewsIDChanged 型別的屬性 —— 再次提醒:名稱不重要,重要的是型別和名稱空間匹配——就會執行 ShowImageDesc 的操作,該操作的具體實現將在後文中提到。

操作 ShowImageDesc 的定義在 WSDL 中的程式碼片斷如下:


清單 2. WSDL 中對操作的定義
                

 
 
 
  


在 WSDL 中定義好屬性和操作之後,接下來的問題就是如何在 Notes 元素中實現屬性的釋出和操作的執行。

NSF 元件中屬性的釋出

ImageNewsList 這個 Note 檢視元件而言,有兩種方式實現屬性 NewsIDChanged 的釋出。我們先介紹最簡單的一種做法,這也是在這個例子中我們所使用的方法。

首先我們需要在這個檢視中新增一個列,該列的值為新聞文件的新聞號。


圖 9. 在 Domino Desginer 中設計可釋出屬性的列
圖 9. 在 Domino Desginer 中設計可釋出屬性的列

然後選擇列屬性視窗的 程式設計欄,賦予一個程式使用的列名稱。最重要的是在 編寫設定 中選擇所要對應的屬性:NewsIDChanged。然後儲存整個檢視即可。這樣就可以實現 NewsIDChanged 屬性的釋出。無需程式設計,非常方便!


圖 10. 在編寫設定中指定所要釋出的屬性
圖 10. 在編寫設定中指定所要釋出的屬性

很簡單,不是嗎?這種方法不需要寫任何程式碼即可在 Notes 檢視中實現屬性的釋出,但目前也只有 Notes 檢視可以這樣做。如果想在其他 Notes 元素中實現屬性的釋出,可以通過另一種更加通用的方法:編寫 Lotusscript. 程式碼來實現。

在這個例子中,我們也可以通過 Lotusscript. 程式碼來發布 NewsIDChanged 屬性。我們只需在 ImageNewsListOnselect 事件中新增如下的內容:


清單 3. 釋出屬性的 Lotusscript. 樣例程式碼
                
Sub Onselect(Source As Notesuiview)
    ...
    獲取選中的文件的 ImageNewsID 域值
    ...

    On Error 4719 Goto err4719 // 一旦不是複合應用環境,則跳至報錯處
    Dim pb As NotesPropertyBroker // 定義 NotesPropertyBroker 物件

    Set pb = s.GetPropertyBroker() 

    If Not (pb Is Nothing) Then
        Call pb.setPropertyValue("NewsIDChanged",ImageNewsID ) 
        // 指定要釋出的屬性名和屬性值

        Call pb.Publish() // 釋出屬性
        Exit Sub

    End If

    Exit Sub

    err4719:
    Print "Error" & Str(Err) & ": " &Error$
    Messagebox "It's not run in a Composite context"

End Sub

在程式碼中我們看到,Notes 8 中新增了一個 Notes 類 NotesPropertyBroker,通過該類,我們可以在 Lotusscript. 中獲得當前 Notes 8 客戶端中的 Property Broker 物件,並執行相應的操作。在釋出屬性的時候,只要呼叫 propertyBrokersetPropertyValue 方法寫入屬性名和屬性值,再呼叫 propertyBrokerpublish方法即可完成屬性的釋出。同樣非常簡便!

瞭解瞭如何在 NSF 元件中釋出屬性之後,下面我們再來看看 NSF 元件中操作是如何獲取這些屬性值的。

NSF 元件中操作的實現

現在我們為 ImageDescForm 來具體實現 ShowImageDesc 操作。該操作將接收到一個值為新聞編號 ImageNewsID 的屬性 NewsIDChanged,然後在表單中顯示新聞編號為 ImageNewsID 的新聞文件的標題,作者,正文等資訊。

熟悉 Notes 的人知道,Notes 開發中本來就有操作(Action)這種設計元素,為了與之區分,我們稱 NSF 元件中的複合應用操作為 WSDL 操作(WSDL Action)。在設計時為了便於 Notes 開發人員使用,建立 WSDL 操作的步驟沿襲了 Notes 操作的建立方法。

因此,為了實現這個名為 ShowImageDesc 的 WSDL 操作,我們首先要在 ImageDescForm 表單中建立一個普通 Notes 操作 ImageIDChangedAction


圖 11. 在 Domino Designer 中定義 WSDL 操作
圖 11. 在 Domino Designer 中定義 WSDL 操作

在該操作的高階屬性中,我們會發現一個新增設定:“組合設定”,在這裡可以選擇之前在 WSDL 中定義的操作 ShowImageDesc。通過這樣一步簡單的操作,一個普通的 Notes 操作 ImageIDChangedAction 就成為了一個 WSDL 操作,實現了ShowImageDesc。(一般情況下,建議將這個操作在操作條上隱藏)。


圖 12. 在組合設定中選擇對應的操作名
圖 12. 在組合設定中選擇對應的操作名

接下來我們需要在該操作的 click 事件中新增程式碼,實現下列內容:

  1. 接收屬性 NewsIDChanged
  2. 根據屬性 NewsIDChanged 的值,在新聞庫中查詢到對應新聞編號的新聞文件;
  3. 將該新聞文件的對應域值顯示在 ImageDescForm 表單上。

由於後兩步對 Lotus 開發人員並不陌生,這裡就不再贅述,在此僅列出接收屬性 NewsIDChanged 的 LotusScript. 程式碼,這是整個 WSDL 操作實現過程中最核心的部分:


清單 4. 接收屬性並執行操作的 Lotusscript. 程式碼
                
Sub Click(Source As Button)
    ...
    On Error 4719 Goto err4719
    Dim pb As NotesPropertyBroker
    Set pb = session.getPropertyBroker() // 獲取 PropertyBroker 物件

    Dim pbInputProperty As NotesProperty
    Dim pbcontext As Variant
    pbContext = pb.InputPropertyContext 
    Set pbInputProperty = pbContext(0) // 獲取屬性

    Dim InputPropertyName As String

    InputPropertyName = pbInputProperty.Name 

    Dim pbvalue As Variant
    pbValue = pb.GetPropertyValue(InputPropertyName) // 獲取屬性值
    ...
    // 對該屬性值進行處理,在表單中顯示相應文件標題,作者和內容。
    …
    Exit Sub
err4719:
    Print "Error" & Str(Err) & ": " &Error$
    Messagebox "error"
    ...
End Sub

如上,通過 Notes 8 中提供的 PropertyBroker 相關的類和方法,WSDL 操作 ShowImageDesc 操作可以獲得屬性 NewsIDChanged 的值,存放到變數 pbValue 中。在此基礎上,可以對該值進行處理,在表單中顯示相應文件標題,作者和內容。

通過 定義屬性和操作,釋出屬性,實現操作,我們得到了兩個 NSF 元件:ImageNewsListImageDescForm。對廣大 Notes 使用者而言,將 Notes 元素封裝成元件的好處在於:使用者可以充分利用現有的 Notes 資料庫,以模組化,元件化的 SOA 思想對它們加以改造。

Eclipse 元件的開發

當然很多情況下,只依靠 NSF 元件構建 Notes 8 複合應用是不夠的。在做報表展現,圖形處理,以及一些其他業務應用的時候,傳統 Notes 開發會遇到一些瓶頸。在 Notes 8 中,我們可以通過 Eclipse 元件來彌補 NSF 元件功能上的不足。

開發複合應用的 Eclipse 元件需要具有 Eclipse 的外掛(plug in)開發技能。關於 Eclipse 外掛開發細則以及 Eclipse 元件開發環境的配置,請參考 http://www.eclipse.org 上的相關文件,此處不再贅述。

與 NSF 元件一樣,Eclipse 元件的開發同樣遵循著 定義屬性和操作,屬性的釋出,操作的實現 三個步驟。

定義屬性和操作

ImageView 元件為例,該元件接收 NewsIDChanged 屬性(該屬性值為新聞號),執行 ShowImage 操作:顯示該新聞號對應的新聞的圖片。要在 Eclipse 元件中定義該屬性和操作,需要執行下列步驟。


圖 13. Eclipse 元件——ImageView
圖 13. Eclipse 元件——ImageView

首先,建立 WSDL。Eclipse 元件中同樣使用 WSDL 來描述元件的屬性和操作,並且其格式與 NSF 元件的完全一致。這意味著我們同樣可以用前面提到的 Property Broker Editor 這個視覺化工具來編寫 Eclipse 元件的 WSDL(當你已經熟悉了 Eclipse 中複合應用元件的開發之後,你會更願意使用文字編輯工具來編輯)。呼叫 Property Broker Editor 的方法是 \framework\rcp\rcplauncher.exe -config wsdledit


圖 14. 利用 Property Broker Editor 定義 Eclipse 元件的屬性
圖 14. 利用 Property Broker Editor 定義 Eclipse 元件的屬性

利用上圖的 Property Broker Editor 工具我們得到了一個描述檔案 actions.wsdl。接下來,需要把得到的 action.wsdl 匯入到 Eclipse 元件中。在 Eclipse 的專案中,新建一個名為 wsdl(該名稱不做限定)的資料夾,把 WSDL 檔案匯入到該資料夾中。下面這步非常關鍵:在該 Eclipse 外掛的擴充套件中加入 com.ibm.rcp.propertybroker.PropertyBrokerDefinitions,並在該擴充套件下新建一個 handler。


圖 15. 擴充套件 PropertyBrokerDefinitions
圖 15. 擴充套件 PropertyBrokerDefinitions

在這裡,此擴充套件將會把描述檔案 WSDL 與具體實現類相結合。如下圖所示。File 屬性指定為我們剛剛生成的 actions.WSDL 檔案,Type 處選擇 SWT_ACTION,Class 屬性則選定將會具體實現 Eclipse 元件的操作的類 com.ibm.xna.actions.ImageViewAction


圖 16. 擴充套件詳細資訊
圖 16. 擴充套件詳細資訊

儲存後在 Eclipse 外掛的 plugin.xml 中會多出如下程式碼:


清單 5. Eclipse 元件的 Plug.xml 片斷
                
 
…… 
 
…… 
 			
			

至此,我們就完成了 Eclipse 元件屬性和操作的定義工作。需要強調的是,對某些之前沒有接觸過 Eclipse 外掛開發的 Notes 開發者而言,上述內容也許比較陌生,因為要掌握 Eclipse 中的擴充套件,擴充套件點等概念通常需要一些時間。但從長遠來看,考慮到這門技術在未來給他們帶來的價值,這種技術上的投入毫無疑問是值得的。

屬性的釋出

在 Eclipse 元件中,屬性的釋出同樣也非常簡單。這裡我們以另一個 Eclipse 元件 SnapshotView 為例,該元件用於展示若干篇新聞的圖片縮圖。一方面,它可以接受 ImageNewsList 傳遞給它的屬性,執行縮圖展現的操作;另一方面,當使用者點選某篇新聞的縮圖時,它會把該新聞的 NewsID 作為屬性發布出去。在這裡我們只介紹 SnapshotView 元件中屬性發布的實現。


圖 17. 擴充套件詳細資訊
圖 17. 擴充套件詳細資訊

在雙擊某張縮圖時,我們會執行如下的程式碼:

PropertyBrokerUtil.publishProperty("com.ibm.xna",viewID, "NewsIDChanged", id);

其中 PropertyBrokerUtil.publishProperty 方法是我們自定義的一個函式,通過該函式,SnapshortView(檢視號為viewID)將傳送名稱空間為 com.ibm.xna,名稱為 NewsIDChanged 的屬性,值為某篇新聞的編號 id

該方法的實現程式碼如下:


清單 6. 釋出屬性的 Eclipse 程式碼
                
public void publishProperty(String namespace,String viewID, 
    String property, String value) { 
    PropertyBroker pb = PropertyBrokerFactory. getBroker ();
    // 獲取 PropertyBroker 例項 
    PropertyValue[] values = new PropertyValue[1]; 
    try { 
        Property prop = pb.getProperty(namespace, property);
        // 根據名稱空間和屬性名獲取屬性 
        if (prop != null ) { 
            values[0] = PropertyFactory. createPropertyValue (prop, value);
            // 生成屬性值 
            pb.changedProperties(values, viewID);// 釋出屬性 
        } 
    } catch (PropertyBrokerException e) { 
        e.printStackTrace(); 
    } 
}
			

在上面這個函式中,我們首先獲取一個 Property Broker 的例項,再通過名稱空間和屬性名獲取 Property 例項。實際用來發布屬性的方法是 PropertyBrokerchangedProperties 函式,此函式有兩個引數,一個是 PropertyValue 陣列,用於存放多個要釋出的屬性值對;另一個是字串,用於標誌屬性變化時的上下文,應該與連線(Wiring)源元件的 EntityID 匹配。本例中,該 viewID 是通過 snapShotView.getViewSite().getId() + ":" + snapShotView.getViewSite().getSecondaryId() 拼接而成的。

如果覺得拼接這個 viewID 麻煩,還有一種做法更加簡單。可以使用 SWTHelper (com.ibm.rcp.propertybroker.swt.api.SWTHelper) 類的 changedProperties 函式釋出屬性。該函式的函式頭為:SWTHelper.changedProperties(PropertyValue[] arg0, IViewPart arg1),與 PropertyBroker 的同名函式的不同之處在於,該函式的第二個引數是指向 ViewPart 的指標。如果是在 ViewPart 類內部呼叫該方法的話,那麼很多情況下你只需要簡單寫一個 this 即可。

操作的實現

回到本節一開始介紹的 ImageView 元件,該元件接收 NewsIDChanged 屬性(該屬性值為新聞號),執行 ShowImage 操作:顯示該新聞號對應的新聞的圖片。以它為例,接下來我們看看 Eclipse 元件中操作是如何實現的。

前文提到,在定義 ImageView 的屬性和操作時,我們在 Plugin.xml 中指定了 WSDL 操作的實現類 com.ibm.xna.actions.ImageViewAction。該類繼承自 org.eclipse.core.commands.AbstractHandler,實現了該類的 excute()方法。

該方法的程式碼如下:


清單 7. 接收屬性並操作的 Eclipse 程式碼
                
public Object execute(ExecutionEvent ee) throwsExecutionException {
    Object event = ee.getTrigger();
    if (event instanceof PropertyChangeEvent) {
        // 判斷是否是屬性更改事件
        PropertyChangeEvent e = (PropertyChangeEvent)event;
        PropertyValue propValue = e.getPropertyValue();
        // 獲取屬性值
        finalString Val = propValue.getValue().toString();
        Wire wire = e.getWireDefinition();
        String targetName = wire.getTargetName();
        // 獲取目標操作名
        if (targetName.equalsIgnoreCase("ShowImage")) {
            // 判斷操作名是否匹配
            ……
            IViewPart part = SWTHelper.locateView (SAMPLE_VIEW); ImageView view = 
			    ( ImageView ) part; view.setVal(Val );
            // 把屬性值傳遞給對應的新聞展示檢視,展示圖片。
            ……
        }
    }
returnevent;
}

從上面的程式碼可以看到,通過處理 PropertyChangeEvent 類的例項,我們可以得到 ShowImage 操作所接收到的屬性值,並對該屬性值進行相應的處理。

簡而言之,只要我們對複合應用的 Property Broker 程式設計模式有了一個比較清晰的認識,那麼實現 Eclipse 元件中的操作將會是非常輕鬆的一件事。

總的來說,開發 Eclipse 元件對傳統的 Notes 開發者是一個全新的挑戰,不過作為 Notes 開發者,他們已經習慣於接收種種新鮮事物。舉個例子,現在 Notes 開發中常用的 HTML,javascript,Java,Servlet 等技術,在一開始也是和 eclipse 一樣,作為一種新技術加入到 Lotus 開發中來的。所以對 Lotus 自身和 Lotus 開發者而言,ND 8 會給他們帶來一片新的天地。


複合應用的組裝

建立好了複合應用,開發好了元件,接下來就可以將這些元件加入到複合應用中,並進行組裝了。

回到複合應用的編輯介面 CAE(Composite Application Editor)中,右邊的 sidebar 是元件選用板。PIM 欄中列舉出了 Notes 8 中提供的開箱即用的元件,主要是郵件,日曆,待辦等內容,常規欄中則是使用者自定義的元件。右鍵選單中點選 新增元件,可以選擇 新增 NSF 元件 還是 Eclipse 元件。其中 Eclipse 元件又分為了 來自更新站點的,或者是 來自於本地的 兩種。後者在 Eclipse 元件的開發除錯過程中使用的比較多,正式使用時,一般會將 Eclipse 元件打包放到一個更新站點上,客戶端可以自動下載安裝。


圖 18. 元件選用板
圖 18. 元件選用板

新增 NSF 元件時需要指定元件的名稱,描述,以及 Notes URL。如果不熟悉 Notes URL 的寫法,可以通過瀏覽的方式獲取物件的 Notes URL。


圖 19. 加入 NSF 元件
圖 19. 加入 NSF 元件 圖 19. 加入 NSF 元件

新增來自更新站點的 Eclipse 元件時需要指定站點描述檔案 site.xml 的位置,然後從該站點的可用元件中選擇自己想要新增的元件。至於如何將 Eclipse 元件打包並放到更新站點上,請參考相應文件,此處不再贅述。


圖 20. 加入 Eclipse 元件(從更新站點)
圖 20. 加入 Eclipse 元件(從更新站點) 圖 20. 加入 Eclipse 元件(從更新站點)

現在我們就可以通過拖拽的方式將元件選用板上的元件新增到複合應用中去了。各個元件的位置也可以通過拖拽的方式進行調整。


圖 21. 調整元件位置
圖 21. 調整元件位置

在確定好元件的佈局之後,接下來的工作是非常關鍵的一步:連線。前文我們說到了 Property Broker 程式設計模式,其中一個基本的設計理念是:元件之間需要進行連線(Wiring)以匹配屬性和操作。而 CAE 中提供了視覺化的介面幫助開發者快速進行元件之間的連線。


圖 22. 連線(Wiring)
圖 22. 連線(Wiring)

在複合應用的元件名稱處右鍵點選選單進入連線介面。在這個圖形介面中,使用者可以直接在型別匹配(屬性名稱可以不一致)的屬性和操作之間連線,從而將各個元件有機的聯絡在一起,實現應用的複合。複合,但絕不復雜,大部分的時候,它就是這麼簡單!


結束語

現在你就可以感受一下你剛剛組裝完成的這個圖片新聞複合應用了。你會感受到,來自於不同系統,由不同技術實現的一組元件,為了某個業務目的被組裝到一起,既充分利用了現有資源,又滿足了實際需求,既改進了使用者的介面體驗,又顛覆了傳統的前端整合模式。這,就是複合應用。它帶給你的震撼將不僅僅是 Notes 應用的擴充套件,更確切的說,它是一次企業前端的革命;它所承擔的也不僅僅是 Lotus 的未來,更確切的說,它是 IT 前端整合的未來。所以無論你現在是否是 Notes 使用者,複合應用都是值得你關注的一門技術。

元件獨立開發,以服務的形式定義介面,在不同的應用中扮演不同的角色;應用以鬆耦合的方式對元件進行組裝,應用開發者不用再關心各個元件的底層實現——複合應用的構建模式體現了 SOA 中模組化,標準化的思想。從這個層面上說,複合應用的開發讓“SOA”這個對許多開發者而言有些霧裡看花的概念變得非常具體。還在等什麼?趕緊開啟你的 Notes 8 開始你自己的複合應用之旅吧!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-404356/,如需轉載,請註明出處,否則將追究法律責任。

相關文章