Tipps zur Implementierung

In diesem Abschnitt finden Sie einige Tipps zum Schreiben komplexerer Implementierungen der Bibliothek:

Eigenes Servlet verwenden

Die einfachste Implementierung der Datenquelle übernimmt die Klasse DataSourceServlet der Bibliothek. Wenn Sie eine andere Klasse als DataSourceServlet übernehmen möchten, implementieren Sie eine Datenquelle so:

  1. Implementiere die DataTableGenerator-Schnittstelle und überschreibe getCapabilities() und generateDataTable().
  2. Rufen Sie DataSourceHelper.executeDataSourceServletFlow() im Code Ihres Servlets auf, um den Datenquellenfluss auszuführen.Für diese Methode werden die folgenden Parameter verwendet:
    • Ein HttpServletRequest-Objekt.
    • Ein HttpServletResponse-Objekt.
    • Deine Implementierung der DataTableGenerator-Schnittstelle aus Schritt 1 oben.
    • Boolescher Wert, der den eingeschränkten oder uneingeschränkten Zugriffsmodus angibt.

Wenn Sie beispielsweise Ihr Servlet aus einer anderen Servlet-Klasse namens AuthServlet übernehmen möchten, das eine integrierte Authentifizierung bietet, können Sie SimpleServletExample so ändern, dass AuthServlet statt DataSourceServlet übernommen wird:

  1. Implementiere 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() im Servlet-Code (doGet() oder doPost()) auf und übergeben Sie die Implementierung von DataTableGenerator. Bei dieser Methode wird der gesamte Ablauf der Datenquelle ausgeführt, einschließlich der Ergebnisse der Datenquelle in der Servlet-Antwort.

Sie können diese Technik auch verwenden, wenn Sie ein Servlet-Framework verwenden, in dem Sie normalerweise eine abstrakte Klasse übernehmen, die vom Framework zur Verfügung gestellt wird. Wenn Sie beispielsweise WebWork verwenden, können Sie 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 Ihres Datenspeichers verwenden. Angenommen, Ihr Datenspeicher ist eine Datenbank und die Datenbank enthält eine große Anzahl von Spalten. Wenn bei einer Visualisierung nur einige dieser Spalten angefordert werden, ist das Ausführen eines SELECT-Vorgangs in der Datenbank effizienter als das Abrufen aller Spalten und das Verwenden der Abfragefunktionen der Bibliothek zum Ausführen des SELECT. Zum Implementieren von SELECT-Funktionen schreiben Sie Code, um einen SELECT-Vorgang in der Datenbank auszuführen und eine Datentabelle zurückzugeben.

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

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

Hinweis: In allen Fällen übernimmt die Bibliothek alle Abfragevorgänge, die nicht im Code enthalten sind.

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 sind im Paket example enthalten. AdvancedExampleServlet2 wird unter Funktionen und den Fluss von Ereignissen definieren erläutert.

Ereignisfluss anpassen

Der Standardablauf für Ereignisse ist in DataSourceHelper.executeDataSourceServletFlow definiert. Der Standardablauf sieht so aus:

  1. Abfrageparameter extrahieren und parsen
  2. Nur im Modus für eingeschränkten Zugriff prüfen Sie, ob die Anfrage von derselben Domain wie das Servlet stammt.
  3. Parst die Anfrage, um zwei Abfrageobjekte zu erstellen: die Abfrage der Datenquelle und die Vervollständigungsabfrage. Übergeben Sie die Datenquellenabfrage an Ihre Implementierung von generateDataTable().
  4. Durch die 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 einen eigenen Ereignisfluss angeben möchten, rufen Sie die Hilfsfunktionen in datasource.DataSourceHelper auf. Eine Beispielimplementierung finden Sie unter Funktionen und den Fluss von Ereignissen definieren.

Parameter an DataTableGenerator.generateDataTable übergeben

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

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

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

Rufen Sie in der Implementierung der dataTableGenerator-Schnittstelle das Objekt aus HttpServletRequest so 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 Verwendung eines Servlets 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:

  • Visualisierungsabfrage parsen
  • Die Abfrage in eine Abfrage für eine Datenquelle und eine Vervollständigung aufteilen
  • Führen Sie die Abschlussabfrage aus, um eine Datentabelle zu generieren.
  • Geben Sie die Datentabelle im Format HTML, CSV oder JSON an die Visualisierung zurück.