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 alsplanets
ist, gibt die Datenquelle die Datentabelle der Tiere zurück. - Wenn der Parameter
tableId
alsplanets
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(); ListrequiredColumns = 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(); ListrequiredColumns = 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:
- Die Datei
web.xml
, die Sie zuvor in das VerzeichnisWEB-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>
- Starten Sie Tomcat oder starten Sie Tomcat neu, wenn er bereits ausgeführt wird.
- 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 mitgoogle.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:
- 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/
.
- 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.