本節會提供一些秘訣,協助您編寫更複雜的程式庫實作:
使用您自己的 Servlet
最簡單的資料來源實作會沿用程式庫的 DataSourceServlet
類別。若要沿用 DataSourceServlet
以外的類別,請按照下列方式實作資料來源:
- 實作
DataTableGenerator
介面並覆寫getCapabilities()
和generateDataTable()
。 - 從 Servlet 的程式碼呼叫
DataSourceHelper.executeDataSourceServletFlow()
以執行資料來源流程。此方法使用以下參數:HttpServletRequest
物件。HttpServletResponse
物件。- 您在上述步驟 1 中實作
DataTableGenerator
介面的實作。 - 用於指定受限或未限制存取模式的布林值。
舉例來說,如果您想繼承另一個提供內建驗證功能的 Servlet 類別 (稱為 AuthServlet
),可以重寫 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
格式傳回視覺化圖表。