導入訣竅

本節會提供一些秘訣,協助您編寫更複雜的程式庫實作:

使用您自己的 Servlet

最簡單的資料來源實作會沿用程式庫的 DataSourceServlet 類別。若要沿用 DataSourceServlet 以外的類別,請按照下列方式實作資料來源:

  1. 實作 DataTableGenerator 介面並覆寫 getCapabilities()generateDataTable()
  2. 從 Servlet 的程式碼呼叫 DataSourceHelper.executeDataSourceServletFlow() 以執行資料來源流程。此方法使用以下參數:
    • HttpServletRequest 物件。
    • HttpServletResponse 物件。
    • 您在上述步驟 1 中實作 DataTableGenerator 介面的實作。
    • 用於指定受限或未限制存取模式的布林值。

舉例來說,如果您想繼承另一個提供內建驗證功能的 Servlet 類別 (稱為 AuthServlet),可以重寫 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 格式傳回視覺化圖表。