由於DataSnap可以使用JSON封裝資料,因此任何支援JSON的程式語言或是框架都可以處理DataSnap封裝的資料,這也代表任何支援JSON的用戶端都可以連結到Delphi/BCB XE建立的DataSnap JSON伺服器並且呼叫它提供的服務。 OK,現在我們瞭解了如何使用DataSnap封裝資料為JSON格式,因此我們現在可以很容易的把這個傳統的主從架構應用程式轉換為DataSnap JSON伺服器,如此一來我們就提供了如何把傳統主從架構架逐漸構轉換為分散式JSON架構的可能性。
我們的第一步是把這個主從架構應用程式轉換為DataSnap JSON伺服器,要如此做我們需要讓這個主從架構把資料以JSON的格式輸出,以便用戶端能夠存取,使用。
轉換主從架構應用程式為DataSnap JSON伺服器
為了輸出主從架構應用程式的資料,讓我們首先在這個主從架構專案中建立一個Server Module,如下所示。Server Module能夠自動把包含它的應用程式的資料或是服務輸出給用戶端使用。
由於我們現在需要把主從架構應用程式中的資料輸出以便讓用戶端應用程式能夠存取,因此我們需要把原本主從架構中資料模組中的dbExpress相關元件移動
這個建立的Server Module中,接著在原本主從架構的資料模組中加入TDSServer,TDSTCPServerTransport和TDSServerClass元件,如下所示:
接著在TDSServerClass元件的GetClass事件處理函式中設定它的
PersistentClass參數為Server Module中的TClientDataSet元件類別: procedure TdmFishFact.dsscFishFactGetClass(DSServerClass: TDSServerClass;
var PersistentClass: TPersistentClass); begin
PersistentClass := usmFishFact.TdssmFishFact; end;
完成了這個簡單的工作之後,現在如果我們編譯並且再次執行這個主從架構應用程式,那麼現在它不但仍然可以做為傳統主從架構應用程式來使用,它現在也已經成為了一個DataSnap JSON伺服器,現在我們就可以建立一個DataSnap用戶端來連結它並且取得FishFacts的資料。
建立Delphi DataSnap用戶端
建立一個VCL Form應用程式專案,在主表單中加入如下的元件:
要連結前面的範例DataSnap伺服器,我們只需要加入TSQLConnection元件,並且設定它的特性如下:
特性 Driver Datasnap 特性值 加入一個TDSProviderConnection元件,設定它的特性值如下:
特性 SQLConnection ServerClassName Name 特性值 SQLConnection1 TdssmFishFact DSPCFishFact 加入一個TClientDataSet元件,設定它的特性值如下:
特性 RemoteServer ProviderName DSPCFishFact dspFishFact 特性值 在上面的設定中關鍵的兩個設定是TDSProviderConnection元件的
ServerClassName特性值必須設定為DataSnap伺服器中Server Module的類別名稱,以及TClientDataSet元件的ProviderName必須設定為Server Module中的TDataSetProvider元件。而在這個範例DataSnap伺服器中的Server Module的類別名稱就是TdssmFishFact,而Server Module中的TDataSetProvider元件名稱則是dspFishFact。
下圖就是設定TDSProviderConnection元件畫面:
而下面則是設定TClientDataSet元件的物件檢視器:
設定好了之後只要再連結相關的資料感知元件就可以完成用戶端應用程式了。 現在如果我們執行範例主從架構應用程式兼DataSnap伺服器,再執行DataSnap用戶端應用程式,那麼我們可以看到類似下面的畫面:
上圖中範例主從架構應用程式兼DataSnap伺服器執行時既是傳統的主從架構,也是DataSnap伺服器,因此右下方的DataSnap用戶端應用程式執行之後才能夠從這個主從架構應用程式兼DataSnap伺服器取得FishFacts資料。
如何? 瞭解了dbExpress/DataSnap如何使用JSON封裝資料的原理之後我們就可以容易的把它轉換為DataSnap伺服器。讀者可以使用類似的方式在保留主從架構架構的同時又逐漸的把主從架構轉換為DataSnap的分散式JSON架構。 我們下次再談談Delphi如何支援REST API,如此一來我們就可以讓其他的JSON用戶端連結並且使用Delphi的DataSnap JSON伺服器提供的服務,再見了。