Tipps zur Implementierung

In diesem Abschnitt finden Sie einige Tipps, die Ihnen helfen, komplexere Implementierungen der Bibliothek zu schreiben:

Eigenes Servlet verwenden

Bei den einfachsten Datenquellenimplementierungen werden Werte von der DataSourceServlet-Klasse der Bibliothek übernommen. Wenn Sie Daten von einer anderen Klasse als DataSourceServlet übernehmen möchten, müssen Sie eine Datenquelle so implementieren:

  1. Implementieren Sie die DataTableGenerator-Schnittstelle und überschreiben Sie getCapabilities() und generateDataTable().
  2. Rufen Sie DataSourceHelper.executeDataSourceServletFlow() aus dem Code Ihres Servlets auf, um den Datenquellenfluss auszuführen.Diese Methode verwendet die folgenden Parameter:
    • Ein HttpServletRequest-Objekt.
    • Ein HttpServletResponse-Objekt.
    • Ihre Implementierung der DataTableGenerator-Schnittstelle aus Schritt 1 oben.
    • Ein boolescher Wert zur Angabe des Modus mit eingeschränktem oder uneingeschränktem Zugriff.

Wenn Sie beispielsweise das Servlet von einer anderen Servlet-Klasse mit dem Namen AuthServlet übernehmen möchten, die eine integrierte Authentifizierung bietet, können Sie SimpleServletExample so umschreiben, dass AuthServlet statt DataSourceServlet übernommen wird:

  1. Implementieren Sie die DataTableGenerator-Schnittstelle.
  2. Verschieben Sie generateDataTable() von der DataSourceServlet-Implementierung in die DataTableGenerator-Implementierung.
  3. Überschreiben Sie getCapabilities() in Ihrer DataTableGenerator-Implementierung, um Capabilities.None zurückzugeben.
  4. Rufen Sie DataSourceHelper.executeDataSourceServletFlow() aus Ihrem Servlet-Code (doGet() oder doPost()) auf und übergeben Sie die Implementierung von DataTableGenerator. Diese Methode führt den gesamten Ablauf der Datenquelle aus, einschließlich der Darstellung der Datenquellenergebnisse in der Servlet-Antwort.

Sie können dieselbe Technik verwenden, wenn Sie ein Servlet-Framework verwenden, in dem Sie normalerweise eine vom Framework bereitgestellte abstrakte Klasse übernehmen. Wenn Sie beispielsweise WebWork verwenden, möchten Sie möglicherweise die Klasse ActionSupport übernehmen.

Funktionen definieren

Wenn Ihr Datenspeicher eine große Datenmenge enthält und Sie die Effizienz Ihrer Datenquelle erhöhen möchten, können Sie die Abfragefunktionen des Datenspeichers verwenden. Angenommen, Ihr Datenspeicher ist eine Datenbank und die Datenbank hat eine große Anzahl von Spalten. Wenn eine Visualisierung nur wenige dieser Spalten anfordert, ist die Ausführung eines SELECT-Vorgangs in der Datenbank effizienter, als alle Spalten abzurufen und die Abfragefunktionen der Bibliothek zum Ausführen des SELECT-Vorgangs zu verwenden. Zum Implementieren von SELECT-Funktionen schreiben Sie Code, um einen SELECT-Vorgang in der Datenbank auszuführen und eine Datentabelle zurückzugeben.

Verwenden Sie das Enum Capabilities, um die Abfragefunktionen zu definieren, die Ihr Code bietet. Folgende Optionen sind verfügbar:

  • NONE: Dies ist die Standardeinstellung. Der Code führt keine Abfragevorgänge aus.
  • SQL: Der Code stellt SQL-Abfragevorgänge bereit.
  • SORT_AND_PAGINATION: Der Code bietet Abfragevorgänge zum Sortieren und zur Paginierung.
  • SELECT: Ihr Code stellt einen Auswahlvorgang bereit.
  • ALL: Der Code stellt SQL-, SORT_AND_PAGINATION- und SELECT-Vorgänge bereit.

Hinweis: In allen Fällen verarbeitet die Bibliothek alle Abfragevorgänge, die nicht von Ihrem Code bereitgestellt werden.

Wenn Sie eine andere Funktion als NONE implementieren möchten, überschreiben Sie Capabilities.getCapabilities() und implementieren Sie DataTable.generateDataTable(), um den Datenspeicher abzufragen und eine Datentabelle zurückzugeben.

Drei der Beispiele veranschaulichen, wie Funktionen implementiert werden: AdvancedExampleServlet, AdvancedExampleServlet2 und SqlDataSourceServlet. Alle befinden sich im Paket „example“. AdvancedExampleServlet2 wird unter Funktionen und Ereignisfluss definieren erläutert.

Ereignisfluss anpassen

Der Standardfluss von Ereignissen wird in DataSourceHelper.executeDataSourceServletFlow definiert. Der Standardablauf sieht so aus:

  1. Abfrageparameter extrahieren und parsen
  2. Nur für den Modus mit eingeschränktem Zugriff: Prüfen Sie, ob die Anfrage von derselben Domain wie das Servlet stammt.
  3. Parsen Sie die Anfrage, um zwei Abfrageobjekte zu erstellen: die Datenquellenabfrage und die Abschlussabfrage. Übergeben Sie die Datenquellenabfrage an die Implementierung von generateDataTable().
  4. Durch Ihre Implementierung von generateDataTable() wird eine Datentabelle generiert.
  5. Führen Sie die Abschlussabfrage für die in Schritt 5 generierte Datentabelle aus.
  6. Rendern Sie die Datentabelle in dem von der Visualisierung angegebenen Format und legen Sie die Servlet-Antwort fest.

Wenn Sie Ihren eigenen Ereignisfluss festlegen möchten, rufen Sie die Hilfsfunktionen in datasource.DataSourceHelper auf. Eine Beispielimplementierung finden Sie unter Funktionen und Ereignisfluss definieren.

Parameter an DataTableGenerator.generateDataTable übergeben

Mit HttpServletRequest.setAttribute können Sie Daten, die nicht Teil einer Abfrage oder eines HttpServletRequest-Objekts sind, an DataTableGenerator.generateDataTable übergeben. Beispielcode finden Sie unten.

Fügen Sie im Code Ihres Servlets das Objekt, das Sie dem HttpServletRequest übergeben möchten, so ein:

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

So rufen Sie in der Implementierung der dataTableGenerator-Schnittstelle das Objekt aus HttpServletRequest ab:

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

Nicht-Servlet-Datenquelle implementieren

Wenn Sie die Bibliothek ohne Servlet implementieren, können Sie nur die Klassen und Hilfsfunktionen verwenden, für die keine Servlet-Umgebung erforderlich ist. Dazu gehören die Klassen Query und DataTable sowie einige DataSourceHelper-Funktionen wie parseQuery, applyQuery, validateQuery und splitQuery. Mit diesen Klassen und Funktionen können Sie Folgendes tun:

  • eine Visualisierungsabfrage parsen.
  • Teilen Sie die Abfrage in eine Datenquellenabfrage und eine Abschlussabfrage auf.
  • Führen Sie die Abschlussabfrage aus, um eine Datentabelle zu generieren.
  • Die Datentabelle im Format HTML, CSV oder JSON in die Visualisierung zurückgeben.