实现提示

本部分介绍了一些有助于您编写更复杂的库实现的提示:

使用您自己的 Servlet

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

  1. 实现 DataTableGenerator 接口并替换 getCapabilities()generateDataTable()
  2. 从 WebView 的代码中调用 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() 以查询数据存储区并返回数据表。

以下三个示例说明了如何实现 capability:AdvancedExampleServletAdvancedExampleServlet2SqlDataSourceServlet。所有这些都在 example 软件包中。定义功能和事件流AdvancedExampleServlet2 进行了介绍。

自定义事件流

DataSourceHelper.executeDataSourceServletFlow 中定义了默认事件流。默认流程如下:

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

如需指定您自己的事件流,请调用 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 格式将数据表返回到可视化图表。