【问题标题】:GWT Visualisation API DataTable SerializationGWT 可视化 API 数据表序列化
【发布时间】:2010-11-05 04:58:41
【问题描述】:

我正在尝试关注this tutorial 如何连接到 GWT 中的数据库,但我没有创建登录程序,而是尝试从我的数据库中检索 GWT 可视化数据表,以便随后创建带注释的时间线.我已经走了很远,但我撞到了我无法弄清楚的最后一堵墙。与 tut 不同,我不是从 RPC 返回一个简单的 User 类,而是一个复杂的 DataTable。问题是这个 DataTable 必须可以通过 GWT 标准进行序列化。有什么简单的方法可以做到这一点吗?

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

谢谢。

更新:回到问题后,我发现 DataTable 是一个 JavaScriptObject,可能从来没有打算在服务器端制作。所以新问题,手动将 DataTable 变成可序列化的东西的最佳方法是什么,然后在客户端重新制作它的最佳方法是什么。再次感谢!

【问题讨论】:

    标签: java serialization gwt


    【解决方案1】:

    好的,所以我自己想通了(有点)所以我想我会在这里发布答案,以防其他人以后碰巧遇到同样的问题。

    简而言之,这是不可能的答案。 DataTable 是一个 JSO 对象,在 GWT 当前版本(1.6something)中它不能序列化那些类型的对象。我所要做的就是将我的数据分解为一系列 ArrayList 并将它们保存在 tempray 对象中。然后可以将该对象序列化并发送到客户端。这样做的问题是您必须在客户端构建 DataTable 对象。

    如果其他人碰巧想出了更好的主意,我仍然有兴趣找出答案。

    谢谢。

    -埃里克

    【讨论】:

      【解决方案2】:

      我觉得你可以的

      在服务器端

      String json = JsonRenderer.renderDataTable(yourDataTable, true, true);
      

      在客户端 使用类似

      的东西
      public static native DataTable toDataTable(String json) /*-{
        return new $wnd.google.visualization.DataTable(eval("(" + json + ")"));
      }-*/;
      

      我觉得应该可以

      【讨论】:

      • 我得到“com.google.gwt.core.client.JavaScriptException: (TypeError): $wnd.google.visualization is undefined”...我有吗,如果有,我在哪里加载库或 API?我想在客户端的 GWT Widget 中使用它...
      【解决方案3】:

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

      在客户端/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(); 
      }
      

      在客户端/TableServiceAsync.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>
      
      • 在服务器上实现“table”服务:

      在服务器/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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        相关资源
        最近更新 更多