定義功能與事件流程

本節介紹 AdvancedExampleServlet2AdvancedExampleServlet2 是定義實作和事件流程資料來源的資料來源實作範例。本節也會提供如何執行及測試 AdvancedExampleServlet2 的逐步操作說明。

注意:您必須先完成「開始使用」部分,才能開始填寫本節內容。

隆重推出 AdvancedExampleServlet2

AdvancedExampleServlet2 類別位於 examples 套件中。此類別提供定義事件功能和流程的實作範例。

以下各節將說明 AdvancedExampleServlet2 最重要的部分:

定義事件流程

AdvancedExampleServlet2 會覆寫 HttpServlet.doGet() 方法並呼叫 DataSourceHelper 提供的各種輔助函式,藉此定義事件流程。

以下程式碼片段會覆寫 doGet()HttpServletRequest 參數會將視覺化視覺化的要求封裝至 Webhook。HttpServletResponse 參數會封裝從 Webhook 到查詢視覺化的回應。這段程式碼也會將 dsRequest 設為空值。dsRequest 會用在程式碼其餘部分的不同時間點。

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

下列程式碼片段會從 HttpServletRequest 擷取要求參數,建立執行要求的結構定義。

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

以下程式碼片段從 dsRequest 物件和將查詢分割為兩個不同的查詢。一個查詢稱為資料來源查詢,另一個則代表完成查詢。由於資料來源的宣告功能為 SELECT,因此如果 dsRequest 物件包含 SELECT 作業,資料來源查詢就會包含 SELECT 作業。完成查詢包含要求所需的所有其他作業,也可能包含 SELECT 作業。舉例來說,如果要求的查詢為 SELECT a ORDER BY b,則資料來源查詢會是 SELECT a, b,而完成的查詢將與原始查詢 SELECT a ORDER BY b 相同。

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

以下程式碼片段會使用上一個程式碼片段和 HttpServletRequest, 建立的資料來源查詢,並建立資料表。詳情請參閱使用功能一節。

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

以下程式碼包含分割查詢時產生的完成查詢、前一個程式碼片段產生的資料資料表,以及查詢視覺化產生的使用者語言代碼。接著,程式碼會建立新的資料表。

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

以下程式碼是使用上一個程式碼片段產生的資料表,以及 HttpServletRequest 的要求參數。接著,程式碼會設定 Webhook 回應。bq 容器會將此回應傳回至查詢視覺化。

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

處理錯誤

以下程式碼片段擷取例外狀況、取得適當的訊息、設定回應格式,並設定 Webhook 回應。如果 dsRequest 為空值,就可能無法使用 DataSourceRequest,原因可能是建構函式失敗。在此情況下,系統會使用 HttpRequest 而非 DataSourceRequest

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

使用網址參數

以下程式碼片段會使用在查詢分割時建立的資料來源查詢,以及 HttpServletRequestHttpServletRequest 您可以視需要納入指定為網址的 tableId 參數。這個 tableId 參數會決定傳回的資料表如下:

  • 如果缺少 tableId 參數或不是 planets,則資料來源會傳回動物資料表。
  • 如果 tableId 參數指定為 planets,資料來源就會傳回行星資料表。

當您編寫自己的程式碼傳回資料表時,您可以決定要使用哪些參數。

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

使用功能

下列程式碼片段會擷取查詢並產生 animals 資料表。

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

下列程式碼片段會擷取查詢並產生 planets 資料表。

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

執行及測試 AdvancedExampleServlet2

本節提供執行 AdvancedExampleServlet2 測試及測試的操作說明。

如要執行並測試 AdvancedExampleServlet2,請更新網頁應用程式,並設定會查詢資料來源的視覺化圖表,如以下各節所述:

更新 Apache Tomcat 中的網頁應用程式

請按照下列操作說明或調整,以更新 Apache Tomcat 中的網頁應用程式。以下操作說明僅適用於 Windows 系統上的 Apache Tomcat:

  1. 您之前複製到 WEB-INF 目錄的 web.xml 檔案已包含本範例所需的定義和對應。定義上述內容的程式碼行如下:

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. 啟動 Tomcat,或如果 Tomcat 已在執行中,請重新啟動。
  3. 點選以下連結:http://localhost:8080/myWebApp/advanced
    系統會根據螢幕寬度顯示 6 到 7 行文字。 文字開頭為 google.visualization.Query.setResponse ,結尾為 {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    這是 CSV 資料來源範例以視覺化方式呈現的回應。

使用視覺化功能查看資料

<data_source_library_install>/examples/src/html 目錄中的 all_examples.html 檔案可用來查看資料圖表。

以下 all_examples 程式碼片段指定 advanced Webhook、planets 資料表、選取查詢和長條圖。

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

如需 all_examples.html 中包含的其他視覺化說明,請參閱「使用外部資料儲存區」一節。

如要進一步瞭解如何指定視覺化並使用查詢語言,請參閱「使用圖表」和「查詢語言參考資料」。

請按照下列操作說明,或調整進階資料來源提供的資料視覺化:

  1. 如果您尚未將 all_examples.html 檔案從 <data_source_library_install>/examples/src/html 目錄
    複製到 <tomcat_home>/webapps/myWebApp/ 目錄,請先完成這項操作。
     
  2. 在瀏覽器中按一下下列連結:http://localhost:8080/myWebApp/all_examples.html。您應該會看到以下內容:

後續步驟

如要進一步探索程式庫提供的範例,請參閱範例快速參考範例。如要進一步瞭解如何導入複雜的資料來源,請參閱導入提示