このセクションでは、AdvancedExampleServlet2
について説明します。AdvancedExampleServlet2
は、機能とイベントのフローを定義するデータソース実装の例です。また、AdvancedExampleServlet2
を実行してテストする方法についても説明します。
注: このセクションを開始する前に、スタートガイドを完了しておく必要があります。
AdvancedExampleServlet2
のご紹介
AdvancedExampleServlet2
クラスは examples
パッケージにあります。このクラスは、イベントの機能とフローを定義する実装例を提供します。
以降のセクションでは、AdvancedExampleServlet2
の最も重要な部分について説明します。
イベントのフローを定義する
AdvancedExampleServlet2
は、HttpServlet.doGet()
メソッドをオーバーライドし、DataSourceHelper
が提供するさまざまなヘルパー関数を呼び出すことによって、イベントのフローを定義します。
次のスニペットは doGet()
をオーバーライドします。HttpServletRequest
パラメータは、可視化によってサーブレットに送信されるリクエストをカプセル化します。HttpServletResponse
パラメータは、サーブレットからクエリの可視化へのレスポンスをカプセル化します。また、このスニペットでは dsRequest
が null に設定されています。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
オブジェクトからクエリを取得して、 2 つのクエリに分割します。一方のクエリはデータソースクエリと呼ばれ
もう一方は完了クエリと呼ばれますデータソースで宣言されている機能は 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
からのリクエスト パラメータを取得します。次に、このコードがサーブレットのレスポンスを設定します。サーブレット コンテナはこのレスポンスをクエリ ビジュアリゼーションに返します。
DataSourceHelper.setServletResponse(newData, dsRequest, resp);
エラーの処理
次のスニペット では、例外をキャッチして適切なメッセージを取得し、レスポンスをフォーマットして、サーブレットのレスポンスを設定します。dsRequest
が null の場合は、DataSourceRequest
を使用できません。これは、おそらくコンストラクタの失敗によるものです。この場合、DataSourceRequest
の代わりに HttpRequest
が使用されます。
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); } }
URL パラメータを使用する
次のスニペット は、クエリが分割されたときに作成されたデータソース クエリと HttpServletRequest
を取得します。HttpServletRequest
には、必要に応じて URL として指定された 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(); 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; }
次のスニペットは、クエリを受け取り、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; }
AdvancedExampleServlet2
の実行とテスト
このセクションでは、AdvancedExampleServlet2
を実行してテストする方法について説明します。
AdvancedExampleServlet2
を実行してテストするには、次のセクションで説明するように、ウェブ アプリケーションを更新し、データソースをクエリするビジュアリゼーションを設定します。
Apache Tomcat でのウェブ アプリケーションの更新
以下の手順に沿って、Apache Tomcat のウェブ アプリケーションを更新します。次の手順は、Windows システムの Apache Tomcat に固有のものです。
- 以前に
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>
- Tomcat を起動します。すでに実行中の場合は Tomcat を再起動します。
- 次のリンクをクリックします。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
サーブレット、planets
テーブル、select クエリ、棒グラフの可視化を指定しています。
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
に含まれるその他の可視化の説明については、外部データストアの使用をご覧ください。
可視化の指定方法とクエリ言語の使用方法について詳しくは、グラフの使用とクエリ言語リファレンスをご覧ください。
以下の手順に沿って、高度なデータソースによって提供されるデータを可視化します。
- まだ行っていない場合は、
all_examples.html
ファイルを<data_source_library_install>/examples/src/html
ディレクトリ
から<tomcat_home>/webapps/myWebApp/
ディレクトリにコピーします。
- ブラウザで http://localhost:8080/myWebApp/all_examples.html をクリックします。次のように表示されます。
次のステップ
ライブラリで提供されるサンプルの詳細については、クイック リファレンスの例をご覧ください。複雑なデータソースの実装について詳しくは、実装のヒントをご覧ください。