Wskazówki dotyczące implementacji

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

Korzystanie z własnego serwletu

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

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

Jeśli na przykład chcesz dziedziczyć serwlet z innej klasy serwletu o nazwie AuthServlet, która zapewnia wbudowane uwierzytelnianie, możesz przepisać SimpleServletExample tak, aby dziedziczył atrybut AuthServlet zamiast DataSourceServlet:

  1. Zaimplementuj interfejs DataTableGenerator.
  2. Przenieś aplikację generateDataTable() ze swojej implementacji DataSourceServlet do implementacji DataTableGenerator.
  3. Zastąp getCapabilities() w implementacji DataTableGenerator, aby zwrócić Capabilities.None.
  4. Wywołaj DataSourceHelper.executeDataSourceServletFlow() z kodu serwletu (doGet() lub doPost()) i przekaż implementację DataTableGenerator. Ta metoda przeprowadza cały przepływ źródła danych, w tym renderuje wyniki ze źródła danych do odpowiedzi serwletu.

Tej samej metody możesz używać, jeśli używasz platformy serwletu, w której zwykle dziedziczysz abstrakcyjną klasę określoną przez platformę. Jeśli na przykład używasz WebWork, może chcesz odziedziczyć klasę ActionSupport.

Definiowanie umiejętności

Jeśli Twój magazyn danych zawiera bardzo dużo danych i chcesz zwiększyć wydajność swojego źródła danych, możesz użyć funkcji zapytań dotyczących magazynu danych. Załóżmy na przykład, że magazyn danych to baza danych, która zawiera wiele kolumn. Jeśli wizualizacja żąda tylko kilku z tych kolumn, uruchomienie operacji SELECT w bazie danych będzie wydajniejsze niż pobranie wszystkich kolumn i wykorzystanie funkcji zapytań z biblioteki do wykonania SELECT. Aby wdrożyć funkcje SELECT, napisz kod uruchamiający operację SELECT w bazie danych i zwracającą tabelę danych.

Użyj wyliczenia Capabilities, aby określić funkcje zapytań, które zapewniają Twój kod. Dostępne opcje:

  • NONE: kod domyślny nie zawiera operacji wykonywania zapytań.
  • SQL: kod zapewnia operacje zapytań SQL.
  • SORT_AND_PAGINATION: kod zawiera operacje sortowania oraz podziału na strony.
  • SELECT: kod umożliwia wykonanie wybranego działania.
  • ALL: kod zawiera operacje SQL, SORT_AND_PAGINATION i SELECT.

Uwaga: we wszystkich przypadkach biblioteka obsługuje wszystkie operacje wykonywania zapytań, które nie zostały dostarczone przez kod.

Aby wdrożyć funkcję inną niż NONE, zastąp Capabilities.getCapabilities() i zastosuj DataTable.generateDataTable(), aby wysyłać zapytania do magazynu danych i zwracać tabelę danych.

Trzy przykłady pokazują, jak wdrożyć możliwości: AdvancedExampleServlet, AdvancedExampleServlet2 i SqlDataSourceServlet. Wszystkie są w pakiecie example. Tematem spotkania AdvancedExampleServlet2 jest definicja umiejętności i procesu zdarzeń.

Dostosowywanie przepływu zdarzeń

Domyślny przepływ zdarzeń jest zdefiniowany w DataSourceHelper.executeDataSourceServletFlow. Oto domyślny przepływ pracy:

  1. Wyodrębnij i przeanalizuj parametry zapytania.
  2. Tylko w trybie ograniczonego dostępu sprawdź, czy żądanie pochodzi z tej samej domeny co serwlet.
  3. Przeanalizuj żądanie utworzenia 2 obiektów zapytania: zapytania dotyczącego źródła danych i zapytania o zakończenie. Przekaż zapytanie o źródło danych do implementacji tagu generateDataTable().
  4. Twoja implementacja generateDataTable() generuje tabelę danych.
  5. Uruchom zapytanie o ukończenie zadania w tabeli danych wygenerowanej w kroku 5.
  6. Wyrenderuj tabelę danych do formatu określonego przez wizualizację i ustaw odpowiedź serwletu.

Aby określić własny przepływ zdarzeń, wywołaj funkcje pomocnicze w komórce datasource.DataSourceHelper. Przykład implementacji znajdziesz w punkcie Definiowanie możliwości i przepływu zdarzeń.

Przekazywanie parametrów do DataTableGenerator.generateDataTable

HttpServletRequest.setAttribute umożliwia przekazywanie danych, które nie są częścią zapytania ani obiektu HttpServletRequest, do DataTableGenerator.generateDataTable. Przykładowy kod znajdziesz poniżej.

W kodzie serwletu umieść obiekt, który chcesz przekazać, w HttpServletRequest:

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 
} 

Implementowanie źródła danych bez obsługi

Jeśli zaimplementujesz bibliotekę bez użycia serwletu, możesz używać tylko tych klas i funkcji pomocniczych, które nie wymagają środowiska serwletu. Obejmuje to klasy Query i DataTable oraz niektóre funkcje DataSourceHelper, takie jak parseQuery, applyQuery, validateQuery i splitQuery. Tych zajęć i funkcji możesz używać do:

  • Analizuj wizualizację
  • Podziel zapytanie na zapytanie dotyczące źródła danych i zakończenie.
  • Uruchom zapytanie o ukończenie, aby wygenerować tabelę danych.
  • Przywróć tabelę danych do wizualizacji w formacie HTML, CSV lub JSON.