2011-03-18 75 views
9

有沒有什麼辦法可以在客戶端和服務器上以不同的方式實現相同的類?同一類的GWT客戶端和服務器實現

爲了避免「你爲什麼想這麼做?」問題..我會詳述

我正在轉換一個非常大的Java客戶端/服務器應用程序。目前它使用Swing GUI客戶端,並通過Spring遠程處理(RPC)與服務器通信。使用GWT RPC和Spring服務不是問題,有幾個很好的例子可用,並且所有這些似乎都很好。

對客戶端和服務器都通用的幾個類包含來回傳遞的數據。這些類還包含一些通過使用標準JRE類實現的行爲。例如,一個類包含,分析和格式化日期和時間,包括時區,DST等,以特定的語言環境。我可以重寫/重構它,但是應用程序超過1000萬SLOC,導致數百萬個單獨的這個類的引用,所以重大的重寫不具有成本效益。

爲了以此爲例,GWT爲解析和格式化日期提供了出色的i18n支持。但是實現與JRE的方式不同。

所以我正在尋找一種切肉刀的方式,我可以注入一個實現到我的DateTime類的外殼,取決於它是在客戶端(使用GWT和本地JS)還是在服務器(使用JRE)。有沒有一種狡猾的方式來做到這一點?也許使用模塊文件XXXXX.gwt.xml。我在尋找一個通用的解決方案。

回答

0

我想你在找什麼,是這樣的:<source path="client" />在你的項目gwt.xml文件中。它告訴GWT生成器在哪裏尋找客戶端代碼來轉換爲JS。在項目中,我有它設置了這種方式:

<source path="client" /> 
<source path="shared" /> 

基本上客戶端代碼在客戶端目錄,並共享我們不斷豆類和客戶端和服務器端的一些數據包裝。

你可以做的是用上面的源路徑添加你想要轉換到客戶端的包。但是您必須記住,您要轉換的類只能由GWT生成器可以轉換爲客戶端Java腳本的對象和屬性組成。我不知道如果也更準確的路徑可以放在源路徑,如:

<source path="shared/beans/whatever" /> 

另一個缺點是,如果你使用GWT國際化支持,它通過自身在編譯時間處理不同的語言環境 - 這很好。如果您決定使用自己的機制,那麼您的類必須包含一些邏輯以瞭解當前正在使用的語言環境,它們必須與GWT兼容。

+1

這不是問什麼。他有多個在客戶端和服務器上使用的類(是的,通常是共享的),但這些類包含非GWT JRE代碼,因此它們只能在服務器上運行。 – John 2011-03-18 11:24:43

+1

製作相同的課程但實施方式不同會使我的眼睛受傷。對我來說,這將制約設計合同,程序員必須知道下面的實現是什麼。沒有一種方法可以在接口之後使用兩個不同的類來實現接口實現嗎?這就是你的問題將得到解決的方式(如果你問我)。 – Sven 2011-03-18 16:15:29

+0

@John - 我提到它不適用於包含非GWT代碼的類。也許我對此不是很清楚。 – jjczopek 2011-03-22 23:26:25

5

您希望使用<super-source>代替覆蓋一個包實現與另一個。 這是GWT用於模擬Java運行時類的內容,(等等)爲com.google.gwt.regexp.shared.*類的客戶端和服務器提供了不同的實現。

+0

超級源代碼是否真的*覆蓋*其他實現或只是添加?我在文檔中找到了無處不在的地方(但會很棒)。 – xamde 2011-10-30 18:54:46

+1

在逐個文件的基礎上,它會覆蓋。就好像它在類路徑中早些出現過的一樣(實際上它是如何實現的(參見http://code.google.com/p/google-web-toolkit/wiki/ResourceOracle) – 2011-10-31 15:44:21

相關問題