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

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

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

Простейшие реализации источников данных наследуются от библиотечного класса 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 .