このセクションでは、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 つのクエリに分割しています。1 つのクエリはデータソース クエリと呼ばれ、もう 1 つは完了クエリと呼ばれます。データソースで宣言されている機能は 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 のリンクをクリックします。次のように表示されます。
次のステップ
ライブラリに用意されている例の詳細については、例のクイック リファレンスをご覧ください。複雑なデータソースの実装の詳細については、実装のヒントをご覧ください。