2009-06-23 13 views
5

Estoy tratando de seguir this tutorial sobre cómo conectarse a una base de datos en GWT, pero en lugar de crear un programa de inicio de sesión, que estoy tratando de recuperar una GWT Visulation DataTable de mi base de datos de manera que puedo entonces crear una línea de tiempo anotada. He llegado muy lejos, pero llegué al último muro que no puedo entender. A diferencia de tut, no devuelvo una clase de Usuario simple de RPC, sino una DataTable compleja. El problema es que esta DataTable debe ser serializable según los estándares de GWT. ¿Hay alguna manera fácil de lograr esto?GWT API de visualización DataTable serialización

Estoy utilizando un RPC, en lugar de un sistema de consulta por razones de seguridad. No quiero que la gente pueda ver mi javascript y ver mis consultas y tal.

Gracias.

ACTUALIZACIÓN: Después de volver al problema, he encontrado que DataTable es un JavaScriptObject y probablemente nunca fue creado en el lado del servidor. Entonces, nueva pregunta, ¿cuál es la mejor manera de convertir manualmente DataTable en algo serizable y luego cuál es la mejor manera de rehacerlo en el lado del cliente? ¡Gracias de nuevo!

Respuesta

4

Ok, así que me di cuenta (sorta) así que pensé que iba a publicar la respuesta aquí en caso de que alguien más tenga el mismo problema más adelante.

La respuesta, en definitiva, es imposible. DataTable es un objeto JSO, y en la versión actual de GWT (1.6 y algo) no puede serializar esos tipos de objetos. Lo que tenía que hacer era descomponer mis datos en una serie de ArrayLists y mantenerlos en un objeto temperay. Ese objeto puede ser serializado y enviado al lado del cliente. El problema con esto es que debe construir el objeto DataTable en el lado del cliente.

Si a alguien más se le ocurre una idea mejor, aún me interesaría saberlo.

Gracias.

-Eric

1

creo que puede hacerlo

en el lado del servidor

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

y en el lado del cliente usar algo como

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

creo que debería trabajo

+0

Obtengo "com.google.gwt.core.client.JavaScriptException: (TypeError): $ wnd.google.visualization no está definido" ... tengo y si es así, ¿dónde lo hago? tener que cargar bibliotecas o API? Me gustaría utilizar esto en Widget GWT en el lado del cliente ... –

1

El Google API Libraries for Google Web Toolkit (como gwt-visualization.jar) solo está pensado para el uso en el lado del cliente (para generar javascript). Afortunadamente, Google también proporciona el código java del lado del servidor para publicar DataTables en su Google Visualization Data Source Library.

Aquí está la configuración que me permitió generar DataTables en el servidor en una llamada a procedimiento remoto, devolverlos al cliente como una cadena JSON, y usar Google Visualizations para Google Web Toolkit para mostrar un buen gráfico de Google en el página web del cliente. Estoy usando Eclipse Indigo con Google Web Toolkit 2.4.0.

  • añadir la biblioteca cliente de enlace API gwt-visualization.jar GWT a la ruta de compilación de su proyecto, y como un módulo heredado en la descripción de su propio módulo:

En src/com.package.name/nombre-proyecto.xml:

<inherits name='com.google.gwt.visualization.Visualization'/> 
  • Añadir el tarro para el Google Visualization Data Source Library y todos los frascos de dependencia incluidas para proyectar/war/WEB-INF/lib para el código de servidor para utilizar
  • Definir una interfaz de procedimiento remoto que devuelve una cuerda:

En cliente/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 cliente/TableSe rviceAsync.java:

package com.clark.demos.client; 

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

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

En 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> 
  • implementar el servicio de "mesa" en el servidor:

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

} 
  • tiene código de cliente llamar al servicio de "mesa" y construir un DataTable de la cadena JSON devuelto:

En cliente/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); 

}

Código de ejemplo encontrado en https://github.com/RichDickClark/gwt-google-charts-demo.git

Cuestiones relacionadas