Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据从Javascript加载到GWT_Gwt - Fatal编程技术网

将数据从Javascript加载到GWT

将数据从Javascript加载到GWT,gwt,Gwt,几天来,我一直在尝试执行以下操作,但没有成功: 我有一个GWT应用程序,它在启动时进行几个RPC调用以加载初始数据。在大多数情况下,这些数据是相对静态的,因此如果可以的话,我会跳过RPC调用。但是数据的变化比应用程序更频繁,所以我不希望在编译时包含它 相反,我获取数据并将其存储在一个静态.js文件中的JSON中。我在应用程序的加载HTML中包括: html ... GWT正在加载内容…> script src=“statistuff.js”>/script>//这是故意错误的,因此它将显示在st

几天来,我一直在尝试执行以下操作,但没有成功:

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

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

html ... GWT正在加载内容…>

script src=“statistuff.js”>/script>//这是故意错误的,因此它将显示在stackoverflow上 html 静态的东西看起来像:

var startupdata=[JSON….]

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

private native JsArrayString getStaticData()/*-{
    return $wnd.startupdata;
}-*/;
private native OurMoreComplexObject getStaticData()/*-{
    return $wnd.startupdata;
}-*/;
当我们的数据是数组、字符串或其他一些JS本机对象时,这种方法非常有效。我似乎无法做到以下几点:

private native JsArrayString getStaticData()/*-{
    return $wnd.startupdata;
}-*/;
private native OurMoreComplexObject getStaticData()/*-{
    return $wnd.startupdata;
}-*/;
我可以收回js对象并将它们解析到我的对象图中,但我不希望这样,特别是因为GWT已经为我创建了一个转换器(因为我们的MoreComplexObject已经在RPC调用中返回)

以前有人尝试过类似的事情吗?如果是,我如何让它工作?还有别的办法吗?(主要目标是,如果数据存储在文件中,我可以将其加载到我们的CDN中,而不是每次启动时都强制回叫服务器)

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

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


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

如果您想坚持使用JSON(而不是序列化RPC响应),那么您可以使用JavaScriptObject包装器a.k.a.JSO。这是一种从JSON获得复杂对象图的好方法,因为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)可能是一件特别痛苦的事情


您可以查看更多信息。

要回答OP的问题,您可以拦截RPC调用,并静态缓存对文件的响应,在下一次调用时,您可以返回缓存的内容,而不是让RPC调用通过。请注意尝试实现此功能的人员。如果您一直使用GWT1.4(就像我一样),那么就无法在客户端()上获得GWT的RPC内部构件。您必须使用json手动完成这项工作为什么在可以使用Dictionary类的情况下还要进行所有这些强防护?要创建动态GWT主机页,只需使用JSP作为GWT主机页,并将所有javascript对象写入其中。然后在加载模块时,使用Dictionary类读取这些javascript对象。