将数据从Javascript加载到GWT

时间:2009-02-10 01:43:40

标签: gwt

我几天都试图做以下事情但无济于事:

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

相反,我将数据存储在静态.js文件中的JSON中。我在应用程序的加载HTML中包含它:

HTML  ...... GWT加载东西......>

script src =“staticstuff.js”> / script> //这是故意错误所以它会在stackoverflow上显示 HTML 静态的东西看起来像:

var startupdata = [JSON .....];

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

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

当我们的数据是数组,字符串或其他一些JS本机对象时,这非常有效。我似乎无法做到以下几点:

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

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

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

3 个答案:

答案 0 :(得分: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调用以获取更多数据。

答案 1 :(得分:0)

有一篇关于同一主题的好文章: http://www.techhui.com/profiles/blogs/simpler-and-speedier-gwt-with

答案 2 :(得分:0)

如果你想坚持使用JSON(而不是序列化RPC响应),那么你可以使用JavaScriptObject包装器a.k.a.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)可能会特别痛苦。

您可以查看更多here