我几天都试图做以下事情但无济于事:
我有一个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上,而不是每次都在启动时强制回调我们的服务器)
答案 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)
答案 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。