Wskazówki dotyczące implementacji

W tej sekcji znajdziesz wskazówki, które pomogą Ci napisać bardziej złożone implementacje biblioteki:

Korzystanie z własnego serwletu

Najprostsze implementacje źródła danych dziedziczą z klasy DataSourceServlet biblioteki. Aby dziedziczyć z klasy innej niż DataSourceServlet, zaimplementuj źródło danych w ten sposób:

  1. Zaimplementuj interfejs DataTableGenerator i zastąp ustawienia getCapabilities() oraz generateDataTable().
  2. Wywołaj funkcję DataSourceHelper.executeDataSourceServletFlow() w kodzie serwletu, aby uruchomić przepływ źródła danych.Ta metoda przyjmuje te parametry:
    • Obiekt HttpServletRequest.
    • Obiekt HttpServletResponse.
    • Twoja implementacja interfejsu DataTableGenerator z kroku 1 powyżej.
    • Wartość logiczna określająca tryb ograniczonego lub nieograniczonego dostępu.

Jeśli na przykład chcesz dziedziczyć serwlet z innej klasy serwletu o nazwie AuthServlet, która oferuje wbudowane uwierzytelnianie, możesz przepisać dyrektywę SimpleServletExample tak, aby odziedziczyła klasę AuthServlet, a nie DataSourceServlet w ten sposób:

  1. Wdróż interfejs DataTableGenerator.
  2. Przenieś element generateDataTable() z implementacji DataSourceServlet do implementacji DataTableGenerator.
  3. Zastąp getCapabilities() w implementacji DataTableGenerator, aby zwracać wartość Capabilities.None.
  4. Wywołaj funkcję DataSourceHelper.executeDataSourceServletFlow() w kodzie serwletu (doGet() lub doPost()) i przekaż implementację DataTableGenerator. Ta metoda uruchamia cały przepływ źródła danych, w tym renderowanie wyników ze źródła danych w odpowiedzi serwletu.

Tej samej metody możesz użyć w przypadku platformy serwletów, w której zwykle dziedziczysz klasę abstrakcyjną z udostępnianej przez nią platformy. Jeśli na przykład korzystasz z WebWork, warto odziedziczyć klasę ActionSupport.

Definiowanie funkcji

Jeśli Twój magazyn danych zawiera dużo danych, a chcesz zwiększyć wydajność źródła danych, możesz skorzystać z możliwości wykonywania zapytań. Załóżmy np., że Twój magazyn danych jest bazą danych z dużą liczbą kolumn. Jeśli wizualizacja żąda tylko kilku z tych kolumn, użycie operacji SELECT w bazie danych jest skuteczniejsze niż pobranie wszystkich kolumn i użycie funkcji zapytań w bibliotece do wykonania funkcji SELECT. Aby wdrożyć funkcje SELECT, musisz napisać kod uruchamiający operację SELECT w bazie danych i zwracający tabelę danych.

Użyj wyliczenia Capabilities, aby określić możliwości wysyłania zapytań w Twoim kodzie. Dostępne opcje:

  • NONE: domyślnie kod nie wykonuje operacji na zapytaniach.
  • SQL: Twój kod udostępnia operacje zapytań SQL.
  • SORT_AND_PAGINATION: Twój kod umożliwia wykonywanie zapytań dotyczących zarówno sortowania, jak i podziału na strony.
  • SELECT: Twój kod zawiera operację wyboru.
  • ALL: Twój kod zawiera operacje SQL, SORT_AND_PAGINATION i SELECT.

Uwaga: we wszystkich przypadkach biblioteka obsługuje wszelkie operacje związane z zapytaniami, które nie znajdują się w kodzie.

Aby wdrożyć możliwość inną niż NONE, zastąp Capabilities.getCapabilities() i zaimplementuj funkcję DataTable.generateDataTable(), aby wysłać zapytanie do magazynu danych i zwrócić tabelę danych.

Trzy przykłady pokazują, jak wdrożyć możliwości: AdvancedExampleServlet, AdvancedExampleServlet2 i SqlDataSourceServlet. Wszystkie są w pakiecie example. Funkcja AdvancedExampleServlet2 została omówiona w sekcji Definiowanie możliwości i przebiegu zdarzeń.

Dostosowywanie przebiegu zdarzeń

Domyślny przepływ zdarzeń jest zdefiniowany w DataSourceHelper.executeDataSourceServletFlow. Domyślny proces wygląda tak:

  1. Wyodrębnia i analizowania parametrów zapytania.
  2. Tylko w przypadku trybu ograniczonego dostępu sprawdź, czy żądanie pochodzi z tej samej domeny co serwlet.
  3. Przeanalizować żądanie, aby utworzyć 2 obiekty zapytania: zapytanie do źródła danych i zapytanie uzupełniania. Przekaż zapytanie dotyczące źródła danych do swojej implementacji obiektu generateDataTable().
  4. Implementacja funkcji generateDataTable() generuje tabelę danych.
  5. Wykonaj zapytanie uzupełniania w tabeli danych wygenerowanej w kroku 5.
  6. Wyrenderuj tabelę danych w formacie określonym przez wizualizację i ustaw odpowiedź serwletu.

Aby określić własny przepływ zdarzeń, wywołaj funkcje pomocnicze w datasource.DataSourceHelper. Przykład implementacji znajdziesz w sekcji Definiowanie funkcji i przebiegu zdarzeń.

Przekazywanie parametrów do DataTableGenerator.generateDataTable

Za pomocą HttpServletRequest.setAttribute możesz przekazywać do DataTableGenerator.generateDataTable dane, które nie są częścią zapytania lub obiektu HttpServletRequest. Przykładowy kod znajdziesz poniżej.

W kodzie serwletu umieść obiekt, który chcesz przekazać do interfejsu HttpServletRequest, w następujący sposób:

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

W implementacji interfejsu dataTableGenerator pobierz obiekt z HttpServletRequest w ten sposób:

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

Implementacja źródła danych innego niż serwlet

Jeśli wdrożysz bibliotekę bez serwletu, możesz używać tylko tych klas i funkcji pomocniczych, które nie wymagają środowiska serwletu. Są to klasy Query i DataTable oraz niektóre funkcje DataSourceHelper, np. parseQuery, applyQuery, validateQuery i splitQuery. Za pomocą klas i funkcji możesz:

  • Przeanalizuj zapytanie do wizualizacji.
  • Podziel zapytanie na zapytanie dotyczące źródła danych i zapytanie uzupełniania.
  • Uruchom zapytanie uzupełniania, aby wygenerować tabelę danych.
  • Zwraca tabelę danych do wizualizacji w formacie HTML, CSV lub JSON.