В этом разделе приведены некоторые советы, которые помогут вам написать более сложную реализацию библиотеки:
- Использование собственного сервлета
- Определение возможностей
- Настройка потока событий
- Передача параметров в
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
.