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
DataTableGenerator
i 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
DataTableGenerator
z 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 implementacjiDataSourceServlet
do 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_PAGINATION
iSELECT
.
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
,CSV
lubJSON
.