データ ソース

 

Platform 4.2+ およびデータフレームワークプラグインが必要

 

データ ソースの概要
データ ソースは、クエリ文字列に基づいてオブジェクトおよびデータセットを供給できるオブジェクトです。
データ フレームワークプラグインには現在、ドキュメント データ ソースとオブジェクト データ ソースという 2 つのデータ ソースが付属しています。詳細については、「用意されているタグ」を参照してください。
また、開発者は独自のデータソースを作成することもできます。詳細については、「データ ソースの作成」を参照してください。

Supplied Tags

 

データを取得するビルド済みコンポーネント

 


Nexaweb 4.2.x には、次のビルド済みデータソースタグが用意されています。

 

  • <documentDataSource> - XML ドキュメントとクエリ用の XPath に基づきます。
  • <objectDataSource> - オブジェクト階層と OGNL に基づきます。

 

documentDataSource タグ

 


documentDataSource タグは、XML ドキュメントをラップし、XPath を使用してバインディングターゲットにデータを提供するデータソースを提供します。このデータ ソースは、XML ドキュメントが次のように変更されたときにバインディングターゲットでデータを自動的に更新するように構成することができます。

 

  • XML ドキュメントで使用可能な属性が変更された
  • XML ドキュメントの構造が変更された

 

documentDataSource は、ストアドクエリを再実行することによってデータを更新します。

 


documentDataSource タグには次の属性が含まれています。

 

属性
説明
必須/省略可能
source
データの場所へのパスです。次のフォーマットのいずれかを使用します。
  • 絶対 HTTP URL (ドキュメントを出力ストリームに書き込む静的ページまたは動的ページ)。
    たとえば、http://localhost:9090/myPage
  • 相対 HTTP URL (ドキュメントを出力ストリームに書き込む静的ページまたは動的ページ)。
    たとえば、../../mypage (このページがロードされた場所に対して相対的)。
  • コンテナパス document://myDoc。myDoc は、既存の登録済みドキュメントの名前です。
  • コンテナ パスとメソッドの呼び出し。
    たとえば、mco://myMco.getMyDocument()。メソッドは、データソースでラップされた com.nexaweb.xml.Document オブジェクトを返す必要があります。myMco が Null であるか、メソッドチェーンの結果が Null である場合は、DataAccessException がスローされます。
デフォルトは Null です。
メモ:ソースを指定しない場合は、後でプログラマチックにソースを設定する必要があります。
省略可能
id
システム全体で一意な値を使用し、データ ソースを一意に識別します。
必須
documentName
sourceから取得したソースドキュメントを DocumentRegistry に登録します。
この属性は、本質的に loadDocumentFromUrl(sourceUrl, documentName) の呼び出しと同じになります。
documentDataSourceタグで source を指定していない場合、documentName属性は無効になります。
プログラマチックに source を設定し、ドキュメントを DocumentRegistry に登録するには、次の API メソッドのいずれかを使用します。
  • setSource(Document doc, String documentName)
  • loadDocumentFromUrl(String sourceUrl, String documentName)
    同じ名前のドキュメントがすでに documentName 名で登録されている場合は、そのドキュメントが登録解除されます。
省略可能
refreshOnAttributeChange
ソース ドキュメントの任意の要素で属性変更イベントが発生したときに、データ ソースを更新するかどうかを指定します。
値: true または false
デフォルト: true
省略可能
refreshOnStructureChange
ソース ドキュメントの任意の要素で構造変更イベントが発生したときに、データ ソースを更新するかどうかを指定します。
値: true または false
デフォルト: true
省略可能

 


次の表に、documentDataSource API に含まれているメソッドについての説明を示します。

 

