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.