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 operacjeSQL,SORT_AND_PAGINATIONiSELECT.
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.