W tej sekcji znajdziesz wskazówki, które pomogą Ci napisać bardziej złożone implementacje biblioteki:
- Korzystanie z własnej serwletu
- Definiowanie możliwości
- Dostosowywanie przebiegu zdarzeń
- Przekazywanie parametrów do DataTableGenerator.generateDataTable
- Implementowanie źródła danych innego niż serwlet
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:
-  Zaimplementuj interfejs DataTableGeneratori zastąp ustawieniagetCapabilities()orazgenerateDataTable().
-  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 DataTableGeneratorz kroku 1 powyżej.
- Wartość logiczna określająca tryb ograniczonego lub nieograniczonego dostępu.
 
- Obiekt 
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:
-  Wdróż interfejs DataTableGenerator.
-  Przenieś element generateDataTable()z implementacjiDataSourceServletdo implementacjiDataTableGenerator.
-  Zastąp getCapabilities()w implementacjiDataTableGenerator, aby zwracać wartośćCapabilities.None.
-  Wywołaj funkcję DataSourceHelper.executeDataSourceServletFlow()w kodzie serwletu (doGet()lubdoPost()) 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_PAGINATIONi- 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:
- Wyodrębnia i analizowania parametrów zapytania.
- Tylko w przypadku trybu ograniczonego dostępu sprawdź, czy żądanie pochodzi z tej samej domeny co serwlet.
- 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().
- Implementacja funkcji generateDataTable()generuje tabelę danych.
- Wykonaj zapytanie uzupełniania w tabeli danych wygenerowanej w kroku 5.
- 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,CSVlubJSON.