Menentukan Kemampuan dan Alur Peristiwa

Bagian ini memperkenalkan AdvancedExampleServlet2. AdvancedExampleServlet2 adalah contoh penerapan sumber data yang menentukan kemampuan dan alur peristiwa. Bagian ini juga memberikan petunjuk langkah demi langkah tentang cara menjalankan dan menguji AdvancedExampleServlet2.

Catatan: Anda harus menyelesaikan bagian Memulai sebelum memulai bagian ini.

Memperkenalkan AdvancedExampleServlet2

Class AdvancedExampleServlet2 terletak dalam paket examples. Class ini menyediakan contoh implementasi yang menentukan kemampuan dan alur peristiwa.

Bagian terpenting dari AdvancedExampleServlet2 dijelaskan di bagian berikut:

Menentukan alur peristiwa

AdvancedExampleServlet2 menentukan alur peristiwa dengan mengganti metode HttpServlet.doGet() dan memanggil berbagai fungsi bantuan yang disediakan oleh DataSourceHelper.

Cuplikan berikut mengganti doGet(). Parameter HttpServletRequest mengenkapsulasi permintaan yang dibuat oleh visualisasi ke servlet. Parameter HttpServletResponse merangkum respons dari servlet terhadap visualisasi kueri. Cuplikan ini juga menetapkan dsRequest ke null. dsRequest digunakan pada berbagai titik di sepanjang kode.

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

Cuplikan berikut mengekstrak parameter permintaan dari HttpServletRequest untuk membuat konteks tempat permintaan berjalan.

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

Cuplikan berikut mengambil kueri dari objek dsRequest dan membaginya menjadi dua kueri terpisah. Satu kueri disebut kueri sumber data, kueri lainnya disebut kueri penyelesaian. Karena kemampuan sumber data yang dideklarasikan adalah SELECT, kueri sumber data terdiri dari operasi SELECT jika objek dsRequest menyertakan operasi SELECT. Kueri penyelesaian terdiri dari semua operasi lain yang diperlukan oleh permintaan, yang mungkin juga mencakup operasi SELECT. Misalnya, jika kueri yang diminta adalah SELECT a ORDER BY b, kueri sumber data akan menjadi SELECT a, b dan kueri penyelesaiannya akan sama dengan kueri asli SELECT a ORDER BY b.

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

Cuplikan berikut mengambil kueri sumber data yang dibuat oleh cuplikan sebelumnya dan HttpServletRequest, serta membuat tabel data. Lihat bagian Menggunakan kemampuan untuk mengetahui detail selengkapnya.

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

Kode berikut mengambil kueri penyelesaian yang dihasilkan saat kueri dibagi, tabel data yang dihasilkan oleh cuplikan sebelumnya, dan lokal pengguna dari visualisasi kueri. Kode kemudian membuat tabel data baru.

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

Kode berikut mengambil tabel data yang dihasilkan oleh cuplikan sebelumnya, dan parameter permintaan dari HttpServletRequest. Kode kemudian menetapkan respons servlet. Container servlet menampilkan respons ini pada visualisasi kueri.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Menangani error

Cuplikan berikut menangkap pengecualian, mendapatkan pesan yang sesuai, memformat respons, dan menetapkan respons servlet. Jika dsRequest null, DataSourceRequest tidak akan tersedia, mungkin karena kegagalan konstruktor. Dalam hal ini, HttpRequest digunakan, bukan 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);
      }
    }

Menggunakan parameter URL

Cuplikan berikut mengambil kueri sumber data yang dibuat saat kueri dipisah dan HttpServletRequest. HttpServletRequest secara opsional dapat menyertakan parameter tableId yang ditentukan sebagai URL. Parameter tableId ini menentukan tabel data mana yang ditampilkan sebagai berikut:

  • Jika parameter tableId dihilangkan, atau jika selain planets, sumber data akan menampilkan tabel data hewan.
  • Jika parameter tableId ditentukan sebagai planets, sumber data akan menampilkan tabel data planet.

Saat menulis kode untuk menampilkan tabel data, Anda memutuskan parameter mana yang akan diambil.

  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);
  }

Menggunakan kemampuan

Cuplikan berikut mengambil kueri dan membuat tabel data 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;
}

Cuplikan berikut mengambil kueri dan membuat tabel 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;
}

Menjalankan dan Menguji AdvancedExampleServlet2

Bagian ini memberikan petunjuk tentang cara menjalankan dan menguji AdvancedExampleServlet2.

Untuk menjalankan dan menguji AdvancedExampleServlet2, update aplikasi web Anda, lalu siapkan visualisasi yang mengkueri sumber data, seperti yang dijelaskan di bagian berikut:

Memperbarui Aplikasi Web di Apache Tomcat

Ikuti atau sesuaikan petunjuk di bawah untuk mengupdate aplikasi web Anda di Apache Tomcat. Petunjuk ini khusus untuk Apache Tomcat di sistem Windows:

  1. File web.xml yang sebelumnya Anda salin ke direktori WEB-INF sudah berisi definisi dan pemetaan yang diperlukan untuk contoh ini. Baris yang menjelaskan hal ini adalah:

    <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. Mulai Tomcat, atau mulai ulang Tomcat jika sudah berjalan.
  3. Klik link berikut:http://localhost:8080/myWebApp/advanced
    Layar menampilkan 6-7 baris teks, bergantung pada lebar layar Anda. Teks diawali dengan google.visualization.Query.setResponse dan diakhiri dengan {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    Ini adalah respons yang dikirim sumber data CSV contoh ke visualisasi.

Menggunakan Visualisasi untuk Melihat Data

File all_examples.html dalam direktori <data_source_library_install>/examples/src/html dapat digunakan untuk melihat visualisasi data.

Cuplikan berikut dari all_examples menentukan servlet advanced, tabel planets, kueri tertentu, dan visualisasi diagram batang.

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

Untuk penjelasan tentang visualisasi lain yang disertakan dalam all_examples.html, lihat bagian Menggunakan Penyimpanan Data Eksternal.

Untuk informasi selengkapnya tentang cara menentukan visualisasi dan menggunakan bahasa kueri, lihat Menggunakan Diagram dan Referensi Bahasa Kueri.

Ikuti atau adaptasikan petunjuk di bawah untuk melihat visualisasi data yang disediakan oleh sumber data lanjutan:

  1. Jika Anda belum melakukannya, salin file all_examples.html dari direktori <data_source_library_install>/examples/src/html
    ke direktori <tomcat_home>/webapps/myWebApp/.
     
  2. Klik link berikut: http://localhost:8080/myWebApp/all_examples.html di browser. Anda akan melihat kode berikut:

Langkah Berikutnya

Untuk mempelajari lebih lanjut contoh yang disediakan bersama library, lihat Contoh Referensi Cepat. Untuk mempelajari penerapan sumber data yang kompleks lebih lanjut, lihat Tips Penerapan.