実装のヒント

このセクションでは、ライブラリの複雑な実装の作成に役立つヒントをいくつか紹介します。

独自のサーブレットの使用

最も簡単なデータソース実装は、ライブラリの DataSourceServlet クラスから継承されます。DataSourceServlet 以外のクラスから継承するには、次のようにデータソースを実装します。

  1. DataTableGenerator インターフェースを実装し、getCapabilities()generateDataTable() をオーバーライドします。
  2. サーブレットのコード内から DataSourceHelper.executeDataSourceServletFlow() を呼び出して、データソース フローを実行します。このメソッドは、以下のパラメータを取ります。
    • HttpServletRequest オブジェクト。
    • HttpServletResponse オブジェクト。
    • 上記のステップ 1 の DataTableGenerator インターフェースの実装。
    • 制限付きアクセスモードまたは制限なしアクセスモードを指定するブール値。

たとえば、組み込み認証を提供する AuthServlet という別のサーブレット クラスからサーブレットを継承する場合は、次のように SimpleServletExample を書き換えて、DataSourceServlet ではなく AuthServlet を継承するようにします。

  1. DataTableGenerator インターフェースを実装します。
  2. generateDataTable()DataSourceServlet 実装から DataTableGenerator 実装に移動します。
  3. DataTableGenerator 実装で getCapabilities() をオーバーライドして Capabilities.None を返します。
  4. サーブレット コード(doGet() または doPost())内から DataSourceHelper.executeDataSourceServletFlow() を呼び出し、DataTableGenerator 実装を渡します。このメソッドは、データソースの結果をサーブレット レスポンスにレンダリングするなど、データソースのフロー全体を実行します。

サーブレット フレームワークを使用していて、通常はフレームワークが提供する抽象クラスを継承する場合も、同じ手法を使用できます。たとえば、WebWork を使用している場合は、ActionSupport クラスを継承できます。

機能の定義

データストアに大量のデータがあり、データソースの効率を高める場合は、データストアのクエリ機能を使用できます。たとえば、データストアがデータベースで、データベースに多数の列があるとします。ビジュアリゼーションがこれらの列の一部のみをリクエストする場合は、データベース内で SELECT オペレーションを実行する方が、すべての列を取得し、ライブラリのクエリ機能を使用して SELECT を実行するよりも効率的です。SELECT 機能を実装するには、データベース内で SELECT オペレーションを実行し、データテーブルを返すコードを記述します。

Capabilities 列挙型を使用して、コードが提供するクエリ機能を定義します。使用できるオプションは次のとおりです。

  • NONE: デフォルト。コードではクエリ オペレーションは実行されません。
  • SQL: コードが SQL クエリ オペレーションを行います。
  • SORT_AND_PAGINATION: コードは、並べ替えとページ分割の両方のクエリ オペレーションを行います。
  • SELECT: コードは select オペレーションを行います。
  • ALL: コードで SQLSORT_AND_PAGINATIONSELECT オペレーションを提供します。

: いずれの場合も、ライブラリはコードで提供されていないクエリ オペレーションを処理します。

NONE 以外の機能を実装するには、Capabilities.getCapabilities() をオーバーライドして、データストアにクエリを実行し、データテーブルを返す DataTable.generateDataTable() を実装します。

3 つの例は、AdvancedExampleServletAdvancedExampleServlet2SqlDataSourceServlet の 3 つの機能の実装方法を示しています。すべて example パッケージに含まれています。AdvancedExampleServlet2 については、機能とイベントフローの定義で説明します。

イベントフローのカスタマイズ

イベントのデフォルトのフローは DataSourceHelper.executeDataSourceServletFlow で定義されています。デフォルトのフローは次のとおりです。

  1. クエリ パラメータを抽出、解析する。
  2. 制限付きアクセスモードの場合のみ、リクエストがサーブレットと同じドメインから発信されていることを確認します。
  3. リクエストを解析して、データソース クエリと完了クエリの 2 つのクエリ オブジェクトを作成します。データソースクエリを generateDataTable() の実装に渡します。
  4. generateDataTable() の実装では、データテーブルが生成されます。
  5. ステップ 5 で生成したデータテーブルで完了クエリを実行します。
  6. ビジュアリゼーションで指定された形式にデータテーブルをレンダリングし、サーブレット レスポンスを設定します。

独自のイベントのフローを指定するには、datasource.DataSourceHelper のヘルパー関数を呼び出します。実装例については、機能とイベントフローの定義をご覧ください。

DataTableGenerator.generateDataTable にパラメータを渡す

HttpServletRequest.setAttribute を使用して、クエリまたは HttpServletRequest オブジェクトの一部ではないデータを DataTableGenerator.generateDataTable に渡すことができます。サンプルコードを以下に示します。

サーブレットのコード内で、渡すオブジェクトを次のように HttpServletRequest に渡します。

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

dataTableGenerator インターフェースの実装で、次のように HttpServletRequest からオブジェクトを取得します。

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

非サーブレット データソースの実装

サーブレットを使用せずにライブラリを実装する場合は、サーブレット環境を必要としないクラスとヘルパー関数のみを使用できます。これには、Query クラスと DataTable クラスと、parseQueryapplyQueryvalidateQuerysplitQuery などの一部の DataSourceHelper 関数が含まれます。これらのクラスと関数を使用して、次のことができます。

  • 可視化クエリを解析します。
  • クエリをデータソース クエリと完了クエリに分割します。
  • 完了クエリを実行してデータテーブルを生成します。
  • データテーブルを、HTMLCSV、または JSON 形式のビジュアリゼーションに戻します。