服务器可以创建GWT对象并将其返回给客户端吗?

时间:2009-11-28 00:27:05

标签: gwt

仍在使用GWT和App Engine,我遇到了这个问题:

我有一个填充了各种数据的应用引擎,我希望使用GWT RPC在客户端上呈现这些数据。

我发现了很难的方法,因为我的Model对象是用JDO注释的,所以我不能将它们发送回客户端,因为它们不可序列化。这意味着我将不得不创建一个中间类层来从我的模型对象中提取数据,并将其发送回客户端以异步使用。

我想知道,有可能在servlet中构造一个GWT对象并将其发送回来使用吗?例如,该servlet会收到我的异步请求,拔出我从数据库中想要的数据,与数据相应的子元素创建一个GWT VerticalPanel(),并发送VerticalPanel回客户端将被注入。

我对这里正在进行的Java / Javascript交互的理解仍然模糊不清,我认为在应用程序被删除后发送未编译为Javascript的Java对象将无法正常工作。有人可以为我澄清这个吗?

3 个答案:

答案 0 :(得分:6)

没有服务器无法创建要在表示层中使用的GWT UI对象(如垂直面板),也不应该,这就是为什么它被称为“服务器”和“表示层”为数据和处理服务的原因所有业务逻辑,另一个在屏幕上显示事物,并允许用户与他们进行交互。

然而,您可以将JPA带注释的POJO发送到前端(我们在所有应用程序中都这样做)。您只需要包含注释本身的源代码,以便GWT知道如何编译它们。您还需要确保您的POJO位于NameOfXmlFile.gwt.xml文件引用的包中,例如:

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

在我的情况下,这个文件位于名为“domain”的软件包上方的文件夹中,其中所有JPA注释的POJO都是实时的。然后在您的客户端,您告诉它继承.gwt.xml文件:

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

你可以在这些类中加入什么限制(例如不支持BigDecimal等)但是可以通过GWT编译器编译的任何东西(以及JPA注释当然可以)都可以在不需要任何类型的情况下发送转移对象。这是GWT的真正优势之一,您可以在整个应用程序中使用相同的JPA Pojos,而无需创建任何其他类似对象。

编辑:我刚刚注意到您说 JDO 而不是 JPA 。我认为同样适用于那里,但如果它们只是注释?

答案 1 :(得分:2)

我看到了很好的答案,所以我不会自己重复这些答案。

无论如何,我的简单而重要的建议是:唯一的方法是通过POJO对象..但是恕我直言以避免问题,请记住你的POJO对象应该真的是 PLAIN

无论如何,我可以建议你最近做一个小框架(几个小时的工作,所以不要指望火箭!)。

pojo-injector http://code.google.com/p/pojo-injector

它可以帮助您将数据模型转换为POJO并返回...它基于注释(仅在POJO方面!)。

我希望它可以提供帮助。

答案 2 :(得分:0)

这是(imho)GWT的一个问题。

基本上在Java Web应用程序中,将数据或域对象(可能是您的JDO对象)和表示对象发送到视图是很常见的。有些远比这更进一步,可以有更多的抽象层(“继续,再增加一层”)。

我可以看到这个论点,但是当你在层之间翻译对象时,它会增加很多样板。

无论如何,在GWT中,如果您的域对象是POJO,那么需要来执行此操作(和JPA一样,即使他们声称是POJO,注释也不会实际上这样做。)< / p>

GWT会在你的RPC接口返回的对象上为你做这个,但有些类你不能使用(例如BigDecimal),因为没有Javascript等价物(所以要使用BigDecimals你传递Strings来自己构建BigDecimals当你发送它们并将它们发送回客户端时将它们转换回字符串的服务器端。)