メソッド
説明
refresh()
すべてのワン ウェイ バインディングを強制的に再解決します。
loadDocumentFromUrl(String sourceUrl)
DocumentDataSource インスタンス内で、古いドキュメントを新しいドキュメントで置き換えます。
loadDocumentFromUrl(String sourceUrl,String documentName)
古いドキュメントを新しいドキュメントで置き換え、新しいドキュメントを DocumentRegistry に登録します。
同じ名前のドキュメントがすでに登録されている場合は、まずそのドキュメントが登録解除されます。
refreshOnStructureChange が true に設定されている場合は、refresh() が自動的に呼び出されます。
setSource(Document newDoc)
DocumentDataSource のソースを newSourceDocument に設定します。
refreshOnStructureChange が true に設定されている場合は、refresh() が自動的に呼び出されます。
setSource(Document newDoc, String documentName)
ソースの Document を新しい値に設定し、それを指定した名前で DocumentRegistry に登録します。
同じ名前のドキュメントがすでに登録されている場合は、まずそのドキュメントが登録解除されます。
refreshOnStructureChange が true に設定されている場合は、refresh() が自動的に呼び出されます。
getDocument()
DocumentDataSource インスタンスのソースの Document を返します。
setRefreshOnAttributeChange(boolean)
DocumentDataSource インスタンスの refreshOnAttributeChange の値を設定します。
setRefreshOnStructureChange(boolean)
DocumentDataSource インスタンスの refreshOnStructureChange の値を設定します。
getRefreshOnAttributeChange()
refreshOnAttributeChange のブール型の値を返します。
getRefreshOnStructureChange()
refreshOnStructureChange のブール型の値を返します。

 

ObjectDataSource タグ

 


ObjectDataSource タグは、アクセスするデータを表す Java オブジェクトをラップします。データには、Java オブジェクトのデータにアクセスするためのクエリ言語である OGNL (Object Graph Navigation Language) を使用してアクセスできます。用意されている ObjectDataSource タグをそのまま使用することも、このタグを拡張することもできます。たとえば、WebService の呼び出しの結果をラップするように ObjectDataSource を拡張することが可能です。

 


ObjectDataSource タグには次の属性が含まれています。

 

属性
説明
必須/省略可能
source
ラップするオブジェクトへのパスを指定します。次のフォーマットのいずれかを使用してパスを指定します。
  • 絶対 HTTP URL。直列化されたオブジェクトを出力ストリームに書き込むページへのパスです。オブジェクトのクラスは、クライアントのクラスパス上に存在している必要があります。たとえば、http://host/myapp/getObject.jsp のように指定します。
  • 相対 HTTP URL。たとえば、/getObject.jsp (ルートコンテキストに対して相対的) または getObject.jsp (データソースをロードしたページに対して相対的) のように指定します。
  • コンテナ パス。たとえば、mco://myMco のように指定します (myMco が存在しない場合、DataAccessException がスローされます)。コンテナ パスとメソッドの呼び出し。たとえば、mco://myMco.getFoo().getBar() のように指定します。メソッドチェーンではオブジェクトを返す必要があります。データソースはそのオブジェクトをラップします。myMco が Null であるか、メソッドチェーンの結果が Null である場合は、DataAccessException がスローされます。
省略可能
id
システム全体で一意な値を使用し、データ ソースを一意に識別します。
必須
refreshOnPropertyChange
ソース オブジェクトでプロパティ変更イベントが発生したときに、データ ソースを更新するかどうかを指定します。
データ ソースの更新を有効にするには、次の操作を行う必要があります。
  • この属性を true に設定する。
  • ソースオブジェクトで、PropertyChangeListener インスタンスを追加および削除するための次のパブリックメソッドを含める。
    • public void addPropertyChangeListener(PropertyChangeListener)
    • public void removePropertyChangeListener(PropertyChangeListener)
値: true または false
デフォルト: true
省略可能

 


次の表に、ObjectDataSource API に含まれているメソッドについての説明を示します。

 

