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 selainplanets
, sumber data akan menampilkan tabel data hewan. - Jika parameter
tableId
ditentukan sebagaiplanets
, 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(); ListrequiredColumns = 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(); ListrequiredColumns = 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:
- File
web.xml
yang sebelumnya Anda salin ke direktoriWEB-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>
- Mulai Tomcat, atau mulai ulang Tomcat jika sudah berjalan.
- Klik link berikut:http://localhost:8080/myWebApp/advanced
Layar akan menampilkan 6-7 baris teks, bergantung pada lebar layar Anda. Teks dimulai dengangoogle.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:
- Jika Anda belum melakukannya, salin file
all_examples.html
dari direktori<data_source_library_install>/examples/src/html
ke direktori<tomcat_home>/webapps/myWebApp/
.
- 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.