实现提示

本部分将介绍一些可帮助您编写更复杂的库实现的提示:

使用自己的 Servlet

最简单的数据源实现继承自库的 DataSourceServlet 类。 如需从 DataSourceServlet 以外的类继承,请按以下方式实现数据源:

  1. 实现 DataTableGenerator 接口并替换 getCapabilities()generateDataTable()
  2. 从 servlet 的代码调用 DataSourceHelper.executeDataSourceServletFlow() 以运行数据源流程。此方法采用以下参数:
    • HttpServletRequest 对象。
    • HttpServletResponse 对象。
    • 您在上面第 1 步中实现的 DataTableGenerator 接口。
    • 用于指定受限或不受限访问模式的布尔值。

例如,如果要从另一个提供内置身份验证的名为 AuthServlet 的 servlet 类继承 servlet,您可以重写 SimpleServletExample 以继承 AuthServlet,而不是 DataSourceServlet,如下所示:

  1. 实现 DataTableGenerator 接口。
  2. generateDataTable()DataSourceServlet 实现移至 DataTableGenerator 实现。
  3. 替换 DataTableGenerator 实现中的 getCapabilities() 以返回 Capabilities.None
  4. 从 servlet 代码(doGet()doPost())内调用 DataSourceHelper.executeDataSourceServletFlow(),并传递 DataTableGenerator 实现。此方法会运行数据源的整个流程,包括将数据源结果呈现到 servlet 响应中。

如果您使用的是 servlet 框架(在该框架中通常继承框架提供的抽象类),则可以使用相同的方法。例如,如果您使用的是 WebWork,则可能需要继承 ActionSupport 类。

定义功能

如果您的数据存储区包含大量数据,并且您希望提高数据源的效率,您可以使用数据存储区的查询功能。例如,假设您的数据存储区是一个数据库,并且该数据库包含大量列。如果可视化请求仅请求其中几个列,那么在该数据库中运行 SELECT 操作比检索所有列并使用库的查询功能执行 SELECT 的效率更高。如需实现 SELECT 功能,您需要编写用于在数据库中运行 SELECT 操作并返回数据表的代码。

使用 Capabilities 枚举定义代码提供的查询功能。可用的选项包括:

  • NONE:默认情况下,您的代码不提供查询操作。
  • SQL:您的代码提供 SQL 查询操作。
  • SORT_AND_PAGINATION:您的代码提供排序查询和分页查询操作。
  • SELECT:您的代码提供选择操作。
  • ALL:您的代码提供 SQLSORT_AND_PAGINATIONSELECT 操作。

注意:在任何情况下,该库都会处理代码未提供的任何查询操作。

如需实现 NONE 以外的功能,请替换 Capabilities.getCapabilities() 并实现 DataTable.generateDataTable() 以查询数据存储区并返回数据表。

以下三个示例说明了如何实现 AdvancedExampleServletAdvancedExampleServlet2SqlDataSourceServlet 功能。全部位于 example 软件包中。定义功能和事件流中讨论了 AdvancedExampleServlet2

自定义事件流

事件的默认流程在 DataSourceHelper.executeDataSourceServletFlow 中定义。默认流程如下所示:

  1. 提取和解析查询参数。
  2. 仅适用于受限访问模式,验证请求是否来自与 servlet 相同的网域。
  3. 解析创建两个查询对象的请求:数据源查询和完成查询。将数据源查询传递给 generateDataTable() 实现。
  4. 您的 generateDataTable() 实现会生成一个数据表。
  5. 对在第 5 步生成的数据表运行完成查询。
  6. 以可视化图表指定的格式渲染数据表并设置 servlet 响应。

如需指定您自己的事件流,请在 datasource.DataSourceHelper 中调用辅助函数。如需查看示例实现,请参阅定义功能和事件流

将参数传递给 DataTableGenerator.generateDataTable

您可以使用 HttpServletRequest.setAttribute 将不属于查询或 HttpServletRequest 对象的数据传递给 DataTableGenerator.generateDataTable。示例代码如下所示。

在 servlet 的代码中,将要传递的对象放入 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 
} 

实现非 servlet 数据源

如果在不使用 servlet 的情况下实现库,则只能使用不需要 servlet 环境的类和辅助函数。这其中包括 QueryDataTable 类以及一些 DataSourceHelper 函数,例如 parseQueryapplyQueryvalidateQuerysplitQuery。您可以使用这些类和函数执行以下操作:

  • 解析可视化查询。
  • 将查询拆分为数据源查询和完成查询。
  • 运行完成查询以生成数据表。
  • 将数据表返回到 HTMLCSVJSON 格式的可视化图表。