2009-11-28 38 views
1

與GWT和App Engine的還有摔跤,我得出這樣的問題:服務器可以創建GWT對象並將其返回給客戶端嗎?

我有填充了各種數據,我想提出使用GWT RPC客戶端上的應用程序引擎。

我已經找到了困難的方式,因爲我的模型對象使用JDO進行了註釋,我不能將它們發送回客戶端,因爲它們不是可序列化的。這意味着我將不得不創建一箇中間類層來從我的模型對象中提取數據,並將其發送回客戶端以異步使用。

我在想,雖然可以在一個servlet中構造一個GWT對象並將它發回來使用?例如,servlet將接收到我的異步請求,從數據庫中提取我想要的數據,使用適當的數據子元素創建GWT VerticalPanel(),並將該VerticalPanel發送回客戶端以進行注入。

我對這裏進行的Java/Javascript交互的理解仍然模糊,我認爲在應用程序被deplyed後發送未編譯爲Javascript的Java對象將無法工作。有人能爲我澄清這一點嗎?

回答

6

沒有服務器不能創建用於表示層的GWT UI對象(如垂直面板),也不應該這樣,這就是爲什麼它被稱爲「服務器」和「表示層」,爲服務數據提供服務處理所有業務邏輯,另一個顯示屏幕上的東西,並允許用戶與他們進行交互。

然而,您可以將您的JPA帶註釋的POJO發送到前端(我們在所有應用程序中都這樣做)。你只需要包含註釋本身的源代碼,以便GWT知道如何編譯它們。你還需要確保你的POJO的是由一個NameOfXmlFile.gwt.xml文件引用的包,如:

<module> 
    <inherits name='com.google.gwt.user.User'/> 
    <source path="domain" /> 
</module> 

此文件在我的情況是包上面一個文件夾,名爲「域」在哪裏我所有的JPA註釋了POJO的直播。然後在你的客戶端,你告訴它繼承.gwt。xml文件:

<module> 
     <inherits name='com.google.gwt.user.User'/> 
     <!-- Domain layer references --> 
     <inherits name='your.package.structure.NameOfXmlFile'/> 
</module> 

有跡象表明,可以通過GWT編譯器編譯你可以放什麼在這些類的限制(例如像不支持的BigDecimal等),但任何事情(和JPA註解當然也可以)可以發送而不需要任何類型的傳輸對象。這是GWT的真正優勢之一,您可以在整個應用程序中使用相同的JPA Pojos,而無需創建任何其他類似的對象。

編輯:我只是注意到你說JDO,而不是JPA。我認爲這同樣適用於那裏,但如果他們只是註釋?

+0

感謝您的幫助。我認爲這幾乎是我想要採取的方法。我所預見的問題是如何使用POJO來傳輸App Engine數據類型。例如,我想將聯繫人對象存儲在數據存儲中,並將其作爲POJO傳回客戶端。像firstName和lastName這樣的字段會很簡單,因爲這些字段通常只是字符串,但是聯繫人的照片呢?這可能需要進入數據庫作爲Blob,我不會在客戶端上的源代碼。 – 2009-11-28 04:49:09

+0

我們對圖像採取的一般方法是將文件URL存儲在後端,並將實際圖像存儲在文件系統中,然後當我們將這些POJO發送到客戶端時,我們將文件URL轉換爲客戶端可以顯示的http URL。 另一種方法是將它們作爲BLOB保存在數據庫中,並提供一個將BLOB作爲圖像傳輸回客戶端的servlet,並將URL存儲到POJO中該BLOB的servlet。 – rustyshelf 2009-11-28 23:23:09

+0

與GWT序列化相關的註釋並不多,它是在字節碼增強過程中JDO添加的「隱藏」字段。一個JDO pojo不一定只是一個pojo,它也可以有元數據。 – 2009-12-04 21:31:13

0

這是(imho)GWT的問題之一。

基本上在Java Web應用程序中,數據或域對象(這將是您的JDO對象)和呈現對象(它們被髮送到視圖)是非常常見的。有些比這更進一步,可以有更多的抽象層(「繼續,增加一層」)。

我可以看到這個參數,但它會在層之間轉換對象時添加大量樣板。

不管怎樣,在GWT你需要要做到這一點,如果你的域對象是POJO(和JPA的,儘管他們聲稱是POJO的註解讓他們不那麼現實)。

GWT將爲您在RPC接口返回的對象上執行此操作,但由於沒有Javascript等效項,所以存在某些不能使用的類(例如BigDecimal)(因此要使用BigDecimals來傳遞字符串來自己構造BigDecimals在您將它們關閉時在服務器端,並在將它們發送給客戶端時將它們轉換回字符串)。

2

我已經看到很好的答案,所以我就不再贅述了自己..

反正我簡單但重要的建議是:去的唯一途徑就是通過POJO對象。但恕我直言,以避免出現問題,記住,你的POJO對象應該是真的平原

反正,我可以建議你也有點框架我最近做(工作幾個小時,所以不要指望火箭!)。

這是POJO注射器:(!僅在POJO側)http://code.google.com/p/pojo-injector

它可以幫助你在你的翻譯數據模型POJO和背部...它是基於註釋。

我希望它能提供幫助。

相關問題