本部分介绍了一些有助于您编写更复杂的库实现的提示:
使用您自己的 Servlet
最简单的数据源实现继承自库的 DataSourceServlet
类。如需从 DataSourceServlet
以外的类继承,请按如下方式实现数据源:
- 实现
DataTableGenerator
接口并替换getCapabilities()
和generateDataTable()
。 - 从 WebView 的代码中调用
DataSourceHelper.executeDataSourceServletFlow()
即可运行数据源流。此方法可接受以下参数:HttpServletRequest
对象。HttpServletResponse
对象。- 您在上面第 1 步中获得的
DataTableGenerator
接口的实现。 - 用于指定受限或不受限访问模式的布尔值。
例如,如果您希望从另一个提供内置身份验证的名为 AuthServlet
的 servlet 类继承 servlet,则可以重写 SimpleServletExample
以继承 AuthServlet
而不是 DataSourceServlet
,如下所示:
- 实现
DataTableGenerator
接口。 - 将
generateDataTable()
从DataSourceServlet
实现移至DataTableGenerator
实现。 - 替换
DataTableGenerator
实现中的getCapabilities()
以返回Capabilities.None
。 - 从 Servlet 代码(
doGet()
或doPost()
)中调用DataSourceHelper.executeDataSourceServletFlow()
,并传递DataTableGenerator
实现。此方法运行数据源的整个流程,包括将数据源结果呈现到 servlet 响应中。
如果您使用的是通常继承该框架提供的抽象类的 servlet 框架,则可以使用相同的方法。例如,如果您使用的是 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()
以查询数据存储区并返回数据表。
以下三个示例说明了如何实现 capability:AdvancedExampleServlet
、AdvancedExampleServlet2
和 SqlDataSourceServlet
。所有这些都在 example
软件包中。定义功能和事件流对 AdvancedExampleServlet2
进行了介绍。
自定义事件流
DataSourceHelper.executeDataSourceServletFlow
中定义了默认事件流。默认流程如下:
- 提取和解析查询参数。
- (仅限访问限制模式)验证请求是否与 servlet 来自同一网域。
- 解析请求以创建两个查询对象:数据源查询和完成查询。将数据源查询传递给
generateDataTable()
实现。 - 您的
generateDataTable()
实现会生成一个数据表。 - 针对在第 5 步中生成的数据表运行完成查询。
- 将数据表渲染为可视化图表指定的格式,并设置 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 环境的类和帮助程序函数。其中包括 Query
和 DataTable
类以及一些 DataSourceHelper
函数,如 parseQuery
、applyQuery
、validateQuery
和 splitQuery
。您可以使用这些类和函数执行以下操作:
- 解析可视化查询。
- 将查询拆分为数据源查询和完成查询。
- 运行完成查询以生成数据表。
- 以
HTML
、CSV
或JSON
格式将数据表返回到可视化图表。