このセクションでは、ライブラリの複雑な実装の作成に役立つヒントをいくつか紹介します。
独自のサーブレットの使用
最も簡単なデータソース実装は、ライブラリの DataSourceServlet
クラスから継承されます。DataSourceServlet
以外のクラスから継承するには、次のようにデータソースを実装します。
-
DataTableGenerator
インターフェースを実装し、getCapabilities()
とgenerateDataTable()
をオーバーライドします。 - サーブレットのコード内から
DataSourceHelper.executeDataSourceServletFlow()
を呼び出して、データソース フローを実行します。このメソッドは、以下のパラメータを取ります。HttpServletRequest
オブジェクト。HttpServletResponse
オブジェクト。- 上記のステップ 1 の
DataTableGenerator
インターフェースの実装。 - 制限付きアクセスモードまたは制限なしアクセスモードを指定するブール値。
たとえば、組み込み認証を提供する AuthServlet
という別のサーブレット クラスからサーブレットを継承する場合は、次のように SimpleServletExample
を書き換えて、DataSourceServlet
ではなく AuthServlet
を継承するようにします。
-
DataTableGenerator
インターフェースを実装します。 -
generateDataTable()
をDataSourceServlet
実装からDataTableGenerator
実装に移動します。 -
DataTableGenerator
実装でgetCapabilities()
をオーバーライドしてCapabilities.None
を返します。 - サーブレット コード(
doGet()
またはdoPost()
)内からDataSourceHelper.executeDataSourceServletFlow()
を呼び出し、DataTableGenerator
実装を渡します。このメソッドは、データソースの結果をサーブレット レスポンスにレンダリングするなど、データソースのフロー全体を実行します。
サーブレット フレームワークを使用していて、通常はフレームワークが提供する抽象クラスを継承する場合も、同じ手法を使用できます。たとえば、WebWork を使用している場合は、ActionSupport
クラスを継承できます。
機能の定義
データストアに大量のデータがあり、データソースの効率を高める場合は、データストアのクエリ機能を使用できます。たとえば、データストアがデータベースで、データベースに多数の列があるとします。ビジュアリゼーションがこれらの列の一部のみをリクエストする場合は、データベース内で SELECT
オペレーションを実行する方が、すべての列を取得し、ライブラリのクエリ機能を使用して SELECT
を実行するよりも効率的です。SELECT
機能を実装するには、データベース内で SELECT
オペレーションを実行し、データテーブルを返すコードを記述します。
Capabilities
列挙型を使用して、コードが提供するクエリ機能を定義します。使用できるオプションは次のとおりです。
NONE
: デフォルト。コードではクエリ オペレーションは実行されません。SQL
: コードが SQL クエリ オペレーションを行います。SORT_AND_PAGINATION
: コードは、並べ替えとページ分割の両方のクエリ オペレーションを行います。SELECT
: コードは select オペレーションを行います。ALL
: コードでSQL
、SORT_AND_PAGINATION
、SELECT
オペレーションを提供します。
注: いずれの場合も、ライブラリはコードで提供されていないクエリ オペレーションを処理します。
NONE
以外の機能を実装するには、Capabilities.getCapabilities()
をオーバーライドして、データストアにクエリを実行し、データテーブルを返す DataTable.generateDataTable()
を実装します。
3 つの例は、AdvancedExampleServlet
、AdvancedExampleServlet2
、SqlDataSourceServlet
の 3 つの機能の実装方法を示しています。すべて example
パッケージに含まれています。AdvancedExampleServlet2
については、機能とイベントフローの定義で説明します。
イベントフローのカスタマイズ
イベントのデフォルトのフローは DataSourceHelper.executeDataSourceServletFlow
で定義されています。デフォルトのフローは次のとおりです。
- クエリ パラメータを抽出、解析する。
- 制限付きアクセスモードの場合のみ、リクエストがサーブレットと同じドメインから発信されていることを確認します。
- リクエストを解析して、データソース クエリと完了クエリの 2 つのクエリ オブジェクトを作成します。データソースクエリを
generateDataTable()
の実装に渡します。 generateDataTable()
の実装では、データテーブルが生成されます。- ステップ 5 で生成したデータテーブルで完了クエリを実行します。
- ビジュアリゼーションで指定された形式にデータテーブルをレンダリングし、サーブレット レスポンスを設定します。
独自のイベントのフローを指定するには、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
クラスと、parseQuery
、applyQuery
、validateQuery
、splitQuery
などの一部の DataSourceHelper
関数が含まれます。これらのクラスと関数を使用して、次のことができます。
- 可視化クエリを解析します。
- クエリをデータソース クエリと完了クエリに分割します。
- 完了クエリを実行してデータテーブルを生成します。
- データテーブルを、
HTML
、CSV
、またはJSON
形式のビジュアリゼーションに戻します。