GWT Visualization API Сериализация DataTable - PullRequest
5 голосов
/ 23 июня 2009

Я пытаюсь следовать этому руководству о том, как подключиться к базе данных в GWT, но вместо создания программы входа в систему я пытаюсь получить таблицу данных Visation GWT из моей БД, чтобы я мог затем создайте аннотированную временную шкалу. Я продвинулся очень далеко, но я ударил последнюю стену, которую я не могу понять. В отличие от этого, я не возвращаю простой класс User из RPC, но сложный DataTable. Проблема в том, что этот DataTable должен быть сериализуемым по стандартам GWT. Есть ли простой способ сделать это?

Я использую RPC вместо системы запросов из соображений безопасности. Я не хочу, чтобы люди могли просматривать мой javascript и видеть мои запросы и тому подобное.

Спасибо.

ОБНОВЛЕНИЕ: Вернувшись к проблеме, я обнаружил, что DataTable является JavaScriptObject и, вероятно, никогда не предназначался для создания на стороне сервера. Итак, новый вопрос: что является лучшим способом сделать DataTable вручную во что-то сербализуемым, а затем как лучше всего переделать его на стороне клиента. Еще раз спасибо!

Ответы [ 3 ]

4 голосов
/ 26 июня 2009

Хорошо, я сам все понял (вроде), поэтому я решил опубликовать ответ здесь на случай, если у кого-нибудь еще возникнет такая же проблема позже.

Короче, ответ невозможен. DataTable - это объект JSO, и в текущей версии GWT (1.6 что-то) он не может сериализовать объекты этих типов. Что мне нужно было сделать, так это разбить мои данные на ряд ArrayLists и хранить их в умеренном объекте. Затем этот объект может быть сериализован и отправлен на сторону клиента. Проблема в том, что вы должны затем создать объект DataTable на стороне клиента.

Если кому-то еще удастся придумать лучшую идею, мне все равно было бы интересно узнать.

Спасибо.

-Эрик

1 голос
/ 29 октября 2012

Библиотеки Google API для Google Web Toolkit (например, gwt-visualization.jar) предназначены только для использования на стороне клиента (для создания javascript). К счастью, Google также предоставляет серверный Java-код для публикации таблиц данных в их библиотеке источников данных визуализации Google .

Вот настройка, которая позволила мне генерировать DataTables на сервере при удаленном вызове процедуры, передавать их обратно клиенту в виде строки JSON и использовать Google Visualizations для Google Web Toolkit, чтобы отобразить симпатичный Google Plot на клиенте страница интернета. Я использую Eclipse Indigo с Google Web Toolkit 2.4.0.

  • Добавьте gwt-visualization.jar Клиентская библиотека привязки API GWT к пути сборки вашего проекта и как унаследованный модуль в описании вашего собственного модуля:

В src / com.package.name / project-name.xml:

<inherits name='com.google.gwt.visualization.Visualization'/>

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

В клиенте / 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>
  • Реализация службы «таблица» на сервере:

На сервере / 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();
        }

}
  • Пусть клиентский код вызывает службу "таблица" и создает DataTable из возвращенной строки JSON:

В клиенте / 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

1 голос
/ 27 октября 2010

Я думаю, что вы можете сделать это

на стороне сервера

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

и на стороне клиента использовать что-то вроде

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

Я думаю, что это должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...