我正在尝试按照this tutorial关于如何连接到GWT中的数据库,但是我没有创建登录程序,而是尝试从我的数据库中检索GWT Visulation DataTable,以便我可以创建一个带注释的TimeLine。我已经走得很远,但是我打到最后一堵墙,我无法弄明白。与tut不同,我不是从RPC返回一个简单的User类,而是一个复杂的DataTable。问题是这个DataTable必须可以通过GWT标准进行序列化。有没有简单的方法来实现这个目标?
出于安全原因,我使用的是RPC而不是Query系统。我不希望别人能够查看我的javascript并查看我的查询等。
谢谢。
更新:回到问题后,我发现DataTable是一个JavaScriptObject,可能从未打算在服务器端进行。那么新的问题,什么是手动使DataTable成为可上映的东西的最佳方法,然后是重建客户端的最佳方法。再次感谢!
答案 0 :(得分:4)
好的,所以我自己弄明白了(sorta)所以我想我会在这里发布答案,以防其他人碰巧遇到同样的问题。
简而言之,答案是不可能的。 DataTable是一个JSO对象,在GWT当前版本(1.6something)中,它无法序列化这些类型的对象。我必须做的是将我的数据分解为一系列ArrayLists并将它们保存在一个温度对象中。然后可以将该对象序列化并发送到客户端。这个问题是你必须在客户端构造DataTable对象。
如果其他人碰巧提出了更好的想法,我仍然会对找出感兴趣。
感谢。
-Eric
答案 1 :(得分:1)
我认为你可以做到这一点
在服务器端
String json = JsonRenderer.renderDataTable(yourDataTable, true, true);
并在客户端 使用像
这样的东西public static native DataTable toDataTable(String json) /*-{
return new $wnd.google.visualization.DataTable(eval("(" + json + ")"));
}-*/;
我认为应该有效
答案 2 :(得分:1)
Google API Libraries for Google Web Toolkit(例如gwt-visualization.jar)仅适用于客户端(用于生成javascript)。幸运的是,Google还提供了用于在Google Visualization Data Source Library中发布DataTables的服务器端Java代码。
以下设置允许我在远程过程调用中在服务器上生成DataTables,将它们作为JSON字符串传递回客户端,并使用Google Visualizations for Google Web Toolkit在客户端上显示一个漂亮的Google Plot网页。我正在使用Eclipse Indigo和Google Web Toolkit 2.4.0。
在src / com.package.name / project-name.xml中:
<inherits name='com.google.gwt.visualization.Visualization'/>
在client / 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();
}
在client / TableServiceAsync.java中:
package com.clark.demos.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface TableServiceAsync {
void getTable( AsyncCallback<String> callback );
}
在war / 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>
在server / 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();
}
}
在client / 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
找到的示例代码