GWT Visualization API DataTable序列化

时间:2009-06-23 14:54:10

标签: java serialization gwt

我正在尝试按照this tutorial关于如何连接到GWT中的数据库,但是我没有创建登录程序,而是尝试从我的数据库中检索GWT Visulation DataTable,以便我可以创建一个带注释的TimeLine。我已经走得很远,但是我打到最后一堵墙,我无法弄明白。与tut不同,我不是从RPC返回一个简单的User类,而是一个复杂的DataTable。问题是这个DataTable必须可以通过GWT标准进行序列化。有没有简单的方法来实现这个目标?

出于安全原因,我使用的是RPC而不是Query系统。我不希望别人能够查看我的javascript并查看我的查询等。

谢谢。

更新:回到问题后,我发现DataTable是一个JavaScriptObject,可能从未打算在服务器端进行。那么新的问题,什么是手动使DataTable成为可上映的东西的最佳方法,然后是重建客户端的最佳方法。再次感谢!

3 个答案:

答案 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。

  • gwt-visualization.jar GWT API绑定客户端库添加到项目的构建路径中,并作为您自己模块描述中的继承模块:

在src / com.package.name / project-name.xml中:

<inherits name='com.google.gwt.visualization.Visualization'/>
  • Google Visualization Data Source Library的jar和所有包含的依赖关系jar添加到PROJECT / war / WEB-INF / lib以供使用的服务器代码
  • 定义一个返回String的远程过程接口:

在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>
  • 在服务器上实现“table”服务:

在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();
        }

}
  • 让客户端代码调用“table”服务并从返回的JSON字符串构造DataTable:

在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

找到的示例代码