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 + ")")); 
}-*/; 

我认为它应该工作

+0

我得到“com.google.gwt.core.client.JavaScriptException:(TypeError):$ wnd.google.visualization未定义”...我有,如果是,我在哪里必须加载库或API?我想在客户端的GWT Widget中使用它... – 2011-03-21 14:46:21

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'/> 

在客户机/ 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发现的示例代码