2009-06-23 15 views
5

私はGWTのデータベースに接続する方法についてはthis tutorialに従っていますが、ログインプログラムを作成する代わりに、DBからGWT Visulation DataTableを取得しようとしています注釈付きタイムライン。私は非常に遠くになってしまったが、私は理解できない最後の壁に当たった。ツイートとは異なり、私はRPCから単純なUserクラスを返すのではなく、複雑なDataTableを返します。問題は、このDataTableがGWT標準によって直列化可能でなければならないことです。これを達成するための簡単な方法はありますか?GWT可視化API DataTableのシリアル化

セキュリティ上の理由から、クエリシステムではなくRPCを使用しています。私は人々が私のjavascriptを見て、私の質問などを見ることができるようにしたくありません。

ありがとうございます。

更新:問題に戻ると、私はDataTableがJavaScriptObjectであり、サーバー側で作成されたことがないことがわかりました。ですから、新しい質問は、手動でDataTableを何かにして、それをクライアント側にリメイクする最良の方法は何ですか。再度、感謝します!

答えて

4

私はそれを自分で分かったので、他の誰かが後で同じ問題を抱えるような場合に備えて答えを投稿すると思いました。

簡単には答えが不可能です。 DataTableはJSOオブジェクトであり、GWTの現在のリリース(1.6something)では、それらのオブジェクトの型をシリアル化することはできません。私がしなければならなかったことは、私のデータを一連のArrayListsに分解し、それらをtemperyオブジェクトに保持することでした。その後、そのオブジェクトをシリアル化してクライアント側に送信することができます。この問題は、クライアント側でDataTableオブジェクトを作成する必要があることです。

他の誰かが良いアイデアを思いついた場合、私はまだ見つけ出すことに興味があります。

ありがとうございました。

-Eric

1

私は、サーバー側

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 is undefined」と表示されます。ライブラリやAPIをロードする必要がありますか?私はクライアント側のGWTウィジェットでこれを使用したいと思います... –

1

Google API Libraries for Google Web Toolkit(gwt-visualization.jarなど)は、クライアント側でのみ使用するためのものです(javascriptの生成用)。幸いにも、Googleは、Google Visualization Data Source LibraryにDataTableを公開するためのサーバーサイドJavaコードも提供しています。

リモートプロシージャコールでサーバー上にDataTableを生成し、JSON文字列としてクライアントに渡し、Google Web ToolkitのGoogleビジュアライゼーションを使用して、クライアントのWebページ。 Google Web Toolkit 2.4.0でEclipse Indigoを使用しています。

  • プロジェクトのビルド・パスに、そして自分自身のモジュールの説明に継承されたモジュールとしてクライアントライブラリを結合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にに含まれるすべての依存関係のjarファイルのためのjarファイルを追加します。文字列:クライアント/ TableService.javaで

:クライアント/ TableSeで

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

rviceAsync.java:戦争/ WEB-INF/web.xmlに

package com.clark.demos.client; 

import com.google.gwt.user.client.rpc.AsyncCallback; 

public interface TableServiceAsync { 
    void getTable(AsyncCallback<String> callback); 
} 

<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

関連する問題