メソッド
説明
refresh()
すべてのワン ウェイ バインディングを強制的に再解決します。
loadObjectFromUrl(String sourceUrl)
オブジェクトを sourceUrl から取得し、そのオブジェクトを新しいソースとして設定します。
setSource(Object newSource)
ObjectDataSource のソースを newSource オブジェクトに変更します。
getObject()
この DataSource のソースオブジェクトを返します。
setRefreshOnPropertyChange(boolean)
refreshOnPropertyChange 属性を設定します。
getRefreshOnPropertyChange()
refreshOnPropertyChange 属性の値 (ブール型) を返します。

 

OGNL(オブジェクトグラフナビゲーション言語)

 


OGNL は、Java オブジェクトのプロパティを取得および設定するための式言語です。プロパティの値の取得と設定では、同じ式を使用します。

 


Nexaweb には、JDK 1.1 に準拠した OGNL のバージョンが用意されています。つまり、使用できるのは JDK 1.1 に準拠した OGNL 文法および実装クラスのみです。アプリケーションが JDK 1.2 以上のバージョンに準拠したブラウザのみで実行されることがわかっている場合、Nexaweb OGNL を独自の OGNL バージョンで置き換え、そのバージョンがサポートするすべての文法と実装クラスを使用することができます。OGNL の詳細については、opensymphony.com/ognl/ を参照してください。

 


シンタックス

 


Nexaweb には、OGNL 式を使用してプロパティの値を取得するための次のメソッドが用意されています。

 


Ognl.getValue( String expression, Object root )

 


この式において、String expression は OGNL クエリ文字列を表し、
Object root はオブジェクトツリーのルート (XPath のコンテキストに似ています) を表します。

 


クエリ文字列の式の例:

 


次の例では、ルートオブジェクトは整数型インスタンスフィールド bar と、Vector 型インスタンスフィールド myVector を持っています。プライベートフィールドがある場合、OGNL は自動的に getX() メソッドと setX() メソッドを検索します。

 


メモ: これらの式の例は、OGNL の機能の一部を示しているにすぎません。完全な文法では、はるかに多くの処理をサポートしています。

 

説明
"bar"
bar 変数の値を返します。
"bar=10"
変数を 10 に設定します。
"myVector.addElement(new Integer( bar ))"
整数型の値 bar を myVector に追加します。
"myVector.{delegate()}"
myVector に含まれている各要素で delegate() メソッドを呼び出し、それらの呼び出しの戻り値を含む新しい一覧を返します。
  

 

 

 

Creating a Data Source

 

データを提供するモジュールの定義

 


Nexaweb は、データバインディングフレームワークの一部として、独自のカスタムデータソースを実装する能力を提供します。たとえば、独自の機能を実装して、データ ベースからデータをロードしたり、オブジェクトのカスタムセットへのアクセスを提供したりできます。データソースの機能を実装するには、API セクションで定義されている必須インターフェイス (com.nexaweb.plugin.data.datasource.DataSource) を実装する必要があります。

 


Nexaweb には、定義済みのdataSourceタグが付属しています。このタグを使用し、実装するインターフェイスにデータを提供することができます。それには、実装のクラスを dataSource タグの属性として指定します。

 

属性
説明
必須/省略可能
id
データ ソースを一意に識別します。開発者は、システム全体で一意な値を指定するよう注意する必要があります。
必須
class
データ ソースの実装を識別します。
必須

 


さらに、開発者は独自のデータ ソース タグ定義を作成することもできます。

 

クエリ文字列/選択文

 


各データソースでは、取得するデータの データソース内における位置を示すクエリ文字列を理解する必要があります。たとえば、documentDataSource では XPath クエリ文字列を使用して、XML ドキュメントからノードを取得します。データ取得のためのシンタックスを定義するのは、データソースの実装者の役目です。

 


 


次の例は、ハイバネートオブジェクトをロードし、hibernateDataSource タグに対してカスタム タグ ハンドラを使用するカスタム データ ソース タグを示しています。データソースはハイバネートに基づいています。

<hibenateDataSource id="customers" sourceUrl="hibernateServlet"/>