Funktionen und Ereignisfluss definieren

In diesem Abschnitt wird AdvancedExampleServlet2 vorgestellt. AdvancedExampleServlet2 ist ein Beispiel für eine Datenquellenimplementierung, die die Funktionen und den Ereignisfluss definiert. Dieser Abschnitt enthält auch Schritt-für-Schritt-Anleitungen zum Ausführen und Testen von AdvancedExampleServlet2.

Hinweis: Sie müssen zuerst den Abschnitt Erste Schritte ausfüllen.

Wir stellen vor: AdvancedExampleServlet2

Die Klasse AdvancedExampleServlet2 befindet sich im Paket examples. Diese Klasse enthält eine Beispielimplementierung, die die Funktionen und den Ablauf von Ereignissen definiert.

Die wichtigsten Teile von AdvancedExampleServlet2 werden in den folgenden Abschnitten beschrieben:

Ereignisfluss definieren

AdvancedExampleServlet2 definiert den Ereignisfluss, indem die Methode HttpServlet.doGet() überschrieben und verschiedene von DataSourceHelper bereitgestellte Hilfsfunktionen aufgerufen werden.

Das folgende Snippet überschreibt doGet(). Der Parameter HttpServletRequest kapselt die Anfrage, die von einer Visualisierung an das Servlet gesendet wurde. Der Parameter HttpServletResponse kapselt die Antwort vom Servlet auf die Abfragevisualisierung. Durch dieses Snippet wird außerdem dsRequest auf null gesetzt. dsRequest wird an verschiedenen Stellen im restlichen Code verwendet.

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

Das folgende Snippet extrahiert die Anfrageparameter aus HttpServletRequest, um den Kontext zu erstellen, in dem die Anfrage ausgeführt wird.

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

Das folgende Snippet nimmt die Abfrage aus dem Objekt dsRequest und teilt sie in zwei separate Abfragen auf. Eine Abfrage wird als Datenquellenabfrage und die andere als Abschlussabfrage bezeichnet. Da die deklarierte Funktion SELECT ist, besteht die Datenquellenabfrage aus einem SELECT-Vorgang, wenn das dsRequest-Objekt einen SELECT-Vorgang enthält. Die Abschlussabfrage besteht aus allen anderen für die Anfrage erforderlichen Vorgängen, die auch den Vorgang SELECT beinhalten können. Lautet die angeforderte Abfrage beispielsweise SELECT a ORDER BY b, lautet die Abfrage der Datenquelle SELECT a, b und die Abschlussabfrage ist mit der ursprünglichen Abfrage SELECT a ORDER BY b identisch.

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

Das folgende Snippet verwendet die vom vorherigen Snippet und von HttpServletRequest, erstellte Datenquelle und erstellt eine Datentabelle. Weitere Informationen finden Sie im Abschnitt Funktionen verwenden.

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

Der folgende Code verwendet die Abschlussabfrage, die bei der Aufteilung der Abfrage, die vom vorherigen Snippet erzeugte Datentabelle und die Nutzersprache aus der Abfragevisualisierung generiert wurde. Der Code erstellt dann eine neue Datentabelle.

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

Der folgende Code verwendet die Datentabelle, die vom vorherigen Snippet erstellt wurde, und die Anfrageparameter von HttpServletRequest. . Der Code legt dann die Servlet-Antwort fest. Der Servlet-Container gibt diese Antwort an die Abfragevisualisierung zurück.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Fehlerbehandlung

Das folgende Snippet erfasst eine Ausnahme, ruft die entsprechende Nachricht ab, formatiert die Antwort und legt die Servlet-Antwort fest. Wenn dsRequest null ist, ist DataSourceRequest nicht verfügbar. Das liegt möglicherweise an einem Fehler des Konstruktors. In diesem Fall wird HttpRequest anstelle von DataSourceRequest verwendet.

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

URL-Parameter verwenden

