2009-06-23 8 views
5

J'essaie de suivre la procédure de connexion à une base de données dans GWT, mais au une ligne temporelle annotée. Je suis allé très loin, mais j'ai frappé le dernier mur que je n'arrive pas à comprendre. Contrairement au tut, je ne retourne pas une simple classe User du RPC, mais un DataTable complexe. Le problème est que ce DataTable doit être sérialisable par les normes GWT. Y a-t-il un moyen facile d'accomplir cela? J'utilise un RPC au lieu d'un système Query pour des raisons de sécurité. Je ne veux pas que les gens puissent regarder mon javascript et voir mes requêtes et autres.GWT Visualization API DataTable Sérialisation

Merci. MISE À JOUR: Après être retourné au problème, j'ai trouvé que DataTable est un JavaScriptObject et n'a probablement jamais été fait pour être fait sur le côté serveur. Donc, nouvelle question, Quelle est la meilleure façon de faire manuellement DataTable en quelque chose de sériable, puis quelle est la meilleure façon de le refaire côté client. Merci encore!

Répondre

4

Ok, donc je me suis dit (sorta) alors j'ai pensé que je posterais la réponse ici au cas où quelqu'un d'autre arriverait à avoir le même problème plus tard.

La réponse en un mot est impossible. DataTable est un objet JSO, et dans la version actuelle de GWT (1.6quechose) il ne peut pas sérialiser ces types d'objets. Ce que je devais faire était de décomposer mes données en une série de ArrayLists et de les conserver dans un Object de tempérament. Cet objet peut ensuite être sérialisé et envoyé au client. Le problème avec ceci est que vous devez ensuite construire l'objet DataTable sur le côté client.

Si quelqu'un d'autre arrive à trouver une meilleure idée, je serais toujours intéressé à découvrir.

Merci.

-Eric

1

Je pense que vous pouvez le faire

côté serveur

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

et côté client utiliser quelque chose comme

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

Je pense qu'il devrait travail

+0

Je reçois "com.google.gwt.core.client.JavaScriptException: (TypeError): $ wnd.google.visualization est indéfini" ... ai-je et si oui, où puis-je avoir à charger des bibliothèques ou des API? Je voudrais l'utiliser dans Widget GWT du côté client ... –

1

Les Google API Libraries for Google Web Toolkit (tels que gwt-visualization.jar) sont uniquement destinés à être utilisés côté client (pour générer du javascript). Heureusement, Google fournit également le code Java côté serveur pour la publication de DataTables dans leur Google Visualization Data Source Library.

Voici la configuration qui m'a permis de générer des DataTables sur le serveur dans un appel de procédure distante, de les renvoyer au client en tant que chaîne JSON et d'utiliser Google Visualizations pour Google Web Toolkit page Web client. J'utilise Eclipse Indigo avec Google Web Toolkit 2.4.0.

  • Ajouter la bibliothèque cliente de liaison API GWT gwt-visualization.jar au chemin de la construction de votre projet, et en tant que module hérité dans votre propre description du module:

dans src/com.package.name/nom-projet.xml:

<inherits name='com.google.gwt.visualization.Visualization'/> 
  • Ajouter le pot pour le Google Visualization Data Source Library et tous les pots de dépendance inclus à PROJET/war/WEB-INF/lib pour le code serveur à utiliser
  • Définir une interface de procédure distante qui renvoie un chaîne:

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

En client/TableSe rviceAsync.java:

package com.clark.demos.client; 

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

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

Dans la guerre/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> 
  • Mettre en oeuvre le service "table" sur le serveur:

Dans le serveur/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(); 
     } 

} 
  • Demandez appel code client le service "table" et construire un DataTable de la chaîne JSON retournée:

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

}

Exemple de code trouvé à https://github.com/RichDickClark/gwt-google-charts-demo.git