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