このセクションでは、ライブラリのより複雑な実装を記述する場合に役立つヒントについて説明します。
- 独自のサーブレットの使用
- 機能の定義
- イベントのフローをカスタマイズする
DataTableGenerator.generateDataTableにパラメータを渡す- 非サーブレット データソースの実装
独自のサーブレットの使用
最もシンプルなデータソース実装は、ライブラリの 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: コードで選択オペレーションが提供されます。ALL: コードでSQL、SORT_AND_PAGINATION、SELECTオペレーションが提供されます。
注: いずれの場合も、ライブラリはコードで提供されていないクエリ オペレーションを処理します。
NONE 以外の機能を実装するには、Capabilities.getCapabilities() をオーバーライドして DataTable.generateDataTable() を実装し、データストアにクエリを実行してデータテーブルを返します。
3 つの例(AdvancedExampleServlet、AdvancedExampleServlet2、SqlDataSourceServlet)は、ケーパビリティの実装方法を示しています。すべて 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 クラスと、一部の DataSourceHelper 関数(parseQuery、applyQuery、validateQuery、splitQuery など)が含まれます。これらのクラスと関数を使用して、次のことができます。
- 可視化クエリを解析します。
- クエリをデータソース クエリと完了クエリに分割します。
- 補完クエリを実行してデータテーブルを生成します。
- データテーブルを
HTML、CSV、またはJSONの形式で可視化に返します。