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”出现在控制台上