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 untuk menjalankan dan menguji AdvancedExampleServlet2.

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

Memperkenalkan AdvancedExampleServlet2

Class AdvancedExampleServlet2 terletak dalam paket examples. Class ini memberikan 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 menggantikan doGet(). Parameter HttpServletRequest mengenkapsulasi permintaan yang dibuat oleh visualisasi ke servlet. Parameter HttpServletResponse mengenkapsulasi respons dari servlet ke visualisasi kueri. Cuplikan ini juga menetapkan dsRequest ke null. dsRequest digunakan di berbagai titik di seluruh kode lainnya.

  @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 dijalankan.

    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, dan kueri lainnya adalah 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 menyertakan operasi SELECT. Misalnya, jika kueri yang diminta adalah SELECT a ORDER BY b, kueri sumber data akan menjadi SELECT a, b dan kueri penyelesaian 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,, lalu membuat tabel data. Lihat bagian Menggunakan kemampuan untuk 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 lokalitas pengguna dari visualisasi kueri. Kode tersebut 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 tersebut kemudian menetapkan respons servlet. Penampung servlet menampilkan respons ini terhadap 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 bernilai null, DataSourceRequest tidak akan tersedia, yang mungkin terjadi karena kegagalan konstruktor. Dalam hal ini, yang digunakan adalah HttpRequest, 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 dibagi dan HttpServletRequest. Secara opsional, HttpServletRequest dapat menyertakan parameter tableId yang ditentukan sebagai URL. Parameter tableId ini menentukan tabel data mana yang ditampilkan sebagai berikut:

  • Jika parameter tableId dihilangkan, atau berupa apa pun 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 Anda sendiri untuk menampilkan tabel data, Anda dapat memutuskan parameter 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 menghasilkan 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 menghasilkan 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 cara menjalankan dan menguji AdvancedExampleServlet2.

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

Mengupdate Aplikasi Web di Apache Tomcat

Ikuti atau adaptasikan petunjuk di bawah ini untuk mengupdate aplikasi web 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 menentukan 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 akan menampilkan 6-7 baris teks, bergantung pada lebar layar Anda. Teks dimulai dengan google.visualization.Query.setResponse dan diakhiri dengan {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    Ini adalah respons yang dikirim contoh sumber data CSV 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 pilih, 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 sesuaikan, petunjuk di bawah ini 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 tampilan berikut:

Langkah Berikutnya

Untuk mempelajari lebih lanjut contoh yang disediakan dengan library, lihat Contoh Referensi Cepat. Untuk mempelajari lebih lanjut cara menerapkan sumber data yang kompleks, lihat Tips Penerapan.