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