服务器能否创建GWT对象并将其返回给客户端?

服务器能否创建GWT对象并将其返回给客户端?,gwt,Gwt,仍在与GWT和App Engine搏斗,我遇到了这个问题: 我有一个用各种数据填充的应用程序引擎,我希望使用GWT RPC在客户端上显示这些数据 我发现了一个困难的方法,因为我的模型对象是用JDO注释的,所以我不能仅仅将它们发送回客户机,因为它们是不可序列化的。这意味着我必须创建一层中间类来从模型对象中提取数据,并将其发送回客户端以异步使用 不过我想知道,是否有可能在servlet中构造一个GWT对象并将其发送回使用?例如,servlet将接收我的异步请求,从数据库中取出我想要的数据,为数据创建

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

我有一个用各种数据填充的应用程序引擎,我希望使用GWT RPC在客户端上显示这些数据

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

不过我想知道,是否有可能在servlet中构造一个GWT对象并将其发送回使用?例如,servlet将接收我的异步请求,从数据库中取出我想要的数据,为数据创建一个具有适当子元素的GWT VerticalPanel,并将该VerticalPanel发送回要注入的客户机


我对这里正在进行的Java/Javascript交互的理解仍然模糊不清,我认为在应用程序被解压后发送一个未编译成Javascript的Java对象是行不通的。有人能帮我澄清一下吗?

这是GWT的问题之一

基本上,在JavaWeb应用程序中,数据或域对象是非常常见的,它们将成为JDO对象和表示对象,并发送到视图。有些可以做得更进一步,可以有更多的抽象层,再增加一层

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

无论如何,在GWT中,如果您的域对象是POJO,那么您需要这样做,就像JPA一样,即使它们声称是POJO,但注释使它们实际上并非如此


GWT将为您在RPC接口返回的对象上执行此操作,但有些类您不能使用,例如BigDecimal,因为没有Javascript等价物,所以要使用BigDecimal,您可以在服务器端传递字符串来构造BigDecimal,然后在将其发送到服务器时将其转换回字符串客户端。

这是GWT的问题之一

基本上,在JavaWeb应用程序中,数据或域对象是非常常见的,它们将成为JDO对象和表示对象,并发送到视图。有些可以做得更进一步,可以有更多的抽象层,再增加一层

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

无论如何,在GWT中,如果您的域对象是POJO,那么您需要这样做,就像JPA一样,即使它们声称是POJO,但注释使它们实际上并非如此


GWT将为您在RPC接口返回的对象上执行此操作,但有些类您不能使用,例如BigDecimal,因为没有Javascript等价物,所以要使用BigDecimal,您可以在服务器端传递字符串来构造BigDecimal,然后在将其发送到服务器时将其转换回字符串客户机。

不,服务器不能创建GWT UI对象,例如用于表示层的垂直面板,也不应该,这就是为什么它被称为“服务器”和“表示层”,一个服务于数据并处理所有业务逻辑,另一个在屏幕上显示内容并允许用户与之交互

不过,您可以将带JPA注释的POJO发送到前端,我们在所有应用程序中都可以这样做。您只需要包含注释本身的源代码,以便GWT知道如何编译它们。您还需要确保POJO位于一个名为xmlfile.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的真正优势之一,您可以在整个应用程序中使用相同的JPAPOJO,而无需创建任何其他类似的对象


编辑:我刚注意到你说的是JDO而不是JPA。我认为,如果它们只是注释,也同样适用于此?

不,服务器不能创建GWT UI对象(如垂直面板)以用于表示层,也不应该创建,这就是为什么它被称为“服务器”和“表示层”服务于数据并处理所有业务逻辑,另一个在屏幕上显示东西,并允许用户与之交互

不过,您可以将带JPA注释的POJO发送到前端,我们在所有应用程序中都可以这样做。你这个笨蛋 您需要包含注释本身的源代码,以便GWT知道如何编译它们。您还需要确保POJO位于一个名为xmlfile.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的真正优势之一,您可以在整个应用程序中使用相同的JPAPOJO,而无需创建任何其他类似的对象


