GWT可视化API数据表序列化
我想跟随this tutorial关于如何连接到GWT数据库,而不是创建一个登录程序,我试图从我的数据库检索一个GWT Visulation DataTable,然后我可以创建注释时间线。我已经走得很远了,但我碰到了我无法弄清的最后一堵墙。与tut不同,我不是从RPC返回一个简单的User类,而是一个复杂的DataTable。问题是这个DataTable必须可以通过GWT标准进行序列化。有没有简单的方法来完成这个?GWT可视化API数据表序列化
出于安全原因,我使用RPC而不是Query系统。我不希望人们能够查看我的JavaScript并查看我的查询等。
谢谢。
更新:回到问题后,我发现DataTable是一个JavaScriptObject,可能永远不会在服务器端进行。所以,新的问题是,什么是手动使DataTable成为serlizable的最佳方式,然后什么是重新创建客户端的最佳方式。再次感谢!
好的,所以我想出了自己(sorta),所以我想我会在这里发布答案,以防其他人碰巧遇到同样的问题。
简而言之,这是不可能的。 DataTable是JSO对象,在GWT当前版本(1.6something)中,它不能序列化这些类型的对象。我所要做的就是将我的数据分解成一系列ArrayLists,并将它们放在Temray对象中。然后可以将该对象序列化并发送到客户端。这个问题是,你必须在客户端构造DataTable对象。
如果其他人碰巧想出了一个更好的主意,我仍然有兴趣找出答案。
谢谢。
-Eric
我认为你可以做到这一点
在服务器端
String json = JsonRenderer.renderDataTable(yourDataTable, true, true);
,并在客户端 使用一些东西一样
public static native DataTable toDataTable(String json) /*-{
return new $wnd.google.visualization.DataTable(eval("(" + json + ")"));
}-*/;
我认为它应该工作
Google API Libraries for Google Web Toolkit(如gwt-visualization.jar)仅用于客户端(用于生成javascript)。幸运的是,Google还提供服务器端java代码,用于发布其Google Visualization Data Source Library中的DataTables。
以下是允许我在远程过程调用中在服务器上生成DataTable的设置,将它们作为JSON字符串传回给客户端,并使用Google Web Toolkit的Google Visualizations在Google Web Toolkit上显示一个漂亮的Google Plot客户端网页。我使用Eclipse Indigo和Google Web Toolkit 2.4.0。
- 的gwt-visualization.jar GWT API绑定客户端库添加到项目的构建路径,并在自己的模块的描述继承模块:
在SRC/com.package.name /项目的名称。XML:
<inherits name='com.google.gwt.visualization.Visualization'/>
- 添加罐子为Google Visualization Data Source Library和所有包含依赖罐子PROJECT /战争/ WEB-INF/lib目录服务器代码中使用
- 定义远程程序接口,它返回一个字符串:
在客户机/ TableService.java:
package com.clark.demos.client;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("table")
public interface TableService extends RemoteService {
String getTable();
}
在客户机/ TableSe rviceAsync.java:
package com.clark.demos.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface TableServiceAsync {
void getTable(AsyncCallback<String> callback);
}
在战争/ WEB-INF/web.xml文件:
<servlet>
<servlet-name>tableServlet</servlet-name>
<servlet-class>com.clark.demos.server.TableServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>tableServlet</servlet-name>
<url-pattern>/google_visualization___gwt/table</url-pattern>
</servlet-mapping>
- 在服务器上实现了 “表” 的服务:
在服务器/ TableServiceImpl.java:
package com.clark.demos.server;
import com.google.visualization.datasource.datatable.ColumnDescription;
import com.google.visualization.datasource.datatable.DataTable;
import com.google.visualization.datasource.datatable.value.ValueType;
import com.google.visualization.datasource.render.JsonRenderer;
@SuppressWarnings("serial")
public class TableServiceImpl extends RemoteServiceServlet implements
TableService {
@Override
public String getTable() {
DataTable data = new DataTable();
data.addColumn(new ColumnDescription("Task", ValueType.TEXT, "Task"));
data.addColumn(new ColumnDescription("Stemming", ValueType.NUMBER, "Stemming"));
data.addColumn(new ColumnDescription("NoStemming", ValueType.NUMBER, "No Stemming"));
data.addRowFromValues("Fire", 1.0, 0.8);
data.addRowFromValues("Flood", 0.5, 0.65);
return JsonRenderer.renderDataTable(data, true, false, false).toString();
}
}
- 有客户端代码调用 “表” 的服务,并从返回的JSON字符串构建一个DataTable:
在客户机/ gwt-visualization-demo.java:
/**
* Create a remote service proxy to talk to the server-side Table service.
*/
private final TableServiceAsync tableService = GWT
.create(TableService.class);
public static native DataTable toDataTable(String json) /*-{
return new $wnd.google.visualization.DataTable(eval("(" + json + ")"));
}-*/;
public void onModuleLoad() {
// Create a callback to be called when the visualization API
// has been loaded.
Runnable onLoadCallback = new Runnable() {
public void run() {
final Panel panel = RootPanel.get();
tableService.getTable(new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
AbstractDataTable data = toDataTable(result);
BarChart pie = new BarChart(data, createOptions());
pie.addSelectHandler(createSelectHandler(pie));
panel.add(pie);
}
@Override
public void onFailure(Throwable caught) {
}
});
}
};
// Load the visualization api, passing the onLoadCallback to be called
// when loading is done.
VisualizationUtils.loadVisualizationApi(onLoadCallback, BarChart.PACKAGE);
}
在https://github.com/RichDickClark/gwt-google-charts-demo.git发现的示例代码
我得到“com.google.gwt.core.client.JavaScriptException:(TypeError):$ wnd.google.visualization未定义”...我有,如果是,我在哪里必须加载库或API?我想在客户端的GWT Widget中使用它... – 2011-03-21 14:46:21