2009-11-28 62 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和背部...它是基于注释。

我希望它能提供帮助。

相关问题