编辑:我刚注意到你说的是JDO而不是JPA。我想如果它们只是注释,也同样适用于这里?

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

无论如何,我简单但重要的建议是:唯一的方法是通过POJO对象。。但为了避免出现问题,请记住POJO对象应该非常简单

无论如何,我可以建议你也有一个小框架,我最近做了几个小时的工作,所以不要期待火箭

它是pojo喷油器:

它可以帮助您将数据模型转换为POJO并返回。。。它仅基于POJO端的注释


我希望这能有所帮助。

我已经看到了很好的答案,所以我自己不再重复了

无论如何,我简单但重要的建议是:唯一的方法是通过POJO对象。。但为了避免出现问题,请记住POJO对象应该非常简单

无论如何,我可以建议你也有一个小框架,我最近做了几个小时的工作,所以不要期待火箭

它是pojo喷油器:

它可以帮助您将数据模型转换为POJO并返回。。。它仅基于POJO端的注释


我希望它能有所帮助。

谢谢你的帮助。我想这就是我想采取的方法。我所面临的问题是如何使用POJO传输应用程序引擎数据类型。例如,我想将联系人对象存储在数据存储中,并将它们作为POJO传递回客户机。像firstName和lastName这样的字段很简单,因为它们通常只是字符串,但联系人的照片呢?这可能需要以Blob的形式进入数据库,而我在客户端上没有用于该Blob的源代码。我们处理图像的一般方法是将其文件URL存储在后端,并将实际图像存储在文件系统上,然后,当我们将这些POJO发送到客户端时,我们将文件URL转换为客户端可以显示的http URL。另一种方法是将它们作为BLOB保存在数据库中,并提供一个servlet,将BLOB作为图像流回到客户端,并将该BLOB的servlet URL存储在POJO中。GWT序列化的问题不在于注释,它是JDO在字节码增强过程中添加的隐藏字段。JDO pojo不一定只是pojo,它也可以有元数据。字节码增强与GWT无关,它是从源代码而不是字节码编译的。尽管JDO依赖于这些隐藏属性,但这仍然可能在运行时给您带来问题。听起来JPA是更干净的方法?处理从服务器向客户端发送对象(从数据库中检索到)的一个相当简单的方法是使用Dozer复制对象,基本上删除JDO添加的所有额外内容。如果您只是复制对象,那么它非常简单。它是递归的,可以在服务器端完成。谢谢你的帮助。我想这就是我想采取的方法。我所面临的问题是如何使用POJO传输应用程序引擎数据类型。例如,我想将联系人对象存储在数据存储中,并将它们作为POJO传递回客户机。像firstName和lastName这样的字段很简单,因为它们通常只是字符串,但联系人的照片呢?这可能需要以Blob的形式进入数据库,而我在客户端上没有用于该Blob的源代码。我们处理图像的一般方法是将其文件URL存储在后端,并将实际图像存储在文件系统上,然后,当我们将这些POJO发送到客户端时,我们将文件URL转换为客户端可以显示的http URL。另一种方法是将它们作为BLOB保存在数据库中,并提供一个servlet,将BLOB作为图像流回到客户端,并将该BLOB的servlet URL存储在POJO中。GWT序列化的问题不在于注释,它是JDO在字节码增强过程中添加的隐藏字段。JDOPOJO不一定只是一个pojo,它也可以有元数据。字节码增强与GWT无关,它编译
从源代码中删除,而不是从字节码中删除。尽管JDO依赖于这些隐藏属性,但这仍然可能在运行时给您带来问题。听起来JPA是更干净的方法?处理从服务器向客户端发送对象(从数据库中检索到)的一个相当简单的方法是使用Dozer复制对象,基本上删除JDO添加的所有额外内容。如果您只是复制对象,那么它非常简单。它是递归的,可以在服务器端完成。