2

几天来我一直在尝试执行以下操作,但无济于事:

我有一个 GWT 应用程序,它在启动时进行多次 RPC 调用以加载初始数据。在大多数情况下,这些数据是相对静态的,所以如果可以的话,我会跳过 RPC 调用。但是数据的变化比应用程序更频繁,所以我宁愿在编译时不包括它。

相反,我获取数据并将其以 JSON 格式存储在一个静态 .js 文件中。我将其包含在应用程序的加载 HTML 中:

html ... GWT 正在加载东西...>

script src="staticstuff.js">/script> //这是故意错误的,因此它将显示在stackoverflow html上,静态内容如下:

var 启动数据 = [JSON.....];

然后,在应用程序本身中,我们执行以下操作:

private native JsArrayString getStaticData()/*-{
    return $wnd.startupdata;
}-*/;

当我们的数据是数组、字符串或其他一些 JS 原生对象时,这非常有效。我似乎不能做的是以下几点:

private native OurMoreComplexObject getStaticData()/*-{
    return $wnd.startupdata;
}-*/;

我可以拉回 js 对象并自己将它们解析到我的对象图中,但我不希望这样做,特别是因为 GWT 已经为我创建了一个转换器(因为 OurMoreComplexObject)已经在 RPC 调用中返回。

有没有人尝试过这样的事情?如果是这样,我该如何让它工作?还有其他方法可以做到这一点吗?(主要目标是如果数据存储在文件中,我可以将其加载到我们的 CDN 上,而不是每次启动时都强制回调到我们的服务器)

4

2 回答 2

2

是的(这是我经常做的事情):

http://wiki.shiftyjelly.com/index.php/GWT#Speed_up_Page_Loading.2C_by_pre-serializing_your_GWT_calls

它的基本原理是您在服务器呈现页面时进行调用,并让 GWT 将其序列化为正常的 RPC 形式,并将其存储在页面中的 javascript 变量中。从那里您可以阅读它。希望上面的链接应该为您提供足够的详细信息。

主要好处是您的客户端以 HTML/js 格式获取页面,并且不需要进行 AJAX 调用来获取更多数据。

于 2009-02-10T06:43:36.303 回答
0

如果您想坚持使用 JSON(而不是序列化 RPC 响应),则可以使用 JavaScriptObject 包装器,即 JSO。这是从 JSON 获取复杂对象图的好方法,无需编写一堆编组代码。它遵循以下模式:

startupData = { "someProperty" : "someValue", "someList" : [ { "more", "json" } ] };


public class OurMoreComplexObject extends JavaScriptObject {
    protected OurMoreComplexObject() {}

    public native String getSomeProperty() /*-{
        return this.someProperty;
    }-*/;

    public native JSArray getSomeList()  /*-{
        return this.someList;
    }-*/;
}

好消息是它具有半神奇的特性,因为您的“getStaticData”方法可以正常工作。坏消息是您不能像对待 POJO 那样轻松对待这些 JSO。处理列表迭代(通过 JSArray)可能会特别痛苦。

你可以在这里查看更多。

于 2009-05-13T01:12:16.143 回答