Das folgende Snippet verwendet die Datenquelle, die erstellt wurde, als die Abfrage aufgeteilt wurde, und die HttpServletRequest. HttpServletRequest kann optional einen tableId-Parameter enthalten, der als URL angegeben ist. Mit dem Parameter tableId wird festgelegt, welche Datentabelle zurückgegeben wird:

  • Wenn der Parameter tableId weggelassen wird oder etwas anderes als planets ist, gibt die Datenquelle die Datentabelle der Tiere zurück.
  • Wenn der Parameter tableId als planets angegeben ist, gibt die Datenquelle die Planetendatentabelle zurück.

Wenn Sie eigenen Code schreiben, um eine Datentabelle zurückzugeben, entscheiden Sie, welche Parameter verwendet werden sollen.

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

Funktionen nutzen

Das folgende Snippet verwendet die Abfrage und generiert die Datentabelle animals.

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

Das folgende Snippet verwendet die Abfrage und generiert die Datentabelle planets.

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

AdvancedExampleServlet2 ausführen und testen

In diesem Abschnitt erfahren Sie, wie Sie AdvancedExampleServlet2 ausführen und testen.

Wenn Sie AdvancedExampleServlet2 ausführen und testen möchten, aktualisieren Sie Ihre Webanwendung und richten Sie eine Visualisierung ein, mit der die Datenquelle abgefragt wird. Dies wird in den folgenden Abschnitten beschrieben:

Webanwendung in Apache Tomcat aktualisieren

Folgen Sie der Anleitung unten oder passen Sie sie an, um Ihre Webanwendung in Apache Tomcat zu aktualisieren. Die folgende Anleitung gilt speziell für Apache Tomcat auf einem Windows-System:

  1. Die Datei web.xml, die Sie zuvor in das Verzeichnis WEB-INF kopiert haben, enthält bereits die für dieses Beispiel erforderliche Definition und Zuordnung. Diese Zeilen definieren:

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. Starten Sie Tomcat oder starten Sie Tomcat neu, wenn er bereits ausgeführt wird.
  3. Klicken Sie auf den folgenden Link: http://localhost:8080/myWebApp/advanced
    Der Bildschirm enthält 6–7 Textzeilen, abhängig von der Bildschirmbreite. Der Text beginnt mit google.visualization.Query.setResponse und endet mit {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    Dies ist die Antwort, die die CSV-Beispielquelle an eine Visualisierung sendet.

Daten mithilfe einer Visualisierung ansehen

Mit der Datei all_examples.html im Verzeichnis <data_source_library_install>/examples/src/html können Sie eine Visualisierung der Daten aufrufen.

Das folgende Snippet aus all_examples gibt das advanced-Servlet, die Tabelle planets, eine ausgewählte Abfrage und eine Balkendiagrammvisualisierung an.

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

Eine Erläuterung der anderen Visualisierungen in all_examples.html finden Sie im Abschnitt Externen Datenspeicher verwenden.

Weitere Informationen zum Angeben einer Visualisierung und zum Verwenden der Abfragesprache finden Sie unter Diagramme verwenden und in der Referenz zur Abfragesprache.

So können Sie eine Visualisierung der von der erweiterten Datenquelle bereitgestellten Daten aufrufen oder anpassen:

  1. Wenn Sie dies noch nicht getan haben, kopieren Sie die Datei all_examples.html aus dem Verzeichnis <data_source_library_install>/examples/src/html
    in das Verzeichnis <tomcat_home>/webapps/myWebApp/.
     
  2. Klicken Sie in einem Browser auf den Link http://localhost:8080/myWebApp/all_examples.html. Sie sollten Folgendes sehen:

Next Steps

Weitere Beispiele zur Verwendung der Bibliothek finden Sie in der Kurzanleitung. Weitere Informationen zum Implementieren einer komplexen Datenquelle finden Sie unter Implementierungstipps.