【问题标题】:Can the server create and return GWT objects to the client?服务器可以创建 GWT 对象并将其返回给客户端吗?
【发布时间】:2009-11-28 00:27:04
【问题描述】:

仍在与 GWT 和 App Engine 搏斗,我遇到了这个问题:

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

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

我想知道,是否可以在 servlet 中构造 GWT 对象并将其发送回以供使用?例如,servlet 将接收我的异步请求,从数据库中提取我想要的数据,为数据创建一个带有适当子元素的 GWT VerticalPanel(),然后将该 VerticalPanel 发送回客户端以进行注入。

我对这里发生的 Java / Javascript 交互的理解仍然模糊不清,我认为在应用程序部署后发送未编译为 Javascript 的 Java 对象将不起作用。谁能帮我澄清一下?

【问题讨论】:

    标签: gwt


    【解决方案1】:

    不,服务器不能创建用于表示层的 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>
    

    您可以在这些类中放置的内容有一些限制(例如不支持 BigDecimal 等),但任何可以由 GWT 编译器编译的内容(当然也可以是 JPA 注释)都可以在不需要任何类型的情况下发送的转移对象。这是 GWT 的真正优势之一,您可以在整个应用程序中使用相同的 JPA Pojo,而无需创建任何其他类似的对象。

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

    【讨论】:

    • 感谢您的帮助。我认为这几乎是我想要采取的方法。我预见的问题是如何使用 POJO 传输 App Engine 数据类型。例如,我想将联系人对象存储在数据存储中并将它们作为 POJO 传递回客户端。像 firstName 和 lastName 这样的字段会很简单,因为它们通常只是字符串,但是联系人的照片呢?这可能需要作为 Blob 进入数据库,而我在客户端上没有源代码。
    • 我们对图像采取的一般方法是将它们的文件 URL 存储在后端并将实际图像存储在文件系统中,然后当我们将这些 POJO 发送到客户端时,我们将文件 URL 转换为 http客户端可以显示的 URL。另一种方法是将它们作为 BLOB 保存在数据库中,并提供一个 servlet,将 BLOB 作为图像流回客户端,并将该 BLOB 的 URL 存储到 POJO 中。
    • GWT 序列化的问题与其说是注解,不如说是 JDO 在字节码增强过程中添加的“隐藏”字段。 JDO pojo 不一定“只是”一个 pojo,它也可以有元数据。
    • 字节码增强与 GWT 无关,它从源代码编译,而不是字节码。如果 JDO 依赖于那些隐藏的属性,这可能仍然会导致您在运行时出现问题。听起来 JPA 是更清洁的方式吗?
    • 处理从服务器发送对象(已从数据库检索到)到客户端的一种相当简单的方法是使用 Dozer (dozer.sourceforge.net) 复制对象,基本上删除所有JDO 添加的额外内容。如果您只是复制对象,那真的很简单。它是递归的,可以在服务器端完成。
    【解决方案2】:

    我已经看到了很好的答案,所以我不会自己重复它们..

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

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

    它是pojo-injectorhttp://code.google.com/p/pojo-injector

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

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      这是(恕我直言)GWT 的问题之一。

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

      我可以看到这方面的论据,但是当您在层之间转换对象时,它会添加很多样板。

      无论如何,在 GWT 中,如果您的域对象是 POJO,您需要执行此操作(与 JPA 一样,即使它们声称是 POJO,注释使它们在现实中并非如此)。

      GWT 会在 RPC 接口返回的对象上为您执行此操作,但您不能使用某些类(例如 BigDecimal),因为没有 Javascript 等效项(因此要使用 BigDecimals,您需要传递字符串来自己构建 BigDecimals将它们发送到客户端时将它们转换回字符串)。

      【讨论】:

        猜你喜欢
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        相关资源
        最近更新 更多