Советы по внедрению

В этом разделе приведены некоторые советы, которые помогут вам написать более сложные реализации библиотеки:

Использование собственного сервлета

Простейшие реализации источников данных наследуются от класса DataSourceServlet библиотеки. Чтобы наследовать класс, отличный от DataSourceServlet , реализуйте источник данных следующим образом:

  1. Реализуйте интерфейс DataTableGenerator и переопределите getCapabilities() generateDataTable() .
  2. Вызовите DataSourceHelper.executeDataSourceServletFlow() из кода вашего сервлета, чтобы запустить поток источника данных. Этот метод принимает следующие параметры:
    • Объект HttpServletRequest .
    • Объект HttpServletResponse .
    • Ваша реализация интерфейса DataTableGenerator из шага 1 выше.
    • Логическое значение, указывающее режим ограниченного или неограниченного доступа.

Например, если вы хотите унаследовать свой сервлет от другого класса сервлетов, называемого AuthServlet , который обеспечивает встроенную аутентификацию, вы можете переписать SimpleServletExample , чтобы наследовать AuthServlet , а не DataSourceServlet , следующим образом:

  1. Реализуйте интерфейс DataTableGenerator .
  2. Переместите generateDataTable() из реализации DataSourceServlet в реализацию DataTableGenerator .
  3. Переопределите getCapabilities() в вашей реализации DataTableGenerator , чтобы вернуть Capabilities.None .
  4. Вызовите 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 . Последовательность действий по умолчанию выглядит следующим образом:

  1. Извлечение и анализ параметров запроса.
  2. Только для режима ограниченного доступа убедитесь, что запрос исходит из того же домена, что и сервлет.
  3. Проанализируйте запрос, чтобы создать два объекта запроса: запрос к источнику данных и запрос завершения. Передайте запрос источника данных в вашу реализацию generateDataTable() .
  4. Ваша реализация generateDataTable() генерирует таблицу данных.
  5. Запустите запрос завершения для таблицы данных, созданной на шаге 5.
  6. Отобразите таблицу данных в формате, указанном визуализацией, и установите ответ сервлета.

Чтобы указать собственный поток событий, вызовите вспомогательные функции в 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 .