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