GWT RPC基础控制流讲解

Posted

技术标签:

【中文标题】GWT RPC基础控制流讲解【英文标题】:GWT RPC basics control flow explanation 【发布时间】:2012-01-23 06:34:29 【问题描述】:

我是 GWT 新手,能够使用 GWT RPC,但在理解控制流如何在内部发生时遇到问题。它是如何翻译成 AJAX 的?

我们可以使用new() 代替GWT.create(someService.class) 进行RPC 调用吗? 为什么 Google 不只使用 Async 版本而不是创建 2 个接口?

当我们使用时内部会发生什么

TaskService Async = GWT.create(TaskService.class);

我读过它选择浏览器特定的hashname.js 文件,但我不了解完整的控制流程。还有回调对象是如何使用的。

有人可以通过指出要点来解释控制流吗?

更新:@Thomas Broyer,我明白的一切......只是确认万一 GWT.create() 在客户端有一个 .rpc 文件有助于延迟(后期/运行时)绑定。对吗?

【问题讨论】:

【参考方案1】:

    GWT.create() 在这种情况下将调用 GWT 生成器;它将生成一个实现 Async 接口的类(这就是为什么您只需要声明一个接口而您从不自己实现它的原因)。 见RPC Plumbing Diagram。 使用生成器(或选择特定实现,但在 GWT-RPC 的情况下,使用生成器)称为deferred binding。

    所以,不,你不能使用new

    至于为什么有2个接口,这是为了让GWT可以检查你的服务器端代码(同步)和你的客户端代码(异步)是否一致。您在 同步 接口上调用 GWT.create 并返回异步实现的原因是遗留问题。我敢打赌他们不会那样做,如果他们从头开始重新实现 GWT-RPC。

    生成的类将负责序列化调用(方法名和参数)并发出 AJAX 请求(使用RequestBuilder);然后反序列化响应(声明的类型或异常)

    因为调用是异步的,所以回调用于在服务器响应时回调你的代码,在反序列化发生后(所以要么使用解码的对象调用onSuccess,要么使用解码的对象调用onFailure解码异常)。 见Getting Used to Asynchronous Calls

【讨论】:

感谢您的明确答复。你能确认更新吗?最好的问候。 延迟绑定中的“延迟”表示“在编译时,而不是在编写代码时”,而不是“在运行时”。 *.gwt.rpc 文件仅用于服务器端(AFAIK),因为它与服务器代码(其本身独立于 GWT 编译)通信客户端是如何重新编译的。通过 GWT-RPC 的类。 因此,客户端中的任何类都将出现在生成的所有 .cache.html 文件中(因此它们都有助于延迟绑定)。那么为什么生成的内部类(实现 Async 接口)如此具体地链接到延迟绑定? 在您的代码中,您GWT.create() 某个接口,您不会针对其实际实现进行编码;但是在编译时,GWT.create() 以某种方式resolved(在这种情况下,调用生成器)并绑定到一个具体的实现:这是延迟绑定;您的代码没有绑定到特定的实现,实现的选择是延迟直到编译时(由GWT编译器,而不是Java编译器)。 *.gwt.rpc 文件会告诉服务器请求中的xxx/12345 实际上是java.util.ArrayList(它有点复杂,但基本上是这样工作的) 好的。所以术语“延迟绑定”是一个普通概念的大术语。 *.gwt.rpc 现在我明白为什么现在使用它了。非常感谢您的耐心。现在我将尝试在 GWT 中挖掘更多的概念。 :)

以上是关于GWT RPC基础控制流讲解的主要内容,如果未能解决你的问题,请参考以下文章

“com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException”出现在控制台上

GWT Framework 启用控制台日志

Python-11:Python语法基础-控制流

Kotlin语法基础,控制流

Kotlin语法基础,控制流

(翻译)《二》语言基础--控制流语句