В этом разделе приведены некоторые советы, которые помогут вам написать более сложные реализации библиотеки:
- Использование собственного сервлета
- Определение возможностей
- Настройка потока событий
- Передача параметров в
DataTableGenerator.generateDataTable
- Реализация источника данных, не являющегося сервлетом
Использование собственного сервлета
Простейшие реализации источников данных наследуются от класса DataSourceServlet
библиотеки. Чтобы наследовать класс, отличный от DataSourceServlet
, реализуйте источник данных следующим образом:
- Реализуйте интерфейс
DataTableGenerator
и переопределитеgetCapabilities()
generateDataTable()
. - Вызовите
DataSourceHelper.executeDataSourceServletFlow()
из кода вашего сервлета, чтобы запустить поток источника данных. Этот метод принимает следующие параметры:- Объект
HttpServletRequest
. - Объект
HttpServletResponse
. - Ваша реализация интерфейса
DataTableGenerator
из шага 1 выше. - Логическое значение, указывающее режим ограниченного или неограниченного доступа.
- Объект
Например, если вы хотите унаследовать свой сервлет от другого класса сервлетов, называемого AuthServlet
, который обеспечивает встроенную аутентификацию, вы можете переписать SimpleServletExample
, чтобы наследовать AuthServlet
, а не DataSourceServlet
, следующим образом:
- Реализуйте интерфейс
DataTableGenerator
. - Переместите
generateDataTable()
из реализацииDataSourceServlet
в реализациюDataTableGenerator
. - Переопределите
getCapabilities()
в вашей реализацииDataTableGenerator
, чтобы вернутьCapabilities.None
. - Вызовите
DataSourceHelper.executeDataSourceServletFlow()
из кода сервлета (doGet()
илиdoPost()
) и передайте реализациюDataTableGenerator
. Этот метод запускает весь поток источника данных, включая преобразование результатов источника данных в ответ сервлета.
Вы можете использовать тот же метод, если используете структуру сервлетов, в которой вы обычно наследуете абстрактный класс, предоставляемый этой структурой. Например, если вы используете WebWork, вы можете захотеть наследовать класс ActionSupport
.
Определение возможностей
Если ваше хранилище данных содержит большой объем данных и вы хотите повысить эффективность источника данных, вы можете использовать возможности запроса вашего хранилища данных. Например, предположим, что ваше хранилище данных представляет собой базу данных, и в базе данных имеется большое количество столбцов. Если визуализация запрашивает только несколько из этих столбцов, то выполнение операции SELECT
в базе данных более эффективно, чем извлечение всех столбцов и использование возможностей запросов библиотеки для выполнения SELECT
. Чтобы реализовать возможности SELECT
, вы пишете код для запуска операции SELECT
в базе данных и возврата таблицы данных.
Используйте перечисление Capabilities
, чтобы определить возможности выполнения запросов, предоставляемые вашим кодом. Доступные варианты:
-
NONE
: по умолчанию ваш код не выполняет никаких операций запроса. -
SQL
: ваш код обеспечивает операции SQL-запросов. -
SORT_AND_PAGINATION
: ваш код обеспечивает операции запроса как по сортировке, так и по разбивке на страницы. -
SELECT
: ваш код обеспечивает операцию выбора. -
ALL
: ваш код предоставляет операцииSQL
,SORT_AND_PAGINATION
иSELECT
.
Примечание . Во всех случаях библиотека обрабатывает любые операции запроса, которые не предусмотрены вашим кодом.
Чтобы реализовать возможность, отличную от NONE
, переопределите Capabilities.getCapabilities()
и реализуйте DataTable.generateDataTable()
для запроса хранилища данных и возврата таблицы данных.
Три примера иллюстрируют, как реализовать возможности: AdvancedExampleServlet
, AdvancedExampleServlet2
и SqlDataSourceServlet
. Все они находятся в example
пакета. AdvancedExampleServlet2
обсуждается в разделе «Определение возможностей и потока событий» .
Настройка потока событий
Поток событий по умолчанию определен в DataSourceHelper.executeDataSourceServletFlow
. Последовательность действий по умолчанию выглядит следующим образом:
- Извлечение и анализ параметров запроса.
- Только для режима ограниченного доступа убедитесь, что запрос исходит из того же домена, что и сервлет.
- Проанализируйте запрос, чтобы создать два объекта запроса: запрос к источнику данных и запрос завершения. Передайте запрос источника данных в вашу реализацию
generateDataTable()
. - Ваша реализация
generateDataTable()
генерирует таблицу данных. - Запустите запрос завершения для таблицы данных, созданной на шаге 5.
- Отобразите таблицу данных в формате, указанном визуализацией, и установите ответ сервлета.
Чтобы указать собственный поток событий, вызовите вспомогательные функции в datasource.DataSourceHelper
. Пример реализации см. в разделе «Определение возможностей и потока событий» .
Передача параметров в DataTableGenerator.generateDataTable
Вы можете использовать HttpServletRequest.setAttribute
для передачи данных, которые не являются частью запроса или объекта HttpServletRequest
, в DataTableGenerator.generateDataTable
. Пример кода приведен ниже.
В коде вашего сервлета поместите объект, который вы хотите передать, в HttpServletRequest
следующим образом:
request.setAttribute("my_object_name", myObject); DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);
В реализации интерфейса dataTableGenerator
получите объект из HttpServletRequest
следующим образом:
public DataTable generateDataTable(Query query, HttpServletRequest request){ Object myObject = request.getAttribute("my_object_name"); // Add your code to manipulate myObject here }
Реализация источника данных, не являющегося сервлетом
Если вы реализуете библиотеку без использования сервлета, вы можете использовать только те классы и вспомогательные функции, которые не требуют среды сервлета. К ним относятся классы Query
и DataTable
, а также некоторые функции DataSourceHelper
, такие как parseQuery
, applyQuery
, validateQuery
и splitQuery
. Вы можете использовать эти классы и функции для следующих целей:
- Разберите запрос визуализации.
- Разделите запрос на запрос источника данных и запрос завершения.
- Запустите запрос завершения, чтобы создать таблицу данных.
- Верните таблицу данных в визуализацию в формате
HTML
,CSV
илиJSON
.