本部分将介绍一些可帮助您编写更复杂的库实现的提示:
使用自己的 Servlet
最简单的数据源实现继承自库的 DataSourceServlet
类。
如需从 DataSourceServlet
以外的类继承,请按以下方式实现数据源:
- 实现
DataTableGenerator
接口并替换getCapabilities()
和generateDataTable()
。 - 从 servlet 的代码调用
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()
以查询数据存储区并返回数据表。
以下三个示例说明了如何实现 AdvancedExampleServlet
、AdvancedExampleServlet2
和 SqlDataSourceServlet
功能。全部位于 example
软件包中。定义功能和事件流中讨论了 AdvancedExampleServlet2
。
自定义事件流
事件的默认流程在 DataSourceHelper.executeDataSourceServletFlow
中定义。默认流程如下所示:
- 提取和解析查询参数。
- 仅适用于受限访问模式,验证请求是否来自与 servlet 相同的网域。
- 解析创建两个查询对象的请求:数据源查询和完成查询。将数据源查询传递给
generateDataTable()
实现。 - 您的
generateDataTable()
实现会生成一个数据表。 - 对在第 5 步生成的数据表运行完成查询。
- 以可视化图表指定的格式渲染数据表并设置 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 环境的类和辅助函数。这其中包括 Query
和 DataTable
类以及一些 DataSourceHelper
函数,例如 parseQuery
、applyQuery
、validateQuery
和 splitQuery
。您可以使用这些类和函数执行以下操作:
- 解析可视化查询。
- 将查询拆分为数据源查询和完成查询。
- 运行完成查询以生成数据表。
- 将数据表返回到
HTML
、CSV
或JSON
格式的可视化图表。