この章の内容は次のとおりです。
Oracle XSQL Pagesパブリッシング・フレームワークは、XML情報を必要な任意の形式で容易に公開できる拡張可能なプラットフォームです。これにより、SQL、XMLおよびXSLTの機能を組み合せて、データベース情報に基づく動的なWebコンテンツの公開が大幅に簡略化されます。
XSQLパブリッシング・フレームワークを使用すると、SQLに精通した人なら誰でも、XSQLページと呼ばれる宣言テンプレートを作成および使用して次の操作を実行できます。
パラメータ化されたSQL問合せに基づいて、動的XMLデータグラムを作成します。
これらのデータ・ページを変換し、関連するXSLT変換を使用して、必要なXML、HTMLまたはテキストベース形式で最終結果を生成します。
公開する情報の作成および変換には、プログラミングは必要ありません。実際に一般に行われる操作のほとんどが宣言方式で簡単に実行できます。ただし、XSQLパブリッシング・フレームワークは拡張可能であるため、いずれかの組込み機能が要件に合わない場合は、Javaを使用してフレームワークを容易に拡張し、カスタム情報ソースを統合したり、サーバー側でカスタム処理を実行したりすることができます。
XSQL Pagesフレームワークを使用すると、公開する情報の作成工程と表示工程を明確に分離できます。この単純なアーキテクチャには、生産性における様々なメリットがあります。メリットは次のとおりです。
リクエストの発信元であるクライアント・デバイス(ブラウザ、携帯電話、PDAなど)の種類に合せて適切に表示を調整するなど、同じ情報を複数の方法で表示できます。
既存のページを新しいページに集約して、情報を簡単に再利用できます。
表示されている情報コンテンツを変更することなく、表示を修正および改善できます。
サーバー側のテンプレート(.xsql
の拡張であるためXSQLページと呼ばれる)を使用して、任意の形式ですべての情報を任意のデバイスに公開できます。XSQL Page Processor Engineは、XSQLページ・テンプレートのコンテンツを解析、キャッシュおよび処理します。図8-1に、コアであるXSQL Page Processor Engineが4つの異なる方法で実行できることを示します。
XSQLコマンドライン・ユーティリティを使用してコマンドラインまたはバッチで実行します。
任意のWebサーバーにインストールしたXSQLサーブレットを使用して、Web上で実行します。
<jsp:include>
を使用してテンプレートを挿入し、JSPアプリケーションの一部として実行します。
EngineのJava APIであるXSQLRequest
オブジェクトを使用してプログラム的に実行します。
これらのいずれかまたはすべてのシナリオで同じXSQLページ・テンプレートを使用できます。テンプレートが処理される方法を問わず、同じ基本手順で結果が生成されます。XSQL Page Processor Engineは次の操作を実行します。
XSQLテンプレートの処理リクエストを受信します。
1つ以上のSQL問合せの結果を使用して、XMLデータグラムを作成します。
このXMLデータグラムをリクエスタに戻します。
オプションで、データグラムをXML、HTMLまたはテキスト形式に変換します。
この処理の変換手順中に、W3CのXSLT 1.0標準に準拠するスタイルシートを使用して、作成されたデータグラムを次のようなドキュメント形式に変換できます。
HTML - ブラウザ表示用
WML - モバイル機器用
Scalable Vector Graphics(SVG)- データ・ドリブン・チャート、グラフおよびダイアグラム用
eXtensible Stylesheet Language Formatting Object(XSLFO)- Adobe PDF形式へのレンダリング用
テキスト・ドキュメント(電子メール、SQLスクリプト、Javaプログラムなど)
任意のXMLベースのドキュメント形式
XSQLページでは、基礎となるOracle XMLコンポーネントの使用を自動化することでこの機能を提供し、カスタム・プログラミングを行わずに多くの一般的な問題を解決します。ただし、カスタム・プログラミングのみが有効である場合(この章の高度なトピックの項を参照)、最初からパブリッシング・フレームワーク全体を作成せずに、フレームワークの組込みアクションとシリアライザを追加して、任意のカスタム・ソースからXSQLデータグラムを作成し、このデータグラムを必要な形式にシリアライズできます。
Oracle XSQL Pagesパブリッシング・フレームワークをコマンドラインから実行するには、Java VM(1.1.8、1.2.2または1.3)が必要です。XSQL Pagesパブリッシング・フレームワークは、Oracle XML Developer's Kitの基礎となる次の2つのコンポーネントに依存しています。
Oracle XML ParserおよびXSLT Processor(xmlparserv2.jar
)
Oracle XML SQL Utilityy(xsu12.jar
)
どちらのJavaアーカイブ・ファイルもXSQL Pagesフレームワークが実行しているCLASSPATHに存在する必要があります。ほとんどのXSQLページがデータベースに接続して公開用の情報に問合せを行うため、フレームワークもJDBCドライバに依存します。すべてのJDBCドライバがサポートされていますが、Oracelに接続する場合、機能とパフォーマンスを最大限に発揮するには、Oracle JDBCドライバ(classes12.jar
)の使用が最適です。
最後にXSQLパブリッシング・エンジンはその構成ファイル(デフォルトではXSQLConfig.xml
)をJavaリソースとして読み取るため、構成ファイルが置かれているディレクトリもCLASSPATHに含める必要があります。
WebパブリッシングにXSQL Pagesフレームワークを使用するには、JavaサーブレットをサポートするWebサーバーが必要です。
関連資料: 異なるWebサーバーへのXSQLサーブレットのインストール、環境の構成およびXSQLサーブレットの実行の詳細は、OTN(http://www.oracle.com/technology/tech/xml )にあるXSQLサーブレットのリリース・ノートを参照してください。
|
この項では、Oracle XSQLサーブレットを使用する際の、推奨されるセキュリティ方法について説明します。
XSQLConfig.xml
構成ファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれているため、サーバーの安全な場所に格納する必要があります。このファイルの格納場所は、Webサーバーの仮想パスにマップされるディレクトリおよびそのサブディレクトリ以外である必要があります。この構成ファイルに必要な読取り権限は、サーブレット・エンジンを所有するUNIXアカウントが読み取れる権限のみです。
この推奨事項に従わない場合、構成ファイルの内容がサイトのユーザーによって偶然または故意に参照される可能性が生じます。
XSQL Page Processorのデフォルト設定では、ユーザーが、リクエストで特殊なxml-stylesheet
パラメータの値を渡すことによって、スタイルシートを指定できるようになっています。サーバー側のXSQLページ内で参照しているスタイルシートを、使用される唯一のスタイルシートにするには、そのページのドキュメント要素にallow-client-style="no"
属性を挿入できます。XSQLConfig.xml
ファイルの設定を変更することで、デフォルト設定をグローバルに変更して、クライアントによるスタイルシートのオーバーライドを禁止することもできます。これを行う場合、クライアントによるスタイルシートのオーバーライドが許可されるのは、ドキュメント要素にallow-client-style="yes"
属性が挿入されているページのみとなります。
能力がある場合は責任も重大です。SQL問合せにおいて字句置換変数の使用をサポートする製品(XSQLページなど)では、開発者側の問題となる場合があります。SQL文の重要な部分(極端な場合はSQL文全体)を字句パラメータで置換するXSQLページをデプロイするときは、必ず不正使用に対する適切な予防措置をとる必要があります。
たとえば、XSQLページに付属しているデモの1つにadhoc query demoがあります。このデモでは、<xsql:query>
アクション・ハンドラのSQL文全体が、パラメータとしてどのように提供されているかが記述されています。これは適正に使用される場合は非常に有用な機能ですが、同じようなページを本番システムにデプロイする場合、ユーザーはこのページに関連付けられている接続に指定されたデータベース・セキュリティ権限の範囲内であればどんな問合せも実行できます。このデモはSCOTTアカウントにマップする接続を使用するように設定されているため、adhoc query demoのユーザーは、SCOTTがSQL*Plusコマンドラインから問合せできる任意のデータに問合せ可能です。
次の方法で、ページの不正使用を防ぐことができます。
ページに関連付けるデータベース・ユーザー・アカウントには、ユーザーに参照を許可する表およびビューの読取り権限のみを付与します。
SELECT
文で単一の値を置換する場合は、字句バインド変数ではなくバインド変数を使用します。SQL文の構文部分をパラメータ化する必要がある場合、字句パラメータを使用することが唯一の方法です。それ以外の場合は、バインド変数をお薦めします。バインド変数を使用すると、無効な値が渡された場合はエラーが生成され、予想外の結果が生成されることはありません。
次に、リリース10.1でXSQL Pagesパブリッシング・フレームワークに追加された主な新機能を示します。次のアクションを実行できます。
複数値のパラメータの容易な使用
複数値のパラメータをSQLおよびPL/SQLでコレクションとしてバインド
アクション・ハンドラ・エラーの検出、および容易な対処
条件付きのアクションの実行またはコンテンツの挿入
サーブレット・コンテナからのJDBCデータソースの使用
カスタムXSQLページのリクエスト・ロギングの提供
カスタムXSQLページのエラー処理の提供
XSQL構成ファイルの名前のオーバーライド
リリース10.1では、XSQL Servlet Processorに次のような新機能があります。
複数値のパラメータのサポート: 値が文字列の配列であるパラメータを使用できます。複数値のパラメータは、同じ名前を共有する入力コントロールが複数出現するHTMLフォームをユーザーが送信する場合によく使用されます。
xsql:if-param
を使用した条件付きのアクションの実行またはコンテンツの挿入: 新しい<xsql:if-param>
では、ある条件が真である場合に、xsql:if-paramにネストされている要素またはアクションを条件付きで含めることができます。
暗黙的コミットを実行するアクションの新しいCommit="No"
フラグ: <xsql:delete-request, xsql:insert-request>
、xsql:insert-request
および<xsql:insert-parameter>
アクション・ハンドラ要素のそれぞれで、アクションで暗黙的コミットを実行するかどうかを制御する新しいオプションのコミット属性を使用できます。
組込みアクションでのエラー・パラメータのオプション設定: アクション実行時に致命的ではないエラーが発生したかどうかを把握しておくと便利な場合があります。
サーブレット・コンテナのデータソース実装の使用: 自分が使用する接続をXSQLConfig.xml
ファイル内に名前指定して定義する方法の他に、サーブレット・コンテナでのJDBCデータソース実装を介して使用可能なデータソースを使用するという方法もあります。
カスタムXSQLErrorHandler
実装の提供: リリース1.1で新しいインタフェースが導入されました。oracle.xml.xsql.XSQLErrorHandler
を使用することで、開発者はエラーの通知方法をプログラム上で制御し、エラーの対処方法をカスタマイズできます。
Custom XSQLLogger
実装の提供: リリース10.1で2つの新しいインタフェースoracle.xml.xsql.XSQLLoggerFactory
およびoracle.xml.xsql.XSQLLogger
が導入されました。これらのインタフェースを使用することで、開発者はXSQLページ・リクエストのログを記録できます。
XSQLConfig.xml
ファイルのデフォルト名のオーバーライドが可能: テストおよび本番環境用に別の構成ファイルを容易に提供できます。たとえば、リリース10.1では次の2種類の方法でファイル名をオーバーライドできます。
Javaシステム・プロパティxsql.config
を設定します。
サーブレット初期化パラメータxsql.config
を定義します。
ApacheFOP0.20.3のサポート: XSQLページからPDF出力をレンダリングする必要がある場合、このリリースはApache FOP 0.20.3リリース候補での動作をサポートしています。
空白保持構成オプションの設定: このリリースから、空白保持モードを使用したXSQLページ・テンプレートおよびXSLTスタイルシートの解析に、XSQL Page ProcessorでXML Parserを使用するかどうかを制御できます。
この項では、サーバー側のXSQLページ・テンプレートで実行可能な基本機能の概要について説明します。
SQL問合せからのXMLデータグラムの生成
別のXML形式へのXMLデータグラムの変換
表示用のHTMLへのXMLデータグラムの変換
XSQLページを使用して、XML形式のデータベース情報をWeb上で提供することは非常に簡単です。たとえば、今日JFK空港に到着するすべてのフライトのリアルタイムのXMLデータグラムをOracleから提供する簡単な例を示します。Oracle JDeveloperまたはお好きなテキスト・エディタを使用して、次のようなXSQLページ・テンプレートを作成し、AvailableFlightsToday.xsql
という名前のファイルにそのテンプレートを保存します。
<?xml version="1.0"?> <xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql"> SELECT Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') AS Due FROM FlightSchedule WHERE TRUNC(ExpectedTime) = TRUNC(SYSDATE) AND Arrived = 'N' AND Destination = ? /* The ? is a bind variable being bound */ ORDER BY ExpectedTime /* to the value of the City parameter */ </xsql:query>
XSQLサーブレットがWebサーバーに適切にインストールされている場合、前述のAvailableFlightsToday.xsql
ファイルをWebサーバーの仮想ディレクトリ階層内のディレクトリにコピーする必要があります。URLをリクエストすると、Webブラウザを介してテンプレートにアクセスできます。
http://yourcompany.com/AvailableFlightsToday.xsql?City=JFK
XSQLページでの問合せの結果は、自動的にXMLとして生成され、リクエスタに戻されます。このXMLベースのデータグラムは、通常、他のサーバー・プログラムで処理するためにリクエストされます。ただし、Internet Explorer 5.0などのブラウザを使用する場合、図8-2に示すようにXMLでの結果を直接表示できます。
図8-2 XSQLページ(AvailableFlightsToday.xsq)問合せのXML結果
使用したXSQLページ・テンプレートをさらに詳しく見てみます。このXSQLページが次の記述で始まることに注目してください。
<?xml version="1.0"?>
XSQLテンプレート自体がXMLファイル(拡張子は*.xsql
)であり、このファイルには静的XMLコンテンツとXSQLアクション・ハンドラ要素の組合せが含まれています。前述の例AvailableFlightsToday.xsql
には、静的XML要素は含まれず、単一のXSQLアクション・ハンドラ要素<xsql:query>
のみが含まれています。これは作成できる最も単純で有用なXSQLページであり、単一の問合せのみが含まれます。
<xsql:query>
ページの最初の(この場合唯一の)要素には、名前空間の接頭辞xsql
をOracle XSQL名前空間識別子urn:oracle-xsql
のシノニムとして宣言する特定の属性が含まれています。
<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">
この最初の、一番外側にある要素(ドキュメント要素)には、connection
属性も含まれています。この属性の値demoは、XSQL構成ファイル(デフォルトではXSQLConfig.xml
)にある事前定義済接続の1つの名前です。
<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">
demo接続に使用する、ユーザー名、パスワード、データベースおよびJDBCドライバの詳細は、構成ファイルにすべて記載されます。これらの接続定義の設定については、この章の後続の項で説明します。
最後に<xsql:query>
要素には、bind-params
属性が含まれています。この属性は、リクエスト内のパラメータの値を、<xsql:query>
タグに含まれるSQL文のバインド・パラメータ(疑問符で示される)に名前で関連付けます。
ページに複数の問合せを挿入する場合は、独自のXML要素を作成して次のように他の要素をラップする必要があります。
<?xml version="1.0"?> <page connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query bind-params="City"> SELECT Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') AS Due FROM FlightSchedule WHERE TRUNC(ExpectedTime) = TRUNC(SYSDATE) AND Arrived = 'N' AND Destination = ? /* The ? is a bind variable being bound */ ORDER BY ExpectedTime /* to the value of the City parameter */ </xsql:query> <!-- Other xsql:query actions can go here inside <page> and </page> --> </page>
この例では、connection
属性およびxsql
名前空間宣言は常にドキュメント要素に指定されますが、bind-params
は<xsql:query>
アクションに固有です。
図8-2に示す正規の<ROWSET>
および<ROW>
XML出力が必要なXML形式ではない場合は、XSLTスタイルシートを任意のXSQLページ・テンプレートと関連付けて、サーバー内でこのXMLデータグラムを変換してから別の必要な形式で情報を戻すことができます。
別のプログラムでデータを交換する場合、通常、交換するXML形式を記述する特定のDocument Type Definition(DTD)を他のパーティと事前にとり決めておきます。実質的にDTDはスキーマ定義です。DTDは、その型のドキュメントが使用できるXML要素や属性を形式的に定義します。
flight-list.dtd
の定義が指定され、そのDTDに準拠した形式で到着フライトのリストを生成する必要があるとします。Extensibility社製のXML Authorityなどのビジュアル・ツールを使用して、図8-3に示すようにflight-list.dtdの構造を参照できます。
図8-3 Extensibility社製のXML Authorityを使用した、業界標準のflight-list.dtdの表示
この図は、フライト・リスト用の標準のXML形式が、次の要素を含むことを示します。
<flight-list>
要素(1つ以上の<flight>
要素を含みます)。
<flight>
要素(属性airlineおよびnumberがあり、各属性は<arrives>
要素を含みます)。
<arrives>
要素。
次のXSLTスタイルシートflight-list.xsl
をXSQLページに関連付けると、到着フライトのデフォルト形式である<ROWSET>
および<ROW>
を、業界標準のDTD形式に変換できます。
<!-- XSLT Stylesheet to transform ROWSET/ROW results into flight-list format --> <flight-list xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0"> <xsl:for-each select="ROWSET/ROW"> <flight airline="{CARRIER}" number="{FLIGHTNUMBER}"> <arrives><xsl:value-of select="DUE"/></arrives> </flight> </xsl:for-each> </flight-list>
このスタイルシートは、結果として生成されたドキュメント内に、<flight-list>
、<flight>
、<arrives>
などのリテラル要素が含まれているテンプレートです。これらのリテラル要素は、次の操作を可能にする特定のXSLTアクション・ハンドラ要素とともにテンプレート内に配置されます。
<xsl:for-each>
を使用して、ソース・ドキュメント内の一致する要素に対するループを行います。
<xsl:value-of>
を使用して、必要に応じてソース・ドキュメント要素の値をプラグインします。
{something}
を使用して、ソース・ドキュメント要素の値を属性値にプラグインします。
スタイルシートの最上位の<flight-list>
要素に2つの項目が追加されています。
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
この属性は、xslという名前のXML名前空間(xmlns)を定義し、XSLT仕様を一意に識別するUniform Resource Locator(URL)文字列を識別します。これは、URLのように見えますが、文字列http://www.w3.org/1999/XSL/Transform
を、XSLT 1.0仕様で定義されている要素セット用のグローバル主キーとして考えます。名前空間を定義すると、スタイルシートで<xsl:XXX>
アクション・ハンドラ要素を使用し、必要に応じて値をループおよびプラグインできます。
xsl:version = "1.0"
この属性は、ドキュメントをXSLT 1.0スタイルシートとして識別します。version属性は、すべてのXSLTスタイルシートが、妥当であると識別され、XSLT Processorによって認識されるために必要です。
このスタイルシートとXSQLページを関連付けるには、次のように<?xml-stylesheet?>
処理命令をページの上部に追加します。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="flight-list.xsl"?> <xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql"> SELECT Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') AS Due FROM FlightSchedule WHERE TRUNC(ExpectedTime) = TRUNC(SYSDATE) AND Arrived = 'N' AND Destination = ? /* The ? is a bind variable being bound */ ORDER BY ExpectedTime /* to the value of the City parameter */ </xsql:query>
これはスタイルシートとXML文書を関連付けるW3Cの標準メカニズムです(http://www.w3.org/TR/xml-stylesheet
)。XSLTスタイルシートのXSQLページへの関連付けを指定すると、リクエスト側プログラムまたはブラウザによって、図8-4に示すように、提供されたflight-list.dtd
で指定された業界標準形式でXMLを参照できます。
同じXML情報を別のXML形式ではなくHTMLで戻すには、別のXSLTスタイルシートを使用します。スタイルシートは、<flight-list>
や<flight>
などの要素を生成するのではなく、かわりに<table>
、<tr>
、<td>
などのHTML要素を生成します。動的に問合せが実行された情報の結果は、図8-5に示すHTMLページの表示に類似しています。XSQLページは、未加工のXML情報を戻すのではなく、サーバー側でのXSLTによる変換を使用して、ブラウザに送信するために情報をHTMLとしてフォーマットします。
flight-display.xsl
スタイルシートは、flight-list.xsl
スタイルシートの構文と同様に、テンプレートのHTMLページの表示に類似しています。これには、<xsl:for-each>
、<xsl:value-of>
、および<ROWSET>
と<ROW>
で構成された基礎となるXML問合せ結果の動的な値をプラグインするための{DUE}
などの属性値テンプレートが含まれます。
<!-- XSLT Stylesheet to transform ROWSET/ROW results into HTML --> <html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0"> <head><link rel="stylesheet" type="text/css" href="flights.css" /></head> <body> <center><table border="0"> <tr><th>Flight</th><th>Arrives</th></tr> <xsl:for-each select="ROWSET/ROW"> <tr> <td> <table border="0" cellspacing="0" cellpadding="4"> <tr> <td><img align="absmiddle" src="images/{CARRIER}.gif"/></td> <td width="180"> <xsl:value-of select="CARRIER"/> <xsl:text> </xsl:text> <xsl:value-of select="FLIGHTNUMBER"/> </td> </tr> </table> </td> <td align="center"><xsl:value-of select="DUE"/></td> </tr> </xsl:for-each> </table></center> </body> </html>
注意: このスタイルシートはHTMLの表示と類似していますが、1つのわずかな違いがあります。これは整形式のHTMLです。つまり、それぞれの開始タグは適切にクローズされ(<td> …</td> など)、空のタグに、<br> ではなく空のXML要素構文<br/> が使用されているということです。
|
次の機能を組み合せた場合、
Oracleデータベースから必要な情報を選択するためのパラメータ化されたSQL文
移植可能な中間データ交換形式としての業界標準のXML
XMLベースのデータ・ページを必要なXMLベースまたはHTMLベースの形式に変換するためのXSLT
非常に有益な、役に立つ結果を迅速に得ることができます。後述の項では、これまでに見てきた内容が、XSQLページを使用して実行できることのほんの一部であることがわかります。
関連資料: XSLT入門の詳細と、様々なOracleデータベース・シナリオへのXSLTの適用方法に関するチュートリアルについては、『Building Oracle XML Applications』(Steve Muench著、O'Reilly and Associates出版)を参照してください。 |
XSQLページは、様々な方法で開発および使用できます。始めに最も簡単な入門方法を説明し、Oracle JDeveloperを使用してから、本番環境でXSQLページを使用するために理解する必要がある詳細事項について説明します。
開発時にXSQLページを最も簡単に使用するには、Oracle JDeveloperを使用します。JDeveloper IDEのバージョン3.1以上では、色分けされた構文ハイライト表示、XML構文チェックおよびXSQLページの簡単なテストがサポートされています。さらに、JDeveloper 3.2リリースではXSQLページのデバッグがサポートされ、XSQLアクションの作成に役立つ新しいウィザードが追加されています。
JDeveloperプロジェクトでXSQLページを作成するには、次の手順を実行します。
ナビゲータの上部の「+」アイコンをクリックして、プロジェクトに新規または既存のXSQLページを追加します。
「ファイル」→「新規」を選択して、ギャラリの「Webオブジェクト」タブから「XSQL」を選択します。
<xsql:query>
などのXSQLアクション・ハンドラ要素をXSQLページに追加するには、新しい要素を挿入する位置にカーソルを置き、次のいずれかを実行します。
マウスの右ボタンのメニューから「XSQLエレメント」を選択します。
IDEのメニューから「ウィザード」→「XSQLエレメント」を選択します。
「XSQLエレメント」ウィザードに示された手順に従って、使用するXSQLアクションおよび指定する必要のある属性を選択します。
XSQLページ・テンプレートの構文をチェックするには、チェックするXSQLページの名前を選択後、ナビゲータの右マウスのメニューから「XML構文のチェック(&X)」を常時選択できます。XML構文にエラーがある場合、エラーはメッセージ・ビューに表示され、カーソルが最初のエラーの場所に移動します。
XSQLページをテストするには、ナビゲータ内でページを選択し、右マウスのメニューから「実行」を選択します。JDeveloperは、XSQLページを実行できるように適切に構成されたローカルのWeb-to-Go Webサーバーを自動的に起動し、ページをリクエストする適切なURLを指定したデフォルトのブラウザを起動してそのページをテストします。XSQLページを実行すると、引き続きIDEでそのページ(およびそのページが関連付けられているすべてのXSLTスタイルシート)に変更を加えることができ、IDEでファイルを保存した後、すぐにブラウザで再表示して反映された変更を確認できます。
CLASSPATHが適切に設定されるように、JDeveloperを使用してXSQLランタイム・ライブラリをプロジェクトのライブラリ・リストに追加する必要があります。IDEでは、ユーザーが「新規オブジェクト・ギャラリ」を使用して新規のXSQLページを作成するときに自動的にこのエントリを追加しますが、「プロジェクト」→「プロジェクト・プロパティ」を選択して、「ライブラリ」タブをクリックすることにより、プロジェクトにエントリを手動で追加することもできます。
JDeveloper以外の環境では、XSQL Page Processor Engineが実行するように適切に構成されていることを確認する必要があります。Oracleには、データベースを伴うOracle HTTP ServerにプレインストールされたXSQLサーブレットが付属していますが、他の環境でXSQLを使用する場合、Java CLASSPATHが正しく設定されているかを確認する必要があります。
XSQL Page Processorには3つのエントリ・ポイントがあります。
oracle.xml.xsql.XSQLServlet
(サーブレット・インタフェース)
oracle.xml.xsql.XSQLCommandLine
(コマンドライン・インタフェース)
oracle.xml.xsql.XSQLRequest
(プログラム・インタフェース)
これら3つのインタフェースと、コアであるXSQL Engine自体はJavaで記述されているため、移植可能で設定が非常に簡単です。唯一の設定要件は、XSQLページの処理を実行するJavaVMのCLASSPATHに、適切なJARファイルが含まれてかどうかを確認することです。次のJARファイルがあります。
oraclexsql.jar
(XSQL Page Processor)
xmlparserv2.jar
(Oracle XML Parser for Java v2)
xsu12.jar
(Oracle XML SQL Utility)
classes12.jar
(Oracle JDBC Driver)
さらにXSQL Page Processorの構成ファイル(デフォルトではXSQLConfig.xml
)が置かれているディレクトリがCLASSPATHのディレクトリとしてリストされている必要があります。
前述のことをまとめると、C:\xsql
にXSQL配布パッケージをインストールした場合、CLASSPATHは次のようになります。
C:\xsql\lib\classes12.classes12.jar;C:\xsql\lib\xmlparserv2.jar; C:\xsql\lib\xsu12.jar;C:\xsql\lib\oraclexsql.jar; directory_where_XSQLConfig.xml_resides
UNIXでXSQL配布パッケージを/web
ディレクトリに抽出した場合、CLASSPATHは次のようになります。
/web/xsql/lib/classes12.jarclasses12.jar:/web/xsql/lib/xmlparserv2.jar: /web/xsql/lib/xsu12.jar:/web/xsql/lib/oraclexsql.jar: directory_where_XSQLConfig.xml_resides
XSQLサーブレットを使用するには、もう1つの設定手順が必要です。.xsql
ファイル拡張子をXSQLサーブレットのJavaクラスoracle.xml.xsql.XSQLServlet
と関連付ける必要があります。Webサーバーのサーブレット環境におけるCLASSPATHの設定と、サーブレットとファイル拡張子の関連付けは、Webサーバーごとに異なります。XSQLサーブレットのリリース・ノートには、XSQLページとともに使用できる特定のWebサーバー向けの詳しい設定情報があります。
XSQLページは、XSQL構成ファイルに定義された接続の短縮名を使用してデータベース接続を参照します。接続名は、XSQL構成ファイル(デフォルトではXSQLConfig.xml
)の<connectiondefs>
セクションに次のように定義されています。
<connectiondefs> <connection name="demo"> <username>scott</username> <password>tiger</password> <dburl>jdbc:oracle:thin:@localhost:1521:testDB</dburl> <driver>oracle.jdbc.driver.OracleDriver</driver> <autocommit>false</autocommit> </connection> <connection name="lite"> <username>system</username> <password>manager</password> <dburl>jdbc:Polite:POlite</dburl> <driver>oracle.lite.poljdbc.POLJDBCDriver</driver> </connection> </connectiondefs>
接続ごとに5つの情報項目を指定できます。
<username>
<password>
<dburl>
(JDBC接続文字列)
<driver>
(使用するJDBCドライバの完全修飾クラス名)
<autocommit>
(オプションでAUTOCOMMIT
をTRUE
またはFALSE
に設定)
<autocommit>
要素を省略した場合、XSQL Page ProcessorはAUTOCOMMIT
フラグのJDBCドライバのデフォルト設定を使用します。
任意の数の<connection>
要素をこのファイルに配置して、必要な接続を定義できます。個々のXSQLページは、ページ内の最上位の要素(ドキュメント要素)にconnection="
xxx
"
属性を挿入して、使用する接続を参照します。
注意: セキュリティ上の理由から、本番用のWebサーバーにXSQLサーブレットをインストールする場合、XSQLConfig.xml ファイルがWebサーバーの仮想ディレクトリ階層を構成するディレクトリに置かれていないことを確認してください。この注意事項に従わない場合、構成情報がWebで公開されてしまう危険性があります。
|
動的なページのコンテンツは、使用する環境で頻繁に変更されないデータに基づいていることがほとんどです。Webパブリッシングのパフォーマンスを最適化するには、オペレーティング・システムの機能を使用してXSQLページのオフライン処理をスケジューリングすることにより、処理結果がWebサーバーによって静的に提供されます。
XSQLコマンドライン・ユーティリティを使用して、任意のXSQLページをコマンドラインで処理できます。構文は次のとおりです。
$ java oracle.xml.xsql.XSQLCommandLine xsqlpage [outfile] [param1=value1 ...]
outfile
を指定した場合、xsqlpage
の処理結果がその出力ファイルに書き込まれます。outfile
を指定しない場合、結果が標準出力されます。任意の数のパラメータをXSQL Page Processorに渡すことができます。また、リクエストの一部として処理中のXSQLページはそれらのパラメータを参照できます。ただし、次のパラメータ名はコマンドライン・ユーティリティによって認識され、事前定義済の動作を行います。
xml-stylesheet=stylesheetURL
これは、リクエストに使用するスタイルシートの相対URLまたは絶対URLを指定します。また、文字列noneを指定すると、デバッグ操作のためにXSLTスタイルシートの処理を抑制することもできます。
posted-xml=XMLDocumentURL
これは、リクエストの一部としてポストされたときと同様に処理するXMLリソースの相対URLまたは絶対URLを指定します。
useragent=UserAgentString
これは、そのユーザー・エージェント・タイプに適切なスタイルシートがページのコマンドライン処理の一部として選択されるように、コマンドラインから特定のHTTPのユーザー・エージェント文字列をシミュレーションするために使用します。
/xdk/java/xsql/bin
ディレクトリには、XSQLコマンドライン・ユーティリティの起動を自動化するプラットフォーム固有のコマンド・スクリプトが含まれます。このスクリプトはJavaランタイムを設定して、oracle.xml.xsql.XSQLCommandLine
クラスを実行します。
これまでは1つのXSQLアクション・ハンドラ要素、<xsql:query>
アクションのみを見てきました。このアクション・ハンドラ要素は最も一般的なアクションですが、XSQL Pagesフレームワークには他のアクションも組み込まれています。次の項では、XSQLページで使用できるすべての機能について見ていきます。
この項では、コア組込みアクションのリストを示し、各アクションの機能を簡単に説明します。また、各アクションがサポートするすべての必須属性およびオプションの属性を示します。
<xsql:query>
アクション・ハンドラ要素は、SQLのSELECT文を実行し、問合せの結果セットの正規のXML表示をデータ・ページに挿入します。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="
connname"
属性を指定し、データベース接続を指定する必要があります。
このアクションの構文は、次のとおりです。
<xsql:query> SELECT Statement </xsql:query>
任意の有効なSQL SELECT文が許可されます。SELECT文によって行が生成されない場合、次のようにネストした<xsql:no-rows-query>要素を含めることによって、代替の問合せを作成できます。
<xsql:query> SELECT Statement <xsql:no-rows-query> SELECT Statement to use if outer query returns no rows </xsql:no-rows-query> </xsql:query>
<xsql:no-rows-query>
要素自体が、任意のネスト・レベルまでネストした<xsql:no-rows-query>
要素を含むことができます。<xsql:no-rows-query>
に対して使用可能なオプションは、<xsql:query>
アクション・ハンドラ要素の場合と同じです。
デフォルトでは、問合せによって生成されたXMLはその結果セットの列構造を反映し、要素名は列名と一致します。次のようなネストした構造を持つ結果内の列の場合、
オブジェクト型
コレクション型
CURSOR式
その構造を反映するネストした要素を生成します。異なる型の列を含み、1行を戻す典型的な問合せの結果は、次のようになります。
<ROWSET> <ROW id="1"> <VARCHARCOL>Value</VARCHARCOL> <NUMBERCOL>12345</NUMBERCOL> <DATECOL>12/10/2001 10:13:22</DATECOL> <OBJECTCOL> <ATTR1>Value</ATTR1> <ATTR2>Value</ATTR2> </OBJECTCOL> <COLLECTIONCOL> <COLLECTIONCOL_ITEM> <ATTR1>Value</ATTR1> <ATTR2>Value</ATTR2> </COLLECTIONCOL_ITEM> <COLLECTIONCOL_ITEM> <ATTR1>Value</ATTR1> <ATTR2>Value</ATTR2> </COLLECTIONCOL_ITEM> </COLLECTIONCOL> <CURSORCOL> <CURSORCOL_ROW> <COL1>Value1</COL1> <COL2>Value2</COL2> </CURSORCOR_ROW> </CURSORCOL> </ROW> </ROWSET>
<ROW>
要素は、結果セット内の行ごとに繰り返されます。問合せでは、標準SQL列別名を使用して結果内の列の名前を変更できます。これによって、生成されたXML要素の名前も効果的に変更できます。このような列別名は、XML要素には無効な名前を持つ列に対しては必須です。
たとえば次のような<xsql:query>
アクションの場合、
<xsql:query>SELECT TO_CHAR(hire_date,'DD-MON') FROM employees</xsql:query>
計算された式のデフォルトの列名は無効なXML要素名になるため、エラーが生成されます。次のような列別名で問題を修正できます。
<xsql:query>
SELECT TO_CHAR(hire_date,'DD-MON') as hiredate FROM employees
</xsql:query>
表8-1に示すオプションの属性を指定すると、<xsql:query>
アクションによって取得されるデータおよび生成されるXMLを様々な面で制御できます。
表8-1 <xsql:query>の属性
属性名 | 説明 |
---|---|
bind-params = "string"
|
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
date-format = "string"
|
問合せ中のXML内の書式化された日付列と属性の値に対して使用する日付書式マスク。有効値は、 |
error-param = "string"
|
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
error-statement = "boolean"
|
|
fetch-size = "integer"
|
データベース・ラウンドトリップごとにフェッチするレコードの数。指定しない場合は、 |
id-attribute = "string"
|
結果セット内の各行を一意に識別するためのデフォルトの |
id-attribute-column = "string"
|
結果セット内の列の大/小文字を区別した名前。この値は、行IDの属性値として各行に指定する必要があります。デフォルトでは、行カウントが行IDの属性値として使用されます。 |
include-schema = "boolean"
|
|
max-rows = "integer"
|
フェッチする行の最大数。オプションで、 |
null-indicator = "boolean"
|
|
row-element = "string"
|
問合せ結果の |
rowset-element = "string"
|
問合せ結果の |
skip-rows = "integer"
|
結果セットから行をフェッチする前にスキップする行の数。 |
tag-case = "string"
|
有効値は、 |
<xsql:dml>アクションを使用して、任意のDMLまたはDDL操作と、任意のPL/SQLブロックを実行できます。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
このアクションの構文は、次のとおりです。
<xsql:dml> DML Statement or DDL Statement or PL/SQL Block </xsql:dml>
表8-2に、<xsql:dml>
アクションで使用できるオプションの属性を示します。
表8-2 <xsql:dml>の属性
属性名 | 説明 |
---|---|
commit = "boolean"
|
|
bind-params = "string"
|
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
error-param = "string"
|
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
error-statement = "boolean"
|
|
<xsql:ref-cursor-function>アクションを使用すると、PL/SQLストアド・ファンクションを実行することで決定する結果セットの問合せによって生成されたXML結果を挿入できます。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
PL/SQLの動的SQL機能を使用すると、結果セットへのカーソル・ハンドルをXSQL Page Processorに戻す前に、ファンクションで動的におよび条件付きで(または条件付きで)問合せを作成できます。その名前が示すように、起動しているファンクションの戻り値はREF CURSOR型になります。
このアクションの構文は、次のとおりです。
<xsql:ref-cursor-function> [SCHEMA.][PACKAGE.]FUNCTION_NAME(args); </xsql:ref-cursor-function>
fetch-size属性を除き、<xsql:ref-cursor-function>アクションで使用可能なオプションの属性は、表8-1に示す<xsql:query>アクションの属性とほぼ同じです。
たとえば次のPL/SQLパッケージについて見てみます。
CREATE OR REPLACE PACKAGE DynCursor IS TYPE ref_cursor IS REF CURSOR; FUNCTION DynamicQuery(id NUMBER) RETURN ref_cursor; END; CREATE OR REPLACE PACKAGE BODY DynCursor IS FUNCTION DynamicQuery(id NUMBER) RETURN ref_cursor IS the_cursor ref_cursor; BEGIN -- Conditionally return a dynamic query as a REF CURSOR IF id = 1 THEN OPEN the_cursor -- An employees Query FOR 'SELECT employee_id, email FROM employees'; ELSE OPEN the_cursor -- A departments Query FOR 'SELECT department_name, department_id FROM departments'; END IF; RETURN the_cursor; END; END;
<xsql:ref-cursor-function>
は、このファンクションが戻したREF CURSORの動的結果を次のようにして挿入できます。
<xsql:ref-cursor-function> DynCursor.DynamicQuery(1); </xsql:ref-cursor-function>
<xsql:include-owa>アクションを使用すると、データベース・ストアド・プロシージャで生成されたXMLコンテンツを挿入できます。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
ストアド・プロシージャは、標準のOracle Web Agent(OWA)パッケージ(HTP
およびHTF
)を使用して、XMLタグをサーバー側ページ・バッファに出力します。その後、XSQL Page Processorが、動的に生成されたXMLコンテンツをフェッチおよび解析し、データ・ページに挿入します。ストアド・プロシージャは、整形式のXMLページを生成する必要があります。生成しなかった場合は、該当するエラーが表示されます。
このアクションの構文は、次のとおりです。
<xsql:include-owa> PL/SQL Block invoking a procedure that uses the HTP and HTF (or HTF) packages </xsql:include-owa>
表8-3に、このアクションがサポートするオプションの属性を示します。
表8-3 <xsql:include-owa>の属性
属性名 | 説明 |
---|---|
bind-params = "string"
|
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
error-param = "string"
|
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
error-statement = "boolean"
|
|
前述のアクションの結果をパラメータ化するには、SQLバインド変数を使用できます。バインド変数を使用すると、XSQLページ・テンプレートは、リクエストで渡されたパラメータの値に基づいて様々な結果を生成できます。バインド変数を使用するには、SQLによってバインド変数が許可されている文内の任意の場所に疑問符を挿入します。たとえば<xsql:query>
アクションには次のSELECT文が含まれます。
SELECT s.ticker as "Symbol", s.last_traded_price as "Price" FROM latest_stocks s, customer_portfolio p WHERE p.customer_id = ? AND s.ticker = p.ticker
疑問符を使用して顧客IDのバインド変数を作成します。このアクション・ハンドラ要素にbind-params属性を指定することにより、ページ内でSQL文が実行されるたびに、パラメータ値がバインド変数にバインドされます。前述の例を使用すると、示されたバインド変数をページ・リクエストでcustid
パラメータ値にバインドするXSQLページを次のように作成できます。
<!-- CustomerPortfolio.xsql --> <portfolio connnection="prod" xmlns:xsql="urn:oracle-xsql"> <xsql:query bind-params="custid"> SELECT s.ticker as "Symbol", s.last_traded_price as "Price" FROM latest_stocks s, customer_portfolio p WHERE p.customer_id = ? AND s.ticker = p.ticker </xsql:query> </portfolio>
次のようなリクエストで特定の顧客IDパラメータを渡すと、その顧客のポートフォリオのXMLデータをリクエストできます。
http://yourserver.com/fin/CustomerPortfolio.xsql?custid=1001
bind-params
属性の値は、空白で区切られたパラメータ名のリストです。これらのパラメータ名の左から右への順序は、その値がバインドされるバインド変数の文内での位置を示します。そのため、SQL文内に5つの疑問符がある場合、bind-params属性には空白で区切られた5つのパラメータ名のリストを指定する必要があります。疑問符で示された1つのバインド変数が複数回出現し、それに同一のパラメータ値をバインドする必要がある場合は、そのパラメータ名をbind-params
属性値の適切な位置に繰り返します。問合せ内の疑問符とほぼ同数のパラメータ名がbind-params属性に挿入されていない場合は、ページの実行時にエラーが発生します。
バインド変数は、SQL文を必要とするすべてのアクションで使用できます。次のページでさらに例を示します。
<!-- CustomerPortfolio.xsql --> <portfolio connnection="prod" xmlns:xsql="urn:oracle-xsql"> <xsql:dml commit="yes" bind-params="useridCookie"> BEGIN log_user_hit(?); END; </xsql:dml> <current-prices> <xsql:query bind-params="custid"> SELECT s.ticker as "Symbol", s.last_traded_price as "Price" FROM latest_stocks s, customer_portfolio p WHERE p.customer_id = ? AND s.ticker = p.ticker </xsql:query> </current-prices> <analysis> <xsql:include-owa bind-params="custid userCookie"> BEGIN portfolio_analysis.historical_data(?,5 /* years */, ?); END; </xsql:include-owa> </analysis> </portfolio>
すべてのXSQLアクション・ハンドラ要素で、任意の属性の値または含まれるSQL文のテキストを字句置換パラメータに置き換えることができます。これによって、アクションの動作をパラメータ化したり、アクションが実行するSQL文の一部を置き換えたりすることができます。字句置換パラメータは、構文{@ParameterName
}を使用して参照されます。
次の例では、2つの字句置換パラメータの使用を示します。1つのパラメータはパラメータとして渡すことができる行の最大数を許可し、もう1つのパラメータはORDER BYに対する列のリストを制御します。
<!-- DevOpenBugs.xsql --> <open-bugs connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query max-rows="{@max}" bind-params="dev prod"> SELECT bugno, abstract, status FROM bug_table WHERE programmer_assigned = UPPER(?) AND product_id = ? AND status < 80 ORDER BY {@orderby} </xsql:query> </open-bugs>
この例では、URLをリクエストして、指定した開発者が公開している不具合のリストのXMLを示すことができます。
http://yourserver.com/bug/DevOpenBugs.xsql?dev=smuench&prod=817
あるいはXSQLコマンドライン・ユーティリティを使用してリクエストする場合は次のようになります。
$ xsql DevOpenBugs.xsql dev=smuench prod=817
字句パラメータは、XSQLページ接続や、ページの処理に使用するスタイルシートをパラメータ化する場合にも使用できます。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="{@sheet}.xsl"?> <!-- DevOpenBugs.xsql --> <open-bugs connection="{@conn}" xmlns:xsql="urn:oracle-xsql"> <xsql:query max-rows="{@max}" bind-params="dev prod"> SELECT bugno, abstract, status FROM bug_table WHERE programmer_assigned = UPPER(?) AND product_id = ? AND status < 80 ORDER BY {@orderby} </xsql:query> </open-bugs>
多くの場合、バインド変数または置換パラメータのデフォルト値をページで直接指定すると便利です。これによって、リクエスタで各リクエストのすべての値を明示的に渡さなくても、ページをパラメータ化できます。
パラメータのデフォルト値を挿入するには、そのパラメータと同じ名前のXML属性をアクション・ハンドラ要素または任意の祖先クラス要素に追加します。任意のパラメータの値がリクエスト内に挿入されていない場合、XSQL Page Processorは現行のアクション・ハンドラ要素で同じ名前の属性を検索します。検索されなかった場合は、ページのドキュメント要素に到達するまで、現行のアクション・ハンドラ要素の各祖先クラス要素で該当する属性が検索されます。
簡単な例として、次のページではページ内の2つの<xsql:query>
アクションのmax
パラメータのデフォルト値は10に設定されています。
<example max="10" connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query max-rows="{@max}">SELECT * FROM TABLE1</xsql:query> <xsql:query max-rows="{@max}">SELECT * FROM TABLE2</xsql:query> </example>
この例では、max
パラメータのデフォルト値を、1つ目の問合せでは5に、2つ目の問合せでは7に、3つ目の問合せでは10に指定します。
<example max="10" connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query max="5" max-rows="{@max}">SELECT * FROM TABLE1</xsql:query> <xsql:query max="7" max-rows="{@max}">SELECT * FROM TABLE2</xsql:query> <xsql:query max-rows="{@max}">SELECT * FROM TABLE3</xsql:query> </example>
もちろんすべてのデフォルト値は、次の例のようなリクエストでmax
パラメータの値を指定すると、オーバーライドされます。
http://yourserver.com/example.xsql?max=3
バインド変数のデフォルト値を設定する場合も同じ規則に従います。次のようなページはあまり有用ではありませんが、参考になります。
<example val="10" connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query tag-case="lower" bind-params="val val val"> SELECT ? as somevalue FROM DUAL WHERE ? = ? </xsql:query> </example>
次のXMLデータグラムが戻されます。
<example> <rowset> <row> <somevalue>10</somevalue> </row> </row> </example>
次のようなリクエストで、パラメータ指定なしでページがリクエストされたとします。
http://yourserver.com/example.xsql?val=3
次のデータグラムが戻されます。
<example> <rowset> <row> <somevalue>3</somevalue> </row> </row> </example>
バインド変数の重要なポイントを示すために、次のようにval
属性を削除してval
パラメータのデフォルト値をページから削除します。
<example connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query tag-case="lower" bind-params="val val val"> SELECT ? as somevalue FROM DUAL WHERE ? = ? </xsql:query> </example>
パラメータの指定なしでページのリクエストを行うと、次のデータグラムが戻されます。
<example> <rowset/> </example>
デフォルト値またはリクエストで指定された値のどちらも設定されていないパラメータにバインドされているバインド変数がNULLにバインドされるため、前述のページ例のWHERE句は行を戻しません。
XSQLページでは、リクエストで指定されるパラメータの他に、ページ内のアクションが決定するページのプライベート・パラメータの名前と値を使用できます。アクションがbind-params
属性または字句パラメータ参照内でparam
という名前のパラメータへの参照を検出すると、param
パラメータの値が次の順序で解決されます。
param
という名前の、ページのプライベート・パラメータの値(設定されている場合)。設定されていない場合は次に示す値を参照
param
という名前のリクエスト・パラメータの値(指定されている場合)。指定されていない場合は次に示す値を参照
現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparam
という名前の属性によって指定されているデフォルト値。指定されていない場合は次に示す値を参照
前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列
XSQLサーブレットを使用してHTTP経由で処理されるXSQLページでは、HTTPに固有の2つの追加パラメータを設定および参照できます。これらはHTTPセッション・レベル変数やHTTP Cookieです。XSQLサーブレットを使用して処理されるXSQLページでは、パラメータ値の解決スキームが次のように拡張されます。param
パラメータの値は次の順序で解決されます。
param
という名前の、ページのプライベート・パラメータの値(設定されている場合)。設定されていない場合は次に示す値を参照
param
という名前のCookieの値(設定されている場合)。設定されていない場合は次に示す値を参照
param
という名前のセッション変数の値(設定されている場合)。設定されていない場合は次に示す値を参照
param
という名前のリクエスト・パラメータの値(指定されている場合)。指定されていない場合は次に示す値を参照
現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparam
という名前の属性によって指定されているデフォルト値。指定されていない場合は次に示す値を参照
前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列
ユーザーがリクエストにパラメータ値を指定して、HTTPセッションで設定されている同じ名前のパラメータ(存続期間はそのHTTPセッションの継続期間で、Webサーバーで制御)、または、Cookieとして設定されている同じ名前のパラメータ(ブラウザ・セッション中存続するように設定可能)をオーバーライドできないように、このような解決順序が設定されています。
<xsql:include-request-params>
アクションを使用すると、リクエストのすべてのパラメータのXML表示をデータグラムに挿入できます。これは、関連付けられたXSLTスタイルシートがXPath式を使用してリクエスト・パラメータ値を参照する必要がある場合に有効です。
このアクションの構文は、次のとおりです。
<xsql:include-request-params/>
挿入されるXMLの形式は次のようになります。
<request> <parameters> <paramname>value1</paramname> <ParamName2>value2</ParamName2> ... </parameters> </request>
または次の形式になります。
<request> <parameters> <paramname>value1</paramname> <ParamName2>value2</ParamName2> ... </parameters> <session> <sessVarName>value1</sessVarName> ... </session> <cookies> <cookieName>value1</cookieName> ... </cookies> </request>
これはXSQLサーブレットを使用してページを処理する場合です。
このアクションには必須属性またはオプションの属性はありません。
<xsql:include-param>
アクションを使用すると、1つのパラメータのXML表示をデータグラムに挿入できます。これは、関連付けられたXSLTスタイルシートがXPath式を使用してパラメータ値を参照する場合に有効です。
このアクションの構文は、次のとおりです。
<xsql:include-param name="paramname" />
このname
属性は必須で、値を挿入する必要があるパラメータの名前を指定します。このアクションにはオプションの属性はありません。
次のような簡単なパラメータ名を指定するとします。
<xsql:include-param name="productid"/>
データ・ページに挿入するXMLフラグメントは次のようになります。
<productid>12345</productid>
次のように配列パラメータ名を使用して、値を配列として処理するように設定するとします。
<xsql:include-param name="productid[]"/>
XMLフラグメントは次のようにすべての配列値を反映します。
<productid> <value>12345<value> <value>33455</value> <value>88199</value> </productid>
この配列パラメータ名のシナリオでは、productid
が単一の値のパラメータである場合、フラグメントは次のように単一の要素の配列と同様になります。
<productid> <value>12345<value> </productid>
<xsql:include-xml>
アクションでは、ローカル・リソース、リモート・リソースまたはデータベース・ドリブンのXMLリソースのXMLコンテンツをデータグラムに挿入します。リソースは、URLまたはSQL文で指定されます。
このアクションの構文は、次のとおりです。
<xsql:include-xml href="URL"/>
または
<xsql:include-xml> SQL select statement selecting a single row containing a single CLOB or VARCHAR2 column value </xsql:include-xml>
URLは、他のWebサイトからXMLを取得するためのHTTPベースの絶対URLか、相対URLになります。href
属性とSQL文は、相互に排他的です。どちらか一方が指定されている場合は、他方を指定できません。
表8-4に、このアクションがサポートする属性を示します。太字の属性は必須です。
<xsql:include-posted-xml>
アクションでは、リクエストでポストされたXML文書をXSQLページに挿入します。XML文書ではなくHTML形式をポストした場合、挿入されるXMLは、<xsql:include-request-params>
アクションによって挿入されるものと類似したものになります。
<xsql:set-page-param>
アクションは、ページのプライベート・パラメータの値を設定します。この値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、別の方法として、SQLのSELECT文の結果から指定することもできます。
このアクションの構文は、次のとおりです。
<xsql:set-page-param name="paramname" value="value"/>
または
<xsql:set-page-param name="paramname"> SQL select statement </xsql:set-page-param>
または
<xsql:set-page-param name="paramname" xpath="XPathExpression"/>
SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。これを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
value
属性またはSQL文を指定するもう1つの方法として、xpath
属性を指定して、ページ・レベルのパラメータをXPath式の値に設定できます。XPath式は、XSQL Page ProcessorにポストされたXML文書またはHTML形式に対して評価されます。xpath
属性の値には、任意の有効なXPath式を指定できます。他のXSQLアクション・ハンドラ要素と同様に、XSQLパラメータを属性値の一部として使用して、オプションで作成できます。
ページのプライベート・パラメータを設定すると、後続のアクション・ハンドラは、この値を{@po_id}
などの字句パラメータとして使用できます。またはSQL操作をサポートするアクション・ハンドラのbind-params
属性でその名前を参照することによって、SQLバインド・パラメータ値として使用できます。
name
属性を使用するのではなく、単一のSQL文の結果に基づいて複数のセッション・パラメータ値を設定する必要がある場合は、names
属性を使用して、1つ以上のセッション・パラメータ名を空白またはカンマで区切ったリストを指定できます。次に例を示します。
<xsql:set-page-param names="paramname1 paramname2 paramname3"> SELECT expression_or_column1, expression_or_column2, expression_or_column3 FROM table WHERE clause_identifying_a_single_row </xsql:set-page-param>
name
属性またはnames
属性のいずれかが必要です。value
属性と含まれるSQL文は、相互に排他的です。どちらか一方が指定されている場合は、他方を指定できません。
表8-5に、このアクションがサポートする属性を示します。太字の属性は必須です。
表8-5 <xsql:set-page-param>の属性
属性名 | 説明 |
---|---|
name = "string"
|
値を設定する、ページのプライベート・パラメータの名前。 |
names = "string string ..."
|
値を設定するページ・パラメータ名を空白またはカンマで区切ったリスト。 |
bind-params = "string" |
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
ignore-empty-value = "boolean" |
ページ・レベルのパラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、 |
treat-list-as-array = "boolean" |
パラメータに割り当てられた文字列値を、割当て前に別の値の配列にトークン化するかどうかを指定します。文字列中にカンマが存在する場合、トークンの区切りにそのカンマが使用されます。それ以外の場合は、空白が使用されます。有効な値は、 |
iquote-array-values = "boolean" |
設定されているパラメータ名が単一の値のパラメータ名(たとえば、 |
xpath = "XPathExpression" |
XSQL Page ProcessorにポストされたXML文書またはHTML形式に対して評価されたXPath式に、パラメータの値を設定します。 |
<xsql:set-session-param>
アクションは、HTTPセッション・レベルのパラメータの値を設定します。セッション・レベルのパラメータの値は、Webサーバーで制御される現行ブラウザ・ユーザーのHTTPセッションの存続期間中、存続します。この値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、別の方法として、SQLのSELECT文の結果から指定することもできます。
この機能はJavaサーブレットに固有であるため、このアクションは、それが使用されているXSQLページがXSQLサーブレットによって処理されている場合にのみ有効です。このアクションは、XSQLコマンドライン・ユーティリティまたはXSQLRequest
プログラムAPIによって処理されているXSQLページで検出された場合は、何の操作も行いません。
このアクションの構文は、次のとおりです。
<xsql:set-session-param name="paramname" value="value"/>
または
<xsql:set-session-param name="paramname"> SQL select statement </xsql:set-session-param>
SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。これを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
name属性を使用するのではなく、単一のSQL文の結果に基づいて複数のセッション・パラメータ値を設定する必要がある場合は、names属性を使用して、1つ以上のセッション・パラメータ名を空白またはカンマで区切ったリストを指定できます。次に例を示します。
<xsql:set-session-param names="paramname1 paramname2 paramname3"> SELECT expression_or_column1, expression_or_column2, expression_or_column3 FROM table WHERE clause_identifying_a_single_row </xsql:set-session-param>
name
属性またはnames
属性のいずれかが必要です。value
属性と含まれるSQL文は、相互に排他的です。どちらか一方が指定されている場合は、他方を指定できません。
表8-6に、このアクションがサポートするオプションの属性を示します。
表8-6 <xsql:set-session-param>の属性
属性名 | 説明 |
---|---|
name = "string" |
値を設定するセッション・レベルの変数の名前。 |
names = "string string ..." |
値を設定するセッション・パラメータ名を空白またはカンマで区切ったリスト。 |
bind-params = "string" |
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
ignore-empty-value = "boolean" |
セッション・レベルのパラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、 |
only-if-unset = "boolean" |
セッション変数が存在しない場合にのみセッション変数を割り当てるかどうかを指定します。有効値は、 |
<xsql:set-cookie>
アクションは、HTTP Cookieの値を設定します。デフォルトでは、Cookieの値は現行のブラウザの存続期間中、存続します。ただし、その存続期間は、オプションのmax-age
属性を指定して変更できます。Cookieに割り当てられる値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、SQLのSELECT文の結果から指定することもできます。
この機能はHTTPプロトコル固有であるため、このアクションは、それが使用されているXSQLページがXSQLサーブレットによって処理されている場合にのみ有効です。このアクションは、XSQLコマンドライン・ユーティリティまたはXSQLRequest
プログラムAPIによって処理されているXSQLページで検出された場合は、何の操作も行いません。
このアクションの構文は、次のとおりです。
<xsql:set-cookie name="paramname" value="value"/>
または
<xsql:set-cookie name="paramname"> SQL select statement </xsql:set-cookie>
SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。これを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
name属性を使用するのではなく、単一のSQL文の結果に基づいて複数のCookie値を設定する必要がある場合は、names属性を使用して、1つ以上のCookie名を空白またはカンマで区切ったリストを指定できます。次に例を示します。
<xsql:set-cookie names="paramname1 paramname2 paramname3"> SELECT expression_or_column1, expression_or_column2, expression_or_column3 FROM table WHERE clause_identifying_a_single_row </xsql:set-cookie>
name
属性またはnames
属性のいずれかが必要です。value属性と含まれるSQL文は、相互に排他的です。どちらか一方が指定されている場合は、他方を指定できません。選択リストの列数は、設定されているCookieの数と一致している必要があります。一致していない場合は、エラー・メッセージが戻されます。
表8-7に、このアクションがサポートするオプションの属性を示します。
表8-7 <xsql:set-cookie>の属性
属性名 | 説明 |
---|---|
name = "string" |
値を設定するCookieの名前。 |
names = "string string ..." |
値を設定するCookie名を空白またはカンマで区切ったリスト。 |
bind-params = "string" |
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
domain = "string" |
Cookieの値が有効で読取り可能なドメイン。ドメインが明示的に設定されていない場合は、デフォルトで、そのCookieを作成するドキュメントの完全修飾ホスト名( |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
ignore-empty-value = "boolean" |
Cookieに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、 |
max-age = "integer" |
Cookieの存続期間の最大値(秒)を設定します。デフォルトでは、Cookieが現行ブラウザ・セッションの終了時に期限切れになるように設定されます。 |
only-if-unset = "boolean" |
Cookieが存在しない場合にのみCookieを割り当てるかどうかを指定します。有効値は、 |
path = "string" |
Cookieの値が有効で読取り可能なドメイン内の相対URLパス。パスが明示的に設定されていない場合は、デフォルトで、そのCookieを作成するドキュメントのURLパスに設定されます。 |
immediate = "boolean" |
Cookieの割当てを現在のページにすぐに表示するかどうかを指定します。通常、現行のリクエストで設定されたCookieは、ブラウザが後続のリクエストでCookieをサーバーに送信するまでは、表示されません。有効値は、 |
<xsql:set-stylesheet-param>
アクションは、最上位レベルのXSLTスタイルシート・パラメータの値を設定します。この値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、別の方法として、SQLのSELECT文の結果から指定することもできます。スタイルシート・パラメータ値は、現行のページの処理中に使用されるすべてのスタイルシートに対して設定できます。
このアクションの構文は、次のとおりです。
<xsql:set-stylesheet-param name="paramname" value="value"/>
または
<xsql:set-stylesheet-param name="paramname"> SQL select statement </xsql:set-stylesheet-param>
SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。これを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。
name
属性を使用するのではなく、単一のSQL文の結果に基づいて複数のスタイルシート・パラメータ値を設定する必要がある場合は、names属性を使用して、1つ以上のスタイルシート・パラメータ名を空白またはカンマで区切ったリストを指定できます。次に例を示します。
<xsql:set-stylesheet-param names="paramname1 paramname2 paramname3"> SELECT expression_or_column1, expression_or_column2, expression_or_column3 FROM table WHERE clause_identifying_a_single_row </xsql:set-stylesheet-param>
name
属性またはnames
属性のいずれかが必要です。value
属性と含まれるSQL文は、相互に排他的です。どちらか一方が指定されている場合は、他方を指定できません。
表8-8に、このアクションがサポートするオプションの属性を示します。
表8-8 <xsql:set-stylesheet-param>の属性
属性名 | 説明 |
---|---|
name = "string" |
値を設定する最上位のスタイルシート・パラメータの名前。 |
names = "string string ..." |
値を設定する最上位のスタイルシート・パラメータ名を空白またはカンマで区切ったリスト。 |
bind-params = "string" |
順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
ignore-empty-value = "boolean" |
スタイルシート・パラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、 |
単一の文字列値のサポートに加えて、リクエスト・パラメータ、セッション・パラメータおよびページのプライベート・パラメータで、値に文字列の配列を使用できます。パラメータの値を配列として処理するには、パラメータの名前の最後に一対の空の大カッコを追加します。たとえば、productid
という名前の入力コントロールが4回出現するHTMLフォームをポストする場合、配列値であるproductidパラメータを参照するにはproductid[]
という表記を使用します。
アクション・ハンドラ属性値内またはアクション・ハンドラ要素のコンテンツ内のいずれかで、配列値パラメータを字句置換パラメータとして参照する場合、その値は配列内での出現順序に従って、配列内でNULL以外の文字列および空以外の文字列のカンマ区切りのリストに変換されます。たとえば、次のようなページがあり、
<page xmlns:xsql="urn:oracle-xsql"> <xsql:query> select description from product where productid in ( {@productid[]} ) /* Using lexical parameter */ </xsql:query> </page>
リクエストにproductid
パラメータの4つの値が含まれる場合、{@productid[]}
字句置換式は、問合せ内で"111,222,333,444
"などの文字列に置き換えられます。
配列値パラメータを、名前の最後に配列を示すカッコを付けずに参照すると、最初の配列エントリの値が値として使用されます。
注意: 配列を示すカッコ内での数値の使用はサポートされていません。つまり、productid またはproductid[] を参照することはできますが、productid[2] は参照できません。リクエスト・パラメータ、ページのプライベート・パラメータおよびセッション・パラメータでのみ、文字列配列を使用できます。<xsql:set-stylesheet-param> および<xsql:set-cookie> では、単一の文字列値であるパラメータのみの使用をサポートしています。XSLTスタイルシートで複数値のパラメータを参照するには、<xsql:include-param> を使用してXSQLデータ・ページに複数値のパラメータを挿入し、次に同じスタイルシート内で適切なXPath式を使用してデータ・ページからの値を参照します。
|
次のように、配列を示すカッコを名前に使用することで、ページのプライベート・パラメータまたはセッション・パラメータの値を文字列配列値に設定できます。
<!-- Note, param name contains array brackets --> <xsql:set-page-param name="names[]" value="Tom Jane Joe"/>
セッション・パラメータの場合も同様です。
<!-- Note, param name contains array brackets --> <xsql:set-session-param name="dates[]" value="12-APR-1962 15-JUL-1968"/>
デフォルトでは、設定されているパラメータの名前に配列を示すカッコが追加されていると、値は空白またはカンマ区切りのリストとして処理され、トークン化されます。
結果として得られる文字列配列値には、これらの区切られたトークンが含まれています。前述の例では、names[]
パラメータは文字列配列{"Tom
", "Jane
", "Joe
"}で、dates[]
パラメータは文字列配列{"12-APR-1962
", "15-JUL-1968
"}です。
空白を含む文字列を処理するために、トークン化アルゴリズムはまずトークン化される文字列を調べてカンマが存在するかどうかを確認します。文字列内にカンマが1つ以上見つかった場合は、そのカンマをトークン・デリミタとして使用します。たとえば、次のアクションがあるとします。
<!-- Note, param name contains array brackets --> <xsql:set-page-param name="names[]" value="Tom Jones,Jane York"/>
この場合、names[]
パラメータの値を文字列配列{"Tom Jones
", "Jane York
"}に設定します。
デフォルトでは、名前の最後に配列を示すカッコがないパラメータを設定すると、文字列のトークン化は実行されません。以前のリリースのXSQLページにおける次のアクションがあるとします。
<!-- Note, param name does NOT contain array brackets --> <xsql:set-page-param name="names" value="Tom Jones,Jane York"/>
この場合、names
パラメータをリテラル文字列"Tom Jones,Jane York
"に設定します。便宜上、<xsql:set-page-param>
アクションまたは<xsql:set-session-param>
アクションにtreat-list-as-array="yes"
属性を挿入し、オプションで文字列を強制的にトークン化することもできます。この属性を設定すると、パラメータにカンマ区切りのトークン化された値の文字列が割り当てられます。次のようなアクションがあるとします。
<!-- Note, param name does NOT contain array brackets --> <xsql:set-page-param name="names" value="Tom Jane Joe" treat-list-as-array="yes"/>
この場合、namesパラメータをリテラル文字列"Tom,Jane,Joe
"に設定します。
さらに便利性を高めるために、単一の文字列値パラメータの値を設定し、treat-list-as-array="yes"
を使用して値をトークン化するときに、quote-array-values="yes"
属性を挿入してカンマ区切りの値を一重引用符で囲むという方法があります。次のようなアクションがあるとします。
<!-- Note, param name does NOT contain array brackets --> <xsql:set-page-param name="names" value="Tom Jones,Jane York,Jimmy" treat-list-as-array="yes" quote-array-values="yes"/>
この場合、names
パラメータにリテラル文字列値"'Tom Jones','Jane York','Jimmy'
"を割り当てます。
文字列値のスカラー型バインド変数がサポートされているXSQLページ内のどの場所にでも、配列値パラメータをバインドできます。それには、bind-params
属性に指定するパラメータ名のリスト内で配列パラメータ名(たとえば、myparam[]
)を使用します。
この方法で、SQL文およびPL/SQLプロシージャ内で配列値パラメータを簡単に処理できます。配列値パラメータは、XSQL_TABLE_OF_VARCHAR
という名前のネストした表のオブジェクト型としてバインドされます。このオブジェクト型は、次のDDL文を使用して現行のスキーマ内に作成する必要があります。
CREATE TYPE xsql_table_of_varchar AS TABLE OF VARCHAR2(2000);
型の名前としてXSQL_TABLE_OF_VARCHAR
以外を使用することはできませんが、VARCHAR2
文字列の次元は必要に応じて変更できます。その場合は、配列値文字列のパラメータを扱う文字列値と同じ長さにする必要があります。
次のPL/SQLストアド・プロシージャについて考えてみます。
FUNCTION testTableFunction(p_name XSQL_TABLE_OF_VARCHAR, p_value XSQL_TABLE_OF_VARCHAR) RETURN VARCHAR2 IS lv_ret VARCHAR2(4000); lv_numElts INTEGER; BEGIN IF p_name IS NOT NULL THEN lv_numElts := p_name.COUNT; FOR j IN 1..lv_numElts LOOP IF (j > 1) THEN lv_ret := lv_ret||':'; END IF; lv_ret := lv_ret||p_name(j)||'='||p_value(j); END LOOP; END IF; RETURN lv_ret; END;
次のページでは、XSQL_TABLE_OF_VARCHAR
型の引数を取るこのPL/SQLファンクションを使用するSQL文内で、2つの配列値パラメータをバインドする方法を示します。
<page xmlns:xsql="urn:oracle-xsql" connection="demo" someNames="aa,bb,cc" someValues="11,22,33"> <xsql:query bind-params="someNames[] someValues[]"> select testTableFunction(?,?) as example from dual </xsql:query> </page>
このページを実行すると、次のXMLデータ・ページが生成されます。
<page someNames="aa,bb,cc" someValues="11,22,33"> <ROWSET> <ROW num="1"> <EXAMPLE>aa=11:bb=22:cc=33</EXAMPLE> </ROW> </ROWSET> </page>
この方法は、配列値パラメータのsomeNames[]
およびsomeValues[]
が表のコレクション型としてバインドされていることを示します。値が繰り返され、連結された結果、PL/SQLファンクションの戻り値である"aa=11:bb=22:cc=33
"文字列値が生成されます。
bind-paramsの文字列に、通常のパラメータと配列値パラメータを必要な数のみ混合して指定することができます。配列としてバインドするパラメータには、配列を示すカッコのみを追加します。
注意: 前述の例を試して、そこで示したXSQL_TABLE_OF_VARCHAR 型を作成しなかった場合、次のようなエラーが戻されます。
<page someNames="aa,bb,cc" someValues="11,22,33"> <xsql-error code="17074" action="xsql:query"> <statement> select testTableFunction(?,?) as example from dual </statement> <message> invalid name pattern: SCOTT.XSQL_TABLE_OF_VARCHAR </message> </xsql-error> </page> |
配列パラメータはネストされた表のコレクション型としてバインドされるため、SQL内でTABLE()
演算子とCAST()
演算子を組み合せて使用し、ネストされた表のバインド変数値を、問合せを行う値の表として扱うことができます。この方法は、SQL文の副SELECT句を使用する場合に特に有効です(ただし、この方法に制限されるわけではありません)。次のページでは、従業員IDを含む配列値パラメータを使用して、行の問合せ先をHRスキーマのEMPLOYEES表に制限しています。
<page xmlns:xsql="urn:oracle-xsql" connection="hr"> <xsql:set-page-param name="someEmployees[]" value="196,197"/> <xsql:query bind-params="someEmployees[]"> select first_name||' '||last_name as name, salary from employees where employee_id in ( select * from TABLE(CAST( ? as xsql_table_of_varchar)) ) </xsql:query> </page>
このページを実行すると、次の結果が生成されます。
<page> <ROWSET> <ROW num="1"> <NAME>Alana Walsh</NAME> <SALARY>3100</SALARY> </ROW> <ROW num="2"> <NAME>Kevin Feeny</NAME> <SALARY>3000</SALARY> </ROW> </ROWSET> </page>
これらの例では、<xsql:query>
を使用したbind-params
の使用方法を説明しましたが、これらの新しい機能は<xsql:dml>
、<xsql:include-owa>
、<xsql:ref-cursor-function>
、およびSQL文またはPL/SQL文をその機能の一部として受け入れるその他のアクションでも使用できます。
最後に、あるユーザーからの質問を紹介します。「なぜXSQLでの文字列配列値のバインドにネストした表のコレクション型ではなく、PL/SQLの索引付き表を使用しないのでしょうか。」簡単に回答すると、PL/SQLの索引付き表は、JDBCシン・ドライバでは使用できません。これらはOCI JDBCドライバでのみ使用できます。ネストした表のコレクション型であるXSQL_TABLE_OF_VARCHAR
を使用することで、配列値パラメータをシン・ドライバとOCIドライバの両方で使用できます。これにより、PL/SQL内で値の配列を使用するというプログラム上の柔軟性が保たれます。
oracle.xml.xsql.XSQLCommandLine
コマンドライン・ユーティリティを使用してXSQLページを実行する場合、コマンドラインで同じパラメータ名を次のように複数回含めることで、XSQL Page Processorに複数値のパラメータを指定できます。
java oracle.xml.xsql.XSQLCommandLine SomePage.xsql user=Steve user=Paul user=Mary
リクエスト・パラメータとして設定されたuser[]
配列値パラメータが{"Steve
","Paul
","Mary
"}に設定されます。
XSQL Page Engineに対するXSQLRequest
プログラムAPIは、名前付きパラメータのjava.util.Dictionary
を取ります。通常、リクエストにString
値パラメータを追加するには、Hashtable
を使用し、そのput(name,value)
メソッドをコールします。複数値のパラメータを追加する場合は、String
型の値ではなくString[]
型の値のみを使用します。
<xsql:if-param>
アクションを使用すると、ある条件が真である場合に、このアクション内にネストされている要素およびアクションを条件付きで挿入できます。条件が真として評価される場合は、すべてのネストされたXMLコンテンツおよびアクションがページに挿入されます。条件が偽として評価される場合は、ネストされたXMLコンテンツまたはアクションはいずれも挿入されません(したがって、ネストされたアクションは実行されません)。
評価するパラメータ値を指定するには、必要なname
属性を指定します。単純なパラメータの名前と配列パラメータの名前の両方を指定できます。
パラメータ値(配列の場合は複数)のテスト方法を指定するために、name属性の他に次の5つの属性のいずれかを使用する必要があります。
exists="yes"
またはexists="no"
exists="yes"
を使用する場合、名前付きパラメータが存在するかどうか、そして値が空でないかどうかがテストされます。配列値パラメータについては、配列パラメータが存在し、空ではない要素が1つ以上含まれているかどうかがテストされます。exists="no"
を使用する場合、パラメータが存在しないとき、または存在するが値が空であるときに真と評価されます。配列値パラメータについては、パラメータが存在しないとき、または配列要素がすべて空であるときに真と評価されます。
equals="stringValue"
名前付きパラメータと指定された文字列値が等しいかどうかがテストされます。デフォルトでは、文字列が完全一致するかどうかが比較されます。配列値パラメータについては、配列内の任意の要素に指定された値が含まれているかどうかがテストされます。
not-equals="stringValue"
名前付きパラメータと指定された文字列値が等しくないかどうかがテストされます。配列値パラメータについては、配列内の要素のいずれにも指定された値が含まれていないときに真と評価されます。
in-list="comma-or-space-separated-list"
名前付きパラメータが指定されたリスト内の文字列のいずれかに一致するかどうかがテストされます。文字列内にカンマが検出された場合、そのカンマはデリミタとして使用され、それ以外の場合は空白がデリミタとして使用され、in-list
パラメータの値が配列にトークン化されます。配列値パラメータについては、配列内の任意の要素がリスト内の要素に一致するかどうかがテストされます。
not-in-list="comma-or-space-separated-list"
名前付きパラメータが指定されたリスト内の文字列のいずれかに一致しないかどうかがテストされます。文字列内にカンマが検出された場合、そのカンマはデリミタとして使用され、それ以外の場合は空白がデリミタとして使用され、not-in-list
パラメータの値が配列にトークン化されます。配列値パラメータについては、配列内の要素がいずれもリスト内の任意の要素に一致しないかどうかがテストされます。
equals
、not-equals
,in-list
およびnot-in-list
のテストの場合、デフォルトでは、文字列が完全一致するかどうかが比較されます。一致の比較で大/小文字を区別しない場合は、ignore-case="yes"
属性も指定してください。
その他のXSQLアクションも同様に、<xsql:if-param>
アクションのすべての属性に、字句置換パラメータ式(たとえば、{@paramName}
)を必要に応じて含めることができます。
任意のXMLコンテンツおよびXSQLアクション・ハンドラ要素(またはXSQLアクション・ハンドラ要素)を、<xsql:if-param>
内で必要に応じて別の<xsql:if-param>
要素を含めてネストできます。
たとえば2つの異なる条件が真であるかどうかをテストするには、次のように<xsql:if-param>
要素をネストして使用できます。
<!-- | Set page param 'foo' to value "bar" if parameter 'a' | exists, and if parameter 'b' has value equal to "X" +--> <xsql:if-param name="a" exists="yes"> <xsql:if-param name="b" equals="X"> <xsql:set-page-param name="foo" value="bar"/> </xsql:if-param> </xsql:if-param>
注意: テスト対象のパラメータが存在しない場合は、偽と評価されます。 |
多くの場合、アクョンの実行中に致命的ではないエラーが発生したかどうかを確認する場合に便利です。たとえば、行の挿入またはストアド・プロシージャのコールがデータベース例外で失敗することがあります。これは、<xsql-error>
要素としてXSQLデータ・ページに挿入することができます。
組込みXSQLアクションで致命的でないエラーが報告された場合、そのアクションにページのプライベート・パラメータをオプションで設定できます。この機能を有効にするには、アクションにerror-param
属性を使用します。
たとえば、<xsql:dml>
アクション内の文でデータベース・エラーが発生した場合に"dml-error
"という名前のパラメータを設定するには、次のようなアクションを使用します。
<xsql:dml error-param="dml-error" bind-params="val"> insert into yourtable(somecol) values(?) </xsql:dml>
このアクションを実行したときにエラーが発生すると、dml-error
という名前のページのプライベート・パラメータが文字列"Error
"に設定されます。
アクションの実行が成功した場合、エラー・パラメータに値は割り当てられません。前述の例では、ページのプライベート・パラメータdml-error
がすでに存在する場合、現行の値が維持されます。存在しない場合、このパラメータが出現することはありません。
この新しいエラー・パラメータを<xsql:if-param>
と組み合せて使用することで、XSQLページ・テンプレート内で条件付き動作を実行できます。これはアクションが成功するか失敗するかによって異なります。たとえば、XSQL構成ファイル(デフォルトではXSQLConfig.xml
)内で、demoという名前の接続で接続定義のAUTOCOMMIT
フラグをfalse
に設定した場合、次のページに、先行するアクションで行った変更が、後続のアクションでエラーが発生した場合にどのようにロールバックされるかを示します。
<!-- NOTE: Connection "demo" must not set to autocommit! --> <page connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:dml error-param="dml-error" bind-params="val"> insert into yourtable(somecol) values(?) </xsql:dml> <!-- This second statement will commit if it succeeds --> <xsql:dml commit="yes" error-param="dml-error" bind-params="val2"> insert into anothertable(anothercol) values(?) </xsql:dml> <xsql:if-param name="dml-error" exists="yes"> <xsql:dml>rollback</xsql:dml> </xsql:if-param> </page>
カスタム・アクション・ハンドラを作成済で、カスタム・アクションがreportMissingAttribute()
、reportError()
またはreportErrorIncludingStatement()
をコールして致命的でないアクション・エラーを通知する場合、この新しい機能も自動的に使用されます。
<xsql:include-xsql>
アクションでは、XSQLページの結果を別のページに簡単に挿入できます。このアクションを使用すると、すでに作成したページからコンテンツを簡単に集約して、そのコンテンツを別の目的に使用できます。次の例では、<xsql:include-xsql>
の最も一般的な2つの使用方法について説明します。
ディスカッション・フォーラムのカテゴリを示す次のXSQLページがあるとします。
<!-- Categories.xsql --> <xsql:query connection="forum" xmlns:xsql="urn:oracle-xsql"> SELECT name FROM categories ORDER BY name </xsql:query>
このページの結果を、次のように現行のフォーラムで最新の10個のトピックを示すページに挿入できます。
<!-- TopTenTopics.xsql --> <top-ten-topics connection="forum" xmlns:xsql="urn:oracle-xsql"> <topics> <xsql:query max-rows="10"> SELECT subject FROM topics ORDER BY last_modified DESC </xsql:query> </topics> <categories> <xsql:include-xsql href="Categories.xsql"/> </categories> </top-ten-topics>
<xsql:include-xsql>
を使用して既存のページを挿入し、挿入されたページに対してXSLTスタイルシートも適用できます。その場合、次の2つの異なるXSLTスタイルシートを使用します。
cats-as-html.xsl
(HTMLでのトピックのレンダリング用)
cats-as-wml.xsl
(WMLでのトピックのレンダリング用)
この場合、2つの異なるタイプのデバイスに対応するための1つの方法は、各デバイス用に異なるXSQLページを作成することです。次のページを作成できます。
<?xml version="1.0"?>
<!-- HTMLCategories.xsql -->
<?xml-stylesheet type="text/xsl" href="cats-as-html.xsl"?>
<xsql:include-xsql href="Categories.xsql" xmlns:xsql="urn:oracle-xsql"/>
このページは、Categories.xsql
を集約して、cats-as-html.xsl
スタイルシートを適用します。次のような別のページがあるとします。
<?xml version="1.0"?> <!-- WMLCategories.xsql --> <?xml-stylesheet type="text/xsl" href="cats-as-html.xsl"?> <xsql:include-xsql href="Categories.xsql" xmlns:xsql="urn:oracle-xsql"/>
Categories.xsql
を集約し、cats-as-wml.xsl
スタイルシートを適用してモバイル機器に配信します。この場合、再利用可能なCategories.xsqlページのコンテンツを2つの異なる方法で別の用途に使用しました。
集約されているページに<?xml-stylesheet?>
処理命令が含まれている場合は、結果が集約される前にこのスタイルシートが適用されます。そのため、<xsql:include-xsql>
を使用して、XSLTスタイルシートの適用を容易に連鎖させることができます。
1つのXSQLページが<xsql:include-xsql>
を使用して他のページのコンテンツを集約する場合、ネストしたページはリクエスト・レベルのすべてのパラメータを参照できます。XSQLサーブレットが処理するページでは、セッション・レベルのパラメータおよびCookieも含まれます。予測どおり、集約側のページのプライベート・パラメータは、ネストしたページからは参照できません。
表8-9に、このアクションがサポートする属性を示します。太字の属性は必須です。
表8-9 <xsql:include-xsql>の属性
属性名 | 説明 |
---|---|
href = "string" |
挿入するXSQLページの相対URLまたは絶対URL。 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
reparse = "boolean" |
挿入されたXSQLページの出力を挿入前に再解析するかどうかを指定します。この属性は、挿入側のページが要素として処理する必要があるXML文書のフラグメントのテキストを、挿入されたXSQLページが選択している場合に有効です。有効な値は、 |
Oracle9iでは、XMLベースのデータベース・コンテンツの格納および問合せに使用するXMLTypeが導入されました。データベースXML機能を使用して、次の2つのいずれかの方法でXSQLページに挿入するXMLを生成できます。
<xsql:query>
: XMLType型の列を含む問合せを処理します。ただし、CLOB/VARCHAR2列内のXMLマークアップはリテラル・テキストとして処理されます。
<xsql:include-xml>
: 問合せから取得した1つのCLOBまたは文字列ベースのXML文書を解析し、挿入します。
この2つの方法の相違は、<xsql:include-xml>
アクションは、CLOBまたは文字列値内のリテラルXMLを解析し、すぐに要素および属性のツリーとして表現する一方で、<xsql:query>
アクションは、CLOBまたは文字列の値列内のXMLマークアップをリテラル・テキストのままにしておくという点です。
もう1つの相違は、<xsql:query>
は任意の数の列および行の問合せ結果を処理できますが、<xsql:include-xml>
は、1つの行の1つの列を処理するように設計されている点です。このため、<xsql:include-xml>
を使用すると、そこに含まれるSELECT文は、1つの列を含む1つの行を戻します。この列は、整形式のXML文書を含むCLOBまたはVARCHAR2値です。このXML文書は、解析されてXSQLページに挿入されます。
次の例では、ネストしたXmlAgg()
関数を使用して、部門およびネストした従業員を含む動的に作成されたXML文書の結果を、<DepartmentList>
要素内にラップして1つのXML結果文書に集約します。
<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql"> select XmlElement("DepartmentList", XmlAgg( XmlElement("Department", XmlAttributes(department_id as "Id"), XmlForest(department_name as "Name"), (select XmlElement("Employees", XmlAgg( XmlElement("Employee", XmlAttributes(employee_id as "Id"), XmlForest(first_name||' '||last_name as "Name", salary as "Salary", job_id as "Job") ) ) ) from employees e where e.department_id = d.department_id ) ) ) ) as result from departments d order by department_name </xsql:query>
別の例として、MOVIES
というXMLType
の表に多数の<Movie>というXML文書が格納されているとします。各文書は次のようになっています。
<Movie Title="The Talented Mr.Ripley" RunningTime="139" Rating="R"> <Director> <First>Anthony</First> <Last>Minghella</Last> </Director> <Cast> <Actor Role="Tom Ripley"> <First>Matt</First> <Last>Damon</Last> </Actor> <Actress Role="Marge Sherwood"> <First>Gwyneth</First> <Last>Paltrow</Last> </Actress> <Actor Role="Dickie Greenleaf"> <First>Jude</First> <Last>Law</Last> <Award From="BAFTA" Category="Best Supporting Actor"/> </Actor> </Cast> </Movie>
組込みOracle XPath問合せ機能を使用すると、データベース内のすべての映画から、アカデミー賞を受賞したすべての出演者の集約リストを次のような問合せによって抽出できます。
select xmlelement("AwardedActors", xmlagg(extract(value(m), '/Movie/Cast/*[Award[@From="Oscar"]]'))) from movies m
このXMLType
の問合せ結果をXSQLページに挿入するには、<xsql:query>
要素の中に問合せを貼り付けて、必ず問合せ式の別名(as resultなど)を挿入します。
<xsql:query connection="orcl92" xmlns:xsql="urn:oracle-xsql"> select xmlelement("AwardedActors", xmlagg(extract(value(m), '/Movie/Cast/*[Award[@From="Oscar"]]'))) as result from movies m </xsql:query> Note that again we use the combination of xmlelement() and xmlagg() to have the database aggregate all of the XML fragments identified by the query into single, well-formed XML document. The combination of xmlelement() and xmlagg() work together to produce a well-formed result like this: <AwardedActors> <Actor>...</Actor> <Actress>...</Actress> </AwardedActors>
バインド変数を式に連結する場合は、XPath式の途中で標準のXSQLページ・バインド変数機能を使用することもできます。たとえば、値Oscarをaward-fromという名前のパラメータにするには、XSQLページを次のように使用できます。
<xsql:query connection="orcl92" xmlns:xsql="urn:oracle-xsql" award-from="Oscar" bind-params="award-from"> /* Using a bind variable in an XPath expression */ select xmlelement("AwardedActors", xmlagg(extract(value(m), '/Movie/Cast/*[Award[@From="'|| ? ||'"]]'))) as result from movies m </xsql:query>
XSQL Pagesフレームワークは、XMLコンテンツの作成および変換のみでなく、ポストされたXMLコンテンツの処理も簡単にします。組込みアクションでは、XML文書形式およびHTML形式のポストされた情報の処理が簡単になります。また、Oracle XML SQL Utilityの基礎となる機能を使用して、この情報をデータベース表に直接ポストできます。
XML SQL Utilityでは、ターゲット表またはビューに必要な正規の形式のXML文書のコンテンツに基づいて、データベースの挿入、更新および削除機能を実行します。特定のデータベース表では、そのデータの正規のXML形式は、データベースに対するSELECT * FROM
tablename
問合せからのXML出力の1行によって指定されます。この正規の形式でXML文書が指定される場合、XML SQL Utilityでは挿入、更新および削除を自動化できます。XML SQL UtilityとXSLT変換を組み合せることで、すべての形式のXMLを特定の表に対して適切な正規の形式に変換できます。変換後、結果として戻る正規のXMLの挿入、更新および削除をXML SQL Utilityにリクエストできます。
次の組込みXSQLアクションを使用すると、この機能をXSQLページ内から簡単に使用できます。
<xsql:insert-request>
リクエストでポストされ、オプションで変換されたXML文書を表に挿入します。表8-10に、このアクションがサポートする必須属性とオプションの属性を示します。
<xsql:update-request>
リクエストでポストされ、オプションで変換されたXML文書を表またはビューに更新します。表8-11に、このアクションがサポートする必須属性とオプションの属性を示します。
<xsql:delete-request>
リクエストでポストされ、オプションで変換されたXML文書を表またはビューから削除します。表8-12に、このアクションがサポートする必須属性とオプションの属性を示します。
<xsql:insert-param>
リクエスト・パラメータの値としてポストされ、オプションで変換されたXML文書を表またはビューに挿入します。表8-13に、このアクションがサポートする必須属性とオプションの属性を示します。
データベース・ビューを挿入のターゲットにする場合、そのビューに対するINSTEAD OF INSERT
トリガーを作成し、ポストされた情報の処理をさらに自動化することができます。たとえば、ビューのINSTEAD OF INSERT
トリガーは、PL/SQLを使用してレコードの有無を確認し、その確認結果に応じてINSERT
またはUPDATE
のどちらを実行するかを効果的に選択できます。
表8-10 <xsql:insert-request>の属性
属性名 | 説明 |
---|---|
table = "string" |
XML情報の挿入に使用する表、ビューまたはシノニムの名前。 |
transform = "URL" |
挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。 |
columns = "string" |
値を挿入する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。列名を指定すると、指定された列のみが挿入されます。列名を指定しない場合は、すべての列が挿入され、値がXML文書に表示されない列にはNULL値が指定されます。 |
commit = "boolean" |
|
commit-batch-size = "integer" |
0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。 |
date-format = "string" |
挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
表8-11 <xsql:update-request>の属性
属性名 | 説明 |
---|---|
table = "string" |
XML情報の挿入に使用する表、ビューまたはシノニムの名前。 |
key-columns = "string" |
ポストされたXML文書の値が更新する既存の行の識別に使用する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。 |
transform = "URL" |
挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。 |
columns = "string" |
値を更新する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。列名を指定すると、指定された列のみが更新されます。列名を指定しない場合は、すべての列が更新され、値がXML文書に表示されない列にはNULL値が指定されます。 |
commit = "boolean" |
|
commit-batch-size = "integer" |
0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。 |
date-format = "string" |
挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
表8-12 <xsql:delete-request>の属性
属性名 | 説明 |
---|---|
table = "string" |
XML情報の挿入に使用する表、ビューまたはシノニムの名前。 |
key-columns = "string" |
ポストされたXML文書の値が更新する既存の行の識別に使用する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。 |
transform = "URL" |
挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。 |
commit = "boolean" |
|
commit-batch-size = "integer" |
0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
表8-13 <xsql:insert-param>の属性
属性名 | 説明 |
---|---|
name = "string" |
挿入されるXMLを値に含むパラメータの名前。 |
table = "string" |
XML情報の挿入に使用する表、ビューまたはシノニムの名前。 |
transform = "URL" |
挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。 |
columns = "string" |
値を挿入する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。列名を指定すると、指定された列のみが挿入されます。列名を指定しない場合は、すべての列が挿入され、値がXML文書に表示されない列にはNULL値が指定されます。 |
commit = "boolean" |
|
commit-batch-size = "integer" |
0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。 |
date-format = "string" |
挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、 |
error-param = "string" |
ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列' |
XSQL Pagesフレームワークでは、ポストされた情報を3つの異なる方法で処理できます。
クライアント・プログラムは、XSQLページをターゲットとするHTTP POSTメッセージを送信できます。そのリクエストの本体にはXML文書を含み、HTTPヘッダーに"text/xml
"のContentType
を指定します。
この場合、<xsql:insert-request>
、<xsql:update-request>
または<xsql:delete-request>
アクションを使用して、ポストされたXMLのコンテンツを指定したとおりにターゲット表で挿入、更新または削除できます。XSLT変換を使用してポストされたXML文書を変換する場合、ポストされたXML文書がこの変換のソース・ドキュメントです。
クライアント・プログラムは、パラメータの1つにXML文書を含む、XSQLページに対するHTTP GETリクエストを送信できます。
この場合、<xsql:insert-param>
アクションを使用して、ポストされたXMLパラメータ値のコンテンツを指定したとおりにターゲット表に挿入できます。XSLT変換を使用してポストされたXML文書を変換する場合、パラメータ値内のXML文書がこの変換のソース・ドキュメントです。
ブラウザは、アクションがXSQLページをターゲットとする、method
="POST"
が設定されたHTMLフォームを送信できます。この場合、慣例によりブラウザはHTTP POSTメッセージを送信し、そのリクエスト本体は、エンコードされたHTMLフォーム・フィールドおよびその値を含み、ContentTypeを"application/x-www-form-urlencoded
"に指定します。
この場合、このリクエストはXML文書を含みません。かわりに、エンコードされたフォーム・パラメータを含みます。ただし、これらの3つの場合を同等にするために、XSQL Page Processorは(必要に応じて)リクエストに含まれるフォーム・パラメータ、セッション変数およびCookieのセットからXML文書を生成します。次にXSLT変換は、<xsql:insert>
、<xsql:update-request>
または<xsql:delete-request>
をそれぞれ使用して、この動的マテリアライズドXML文書を挿入、更新および削除するために正規の形式に変換します。
ポストされたHTMLフォームを使用する場合、動的マテリアライズドXML文書は次に示す形式になります。
<request> <parameters> <firstparamname>firstparamvalue</firstparamname> ... <lastparamname>lastparamvalue</lastparamname> </parameters> <session> <firstparamname>firstsessionparamvalue</firstparamname> ... <lastparamname>lastsessionparamvalue</lastparamname> </session> <cookies> <firstcookie>firstcookievalue</firstcookiename> ... <lastcookie>firstcookievalue</lastcookiename> </cookies> </request>
複数のパラメータが同じ名前でポストされた場合、自動的にrowで分けられ、以降の処理が簡単になります。たとえば、次のパラメータをポストするまたは含むリクエストがあるとします。
id
= 101
name
= Steve
id
= 102
name
= Sita
operation
= update
次のような、rowで分けられたパラメータのセットが作成されます。
<request> <parameters> <row> <id>101</id> <name>Steve</name> </row> <row> <id>102</id> <name>Sita</name> </row> <operation>update</operation> </parameters> ... </request>
リクエスト・パラメータを含むこのマテリアライズされたXML文書をターゲット表の正規の形式に変換するXSLTスタイルシートの指定が必要になるため、次のようなXSQLページの作成に役立つ場合があります。
<!-- | ShowRequestDocument.xsql | Show Materialized XML Document for an HTML Form +--> <xsql:include-request-params xmlns:xsql="urn:oracle-xsql"/>
このページを適切に使用すると、HTMLフォームを一時的に変更して、ShowRequestDocument.xsql
ページにポストできます。また、ブラウザで、マテリアライズドXMLリクエスト・ドキュメントの未加工のXMLが表示されます。このXMLは、保存してXSLT変換を展開するために使用できます。
組込みアクション・ハンドラで処理されないタスクを実行する必要がある場合、XSQL Pagesフレームワークでは、カスタム・アクションを起動して、必要なジョブをページ処理の一部として実質的に行うことができます。カスタム・アクションは、任意のXMLコンテンツをデータ・ページに提供し、任意の処理を実行することができます。Javaでのカスタム・アクション・ハンドラの作成の詳細は、この章で後述する「カスタムXSQLアクション・ハンドラの作成」を参照してください。ここでは、カスタム・アクション・ハンドラがすでに作成されたものとしてその使用方法を見ていきます。
カスタム・アクション・ハンドラを起動するには、組込み<xsql:action>
アクション・ハンドラ要素を使用します。この要素には、handler
という単一の必須属性があり、その値は起動するアクションの完全修飾Javaクラス名です。このクラスはoracle.xml.xsql.XSQLActionHandler
インタフェースを実装する必要があります。次に例を示します。
<xsql:action handler="yourpackage.YourCustomHandler"/>
通常の方法では、任意の数の追加属性をハンドラに指定できます。たとえば、yourpackage.YourCustomHandler
にparam1
およびparam2
という名前の属性が必要である場合、次の構文を使用します。
<xsql:action handler="yourpackage.YourCustomHandler" param1="xxx" param2="yyy"/>
一部のアクション・ハンドラでは、属性に加えて、テキスト・コンテンツまたは要素コンテンツを<xsql:action>
要素内で使用する場合があります。この場合、次のような構文の使用が考えられます。
<xsql:action handler="yourpackage.YourCustomHandler" param1="xxx" param2="yyy"> Some Text Goes Here </xsql:action>
または次の構文を使用します。
<xsql:action handler="yourpackage.YourCustomHandler" param1="xxx" param2="yyy"> <some> <other/> <elements/> <here/> </some> </xsql:action>
表8-14に、ソフトウェアで提供される./demo
ディレクトリ内のXSQLサーブレットのサンプル・アプリケーションを示します。
表8-14 XSQLサーブレットのサンプル
デモ・データを設定するには、次の手順を実行します。
ディレクトリを./demo
ディレクトリに変更します。
このディレクトリでSQLPLUSを実行します。Oracle Text(Intermedia Text)パッケージのスキーマ所有者であるCTXSYS/CTXSYSとしてデータベースに接続して、次のコマンドを発行します。
GRANT EXECUTE ON ctx_ddl TO scott;
SYSTEM/MANAGERとしてデータベースに接続して、次のコマンドを発行します。
GRANT QUERY REWRITE TO scott;
これによって、SCOTTは、デモの1つが空港の説明に基づく大/小文字を区別しない問合せを実行するために使用するファンクション索引を作成できるようになります。
SCOTT/TIGERとしてデータベースに接続します。
スクリプトinstall.sql
を./demo
ディレクトリで実行します。このスクリプトは、すべてのデモ用のすべてのSQLスクリプトを実行します。
install.sql @@insclaim/insclaim.sql @@document/docdemo.sql @@classerr/invalidclasses.sql @@airport/airport.sql @@insertxml/newsstory.sql @@empdept/empdeptobjs.sql
ディレクトリを./doyouxml
サブディレクトリに変更して、次のコマンドを実行します。
imp scott/tiger file=doyouxml.dmp
Do You XML? Siteデモ用のサンプル・データがインポートされます。
SVGのデモンストレーションを体験するには、Adobe社製のSVG Plug-inなどのSVGプラグインをブラウザにインストールします。
これらの項では、XSQLページの高度なトピックについて説明します。
デフォルトでは、XSQL Pagesフレームワークの構成ファイルの名前はXSQLConfig.xml
です。開発用、テスト用、本番用というように、使用する環境に応じてXSQL構成ファイルのバージョンを簡単に切り替えることができます。XSQL Page Processorで読み取る構成ファイルの名前をオーバーライドするには、次のいずれかを実行します。
Javaシステム・プロパティxsql.config
を設定します。サーブレット初期化パラメータxsql.config
を定義することで、-Dxsql.config=
MyConfigFile.xml
などのJVMコマンドライン・フラグを指定するのが最も簡単な方法です。
この設定を行うには、次に示すように、XSQLサーブレットを定義する<servlet>
タグの一部として<init-param>
要素をweb.xml
ファイルに追加します。
: <servlet> <servlet-name>XSQL</servlet-name> <servlet-class>oracle.xml.xsql.XSQLServlet</servlet-class> <init-param> <param-name>xsql.config</param-name> <param-value>MyConfigFile.xml</param-value> <description> Please Use MyConfigFile.xml instead of XSQLConfig.xml </description> </init-param> </servlet> :
もちろん、サーブレット初期化パラメータを使用できるのは、XSQLページ・エンジンをサーブレット・ベースで使用する場合のみです。XSQLCommandLine
またはXSQLRequest
プログラム・インタフェースを使用する場合は、かわりにSystemパラメータを使用してください。
注意: 構成ファイルは、常にCLASSPATHから読み取られます。たとえば、MyConfigFile.xml という名前のカスタム構成パラメータ・ファイルを指定すると、XSQL Page ProcessorはこのXMLファイルをCLASSPATHからのリソースとして読み取ろうとします。したがって、J2EE形式のサーブレット環境では、MyConfigFile.xml を.\WEB-INF\classes ディレクトリ(またはCLASSPATHで検出される最上位ディレクトリ)に格納する必要があります。サーブレット初期化パラメータとSystemパラメータの両方が指定されている場合は、サーブレット初期化パラメータの値が使用されます。
|
リクエスト中の現行のXSQLページが許可する場合、リクエストでXSLTスタイルシートのURLを指定して、使用するデフォルトのスタイルシートをオーバーライドしたり、デフォルトでは何も適用されない場合にスタイルシートを適用したりすることができます。クライアントが起動するスタイルシートURLは、xml-stylesheet
パラメータをリクエストの一部として指定することによって、指定されます。このパラメータの有効値は次のとおりです。
処理中のXSQLページに対して相対的に解析されるすべての相対URL
HTTPプロトコル・スキームを使用し、(デフォルトではXSQLConfig.xml
というXSQL構成ファイルの定義に従って)トラステッド・ホストを参照するすべての絶対URL
リテラル値none
この最後の値xml-stylesheet=none
は、開発中、XSLTスタイルシートの処理を一時的に短絡させてスタイルシートが実際に参照しているXMLデータグラムを確認する場合に特に有用です。この方法は、スタイルシートによって期待した結果が生成されない理由を確認する場合に役立ちます。
XSQLページ用スタイルシートのクライアントによるオーバーライドは、次のいずれかの方法で使用禁止にすることができます。
XSQL構成ファイルでallow-client-style
構成パラメータをno
に設定します。
XSQLページのドキュメント要素に対して、allow-client-style="no"
属性を明示的に挿入します。
XSQL構成ファイルでクライアントによるスタイルシートのオーバーライドがデフォルトでグローバルに無効になっている場合でも、すべてのページで、そのページのドキュメント要素に対してallow-client-style="yes"
属性を挿入することによって、クライアントによるオーバーライドを明示的に使用可能にできます。
ここではいくつかの重要項目について説明します。
提供する情報のコンテンツ・タイプを設定することは非常に重要です。コンテンツ・タイプを設定することにより、リクエスト側クライアントは、戻された情報を正しく解析できます。スタイルシートで<xsl:output>
要素を使用する場合、XSQL Page Processorは、<xsl:output>
のmedia-type
属性およびencoding
属性から、戻されたドキュメントのメディア・タイプおよびエンコーディングを推測します。
たとえば次のスタイルシートでは、<xsl:output>
に対してmedia-type="application/vnd.ms-excel"
属性を使用して、HRスキーマのemployees
表に対する標準の問合せを含むXSQLページの結果をMicrosoft Excelの表形式に変換します。
<?xml version="1.0"?> <!-- empToExcel.xsl --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" media-type="application/vnd.ms-excel"/> <xsl:template match="/"> <html> <table> <tr><th>Id</th><th>Email</th><th>Salary</th></tr> <xsl:for-each select="ROWSET/ROW"> <tr> <td><xsl:value-of select="EMPLOYEE_ID"/></td> <td><xsl:value-of select="EMAIL"/></td> <td><xsl:value-of select="SALARY"/></td> </tr> </xsl:for-each> </table> </html> </xsl:template> </xsl:stylesheet>
このスタイルシートを使用するXSQLページを次に示します。
<?xml version="1.0"?> <?xml-stylesheet href="empToExcel.xsl" type="text/xsl"?> <xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql"> select EMPLOYEE_ID, EMAIL, SALARY from employees order by salary desc </xsql:query>
これまで見てきたように、<?xml-stylesheet?>
処理命令を.xsql
ファイルの最上部に挿入すると、XSQL Page Processorは結果として生成されるXMLデータグラムの変換にそれを使用することを検討します。次に例を示します。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="emp.xsl"?> <page connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:query> SELECT * FROM employees ORDER BY salary DESC </xsql:query> </page>
この例では、emp.xsl
スタイルシートを使用して、リクエスタにレスポンスを戻す前にemployees
問合せの結果をサーバー層で変換します。このスタイルシートは、<?xml-stylesheet?>
処理命令に対するhref
擬似属性で指定される相対URLまたは絶対URLによってアクセスされます。
href
擬似属性の値に1つ以上のパラメータ参照を挿入することで、スタイルシート名を動的に決定できます。たとえば、このページでは、問合せを使用してページのプライベート・パラメータの値を割り当てることによって、使用するスタイルシートの名前を表から選択します。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="{@sheet}.xsl"?> <page connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:set-page-param bind-params="UserCookie" name="sheet"> SELECT stylesheet_name FROM user_prefs WHERE username = ? </xsql:set-page-param> <xsql:query> SELECT * FROM employees ORDER BY salary DESC </xsql:query> </page>
Microsoft Internet Explorer 5.0以上などの一部のブラウザは、クライアントでのXSLTスタイルシートの処理をサポートします。これらのブラウザは、<?xml-stylesheet?>
処理命令を使用して、サーバー側のXSQLページと同様の方法でXML文書用に処理されるスタイルシートを認識します。これは偶然の一致ではありません。この目的に<?xml-stylesheet?>
を使用することは、1999年6月29日に公開されたW3C勧告「Associating Stylesheets with XML Documents, Version 1.0」の一部です。
デフォルトでは、XSQL Page ProcessorはXSLT変換をサーバーで実行します。ただし、追加の疑似属性client="yes"
をXSQLページの<?xml-stylesheet?>
処理命令に追加することにより、クライアントに対するXSLT処理を遅延できます。ドキュメントの最上部に現行の<?xml-stylesheet?>
が挿入された状態で未加工のXMLデータグラムが提供されます。
ここで重要な点は、1998年後半に出荷されたInternet Explorer 5.0には、1998年12月の標準の草案に準拠したXSLスタイルシート言語の実装が含まれていることです。最終的に公開された1999年11月のXSLT 1.0勧告は、IE5がベースとする初期バージョンの草案から大幅に変更されています。つまり、IE5ブラウザでは、XSLT 1.0勧告の構文を実装する他のすべてのXSLTプロセッサ(Oracle XSLT Processorなど)とは異なるXSLTのダイアレクトを理解することを意味します。
2000年末にかけて、Microsoft社はMSXMLコンポーネントのバージョン3.0をWeb上からダウンロード可能なリリースとして公開しました。この最新バージョンはXSLT 1.0標準を実装していますが、IE5ブラウザの内部でこれをXSLT Processorとして使用するには、追加のインストール手順を実行する必要があります。IE5ブラウザが最新のXSLTコンポーネントをインストールしたかどうかをサーバーで検出する方法はありません。そのため、デフォルトで最新のコンポーネントを搭載し、バージョン番号6.0を含む検出可能な異なるユーザー・エージェント文字列を送信するInternet Explorer 6.0がリリースされるまで、IE5ブラウザに配信されるクライアント処理用のスタイルシートでは初期のIE5版のXSLを使用する必要があります。
リクエストを行うユーザー・エージェントに応じて異なるスタイルシートをXSQLページが使用するようにリクエストする方法が必要です。XSQL Pagesフレームワークでは、この操作を容易に行えます。次の項ではその方法を学びます。
複数の<?xml-stylesheet?>
処理命令をXSQLページの最上部に挿入して、この命令にオプションのmedia
疑似属性を指定できます。media
擬似属性の値を指定すると、その値は大/小文字を区別しないでHTTPヘッダーのユーザー・エージェント文字列の値と比較されます。media
擬似属性の値がユーザー・エージェント文字列の一部と一致した場合、プロセッサは現行の<?xml-stylesheet?>
処理命令を選択して使用します。一致しなかった場合は、その処理命令を無視して、検索を続けます。ドキュメント内の順序で最初に一致した処理命令が使用されます。media
擬似属性がない処理命令は、すべてのユーザー・エージェントと一致するため、代替またはデフォルトとして使用できます。
たとえば、.xsqlファイルの最上部に次の処理命令があるとします。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" media="lynx" href="doyouxml-lynx.xsl" ?> <?xml-stylesheet type="text/xsl" media="msie 5" href="doyouxml-ie.xsl" ?> <?xml-stylesheet type="text/xsl" href="doyouxml.xsl" ?> <page xmlns:xsql="urn:oracle-xsql" connection="demo"> ...
この処理命令では、Lynxブラウザの場合はdoyouxml-lynx.xsl
を、Internet Explorer 5.0または5.5ブラウザの場合はdoyouxml-ie.xsl
を、およびその他のすべてのブラウザの場合はdoyouxml.xsl
を使用します。
表8-15に、<?xml-stylesheet?>
処理命令に対して使用可能な、サポートされる擬似属性の概要を示します。
表8-15 <?xml-stylesheet?>の擬似属性
属性名 | 説明 |
---|---|
type = "string" |
対応付けられたスタイルシートのMIMEタイプを指定します。XSLTスタイルシートの場合、この属性は文字列
|
href = "URL" |
使用するXSLTスタイルシートへの相対URLまたは絶対URLを指定します。 |
media = "string" |
この属性はオプションです。指定した場合、リクエスト側デバイスが送信したHTTPヘッダーの |
client = "boolean" |
|
serializer = "string" |
デフォルトでは、XSQL Page Processorは次のシリアライザを使用します。
この擬似属性を指定すると、前述のコードのかわりにカスタム・シリアライザの実装を使用する必要があります。 有効値は、XSQL構成ファイル(デフォルトでは |
XSQL構成ファイル(デフォルトではXSQLConfig.xml
)を使用して、XSQLページ環境をチューニングできます。表8-16に、設定可能なすべてのパラメータを定義します。
表8-16 XSQL構成ファイルの設定
構成設定名 | 説明 |
---|---|
XSQLConfig/servlet/output-buffer-size |
バッファ付き出力ストリーム・サイズ(バイト単位)を設定します。サーブレット・エンジンがすでにI/Oをサーブレット出力ストリームにバッファリング済である場合は、 デフォルト値は |
XSQLConfig/servlet/suppress-mime-charset/media-type |
XSQLサーブレットは、HTTP 任意の数の 有効値はすべての文字列です。 |
XSQLConfig/processor/character-set-conversion/default-charset |
デフォルトでは、HTTPパラメータの値に基づいてXSQL Page Processorでキャラクタ・セット変換が行われ、ほぼすべてのサーブレット・エンジンが使用するデフォルトのキャラクタ・セットを補完します。変換に使用されるデフォルトのベース・キャラクタ・セットは、IANAの キャラクタ・セット変換を抑制するには、 有効値は、すべてのJavaキャラクタ・セット名または |
XSQLConfig/processor/reload-connections-on-error |
XSQL Page Processorを初期化すると、接続定義がキャッシュされます。 デフォルト値は |
XSQLConfig/processor/default-fetch-size |
データベースからSQL問合せを使用して情報を取得するための行のフェッチ・サイズのデフォルト値を設定します。この設定は、Oracle JDBC Driverを使用している場合にのみ有効です。それ以外の場合は無視されます。異なる層で実行中のサーブレット・エンジンからデータベースへのネットワーク・ラウンドトリップの削減に役立ちます。 デフォルト値は |
XSQLConfig/processor/page-cache-size |
XSQLページ・テンプレート用のXSQLキャッシュ・サイズを設定します。この設定は、キャッシュされるXSQLページの最大数を決定します。この最大数を超えると、最も使用頻度の少ないページがキャッシュから削除されます。 デフォルト値は |
XSQLConfig/processor/stylesheet-cache-size |
XSLTスタイルシート用のXSQLキャッシュ・サイズを設定します。この設定は、キャッシュされるスタイルシートの最大数を決定します。この最大数を超えると、最も使用頻度の少ないスタイルシートがキャッシュから削除されます。 デフォルト値は |
XSQLConfig/processor/stylesheet-pool/initial |
実際に、キャッシュされた各スタイルシートは、スループットを改善するためにキャッシュされたスタイルシート・インスタンスのプールです。この構成設定は、各スタイルシート・プールに対するスタイルシートの初期割当て数を設定します。 デフォルト値は |
XSQLConfig/processor/stylesheet-pool/increment |
サーバー上でのロードが増加したためスタイルシート・プールを拡大する必要がある場合に割り当てるスタイルシートの数を設定します。 デフォルト値は |
XSQLConfig/processor/stylesheet-pool/timeout-seconds |
プールが縮小して初期サイズに戻ろうとするときに、プール内のスタイルシート・インスタンスが削除され、リソースが解放される前の非活動時間(秒)を設定します。 デフォルト値は |
XSQLConfig/processor/connection-pool/initial |
XSQL Page ProcessorのデフォルトのConnection Managerは、接続プーリングを実装して、スループットを改善します。この設定は、各接続プールに対するJDBC接続の初期割当て数を制御します。 デフォルト値は |
XSQLConfig/processor/connection-pool/increment |
サーバー上でのロードが増加したため接続プールを拡大する必要がある場合に割り当てる接続の数を設定します。 デフォルト値は |
XSQLConfig/processor/connection-pool/timeout-seconds |
プールが縮小して初期サイズに戻ろうとするときに、プール内のJDBC接続が削除され、リソースが解放される前の非活動時間(秒)を設定します。 デフォルト値は |
XSQLConfig/processor/connection-pool/dump-allowed |
デフォルト値は |
XSQLConfig/processor/connection-manager/factory |
XSQL Connection Managerファクトリ実装の完全修飾Javaクラス名を指定します。指定しない場合、デフォルトでは デフォルトは |
XSQLConfig/processor/owa/fetch-style |
<xsql:include-owa>アクションが使用するOWAページ・バッファのデフォルトのフェッチ・スタイルを設定します。有効値は、
|
XSQLConfig/processor/timing/page |
XSQL Page Processorが デフォルト値は |
XSQLConfig/processor/timing/action |
XSQL Page Processorがページ内の、アクションの処理に必要な経過時間(秒)を報告するコンテンツを持つアクション・ハンドラ要素のすぐ前にコメントを追加するかどうかを決定します。 デフォルト値は |
XSQLConfig/processor/logger/factory |
カスタムXSQLログ出力ファクトリ実装の完全修飾Javaクラス名を指定します。値を指定しない場合は、ログは出力されません。 有効値は |
XSQLConfig/processor/error-handler/class |
デフォルトのエラー・ハンドラ実装になるカスタムXSQLエラー・ハンドラの完全修飾Javaクラス名を指定します。値を指定しない場合は、デフォルトのエラー・ハンドラが使用されます。 有効値は |
XSQLConfig/processor/xml-parsing/preserve-whitespace |
XSQLページ・テンプレートおよびXSLTスタイルシートの解析時に、XSQL Page Processorで空白を保持するかどうかを決定します。 デフォルト値は |
XSQLConfig/processor/security/stylesheet/defaults/allow-client-style |
アプリケーションの開発中は、特定の 開発が完了すると、 この設定で指定されるのはデフォルト動作のみであることに注意してください。特定のXSQLページのドキュメント要素に対して 有効値は、 |
XSQLConfig/processor/security/stylesheet/trusted-hosts/host |
XSLTスタイルシートは拡張関数を起動できます。特に、XSQL Page ProcessorがすべてのXSLTスタイルシートの処理に使用するOracle XSLT Processorでは、Java拡張関数がサポートされます。通常、XSQLページは相対URLを使用してXSLTスタイルシートを参照します。XSQL Page Processorでは、処理されるXSLTスタイルシートへの絶対URLが構成ファイルに示されている名前を持つトラステッド・ホストからのものになるように強制します。
有効値は、すべてのホスト名またはIPアドレスです。 |
XSQLConfig/http/proxyhost |
HTTPプロトコル・スキームを使用する 有効値は、すべてのホスト名またはIPアドレスです。 |
XSQLConfig/http/proxyport |
HTTPプロトコル・スキームを使用する 有効値は0(ゼロ)以外の整数です。 |
XSQLConfig/connectiondefs/connection |
XSQL Page Processorが使用する名前付き接続のニックネームおよびJDBC接続の詳細を定義します。
|
XSQLConfig/connectiondefs/connection/username |
現行の接続のユーザー名を定義します。 |
XSQLConfig/connectiondefs/connection/password |
現行の接続のパスワードを定義します。 |
XSQLConfig/connectiondefs/connection/dburl |
現行の接続のJDBC接続URLを定義します。 |
XSQLConfig/connectiondefs/connection/driver |
現行の接続に使用するJDBCドライバの完全修飾Javaクラス名を指定します。値を指定しない場合は、デフォルトで |
XSQLConfig/connectiondefs/connection/autocommit |
現行の接続の自動コミット・フラグを明示的に設定します。値を指定しない場合、接続はJDBCドライバの自動コミットのデフォルト設定を使用します。 |
XSQLConfig/serializerdefs/serializer |
名前付きカスタム・シリアライザの実装を定義します。
|
XSQLConfig/serializerdefs/serializer/name |
現行のカスタム・シリアライザ定義の名前を定義します。 |
XSQLConfig/connectiondefs/connection/class |
現行のカスタム・シリアライザの完全修飾Javaクラス名を指定します。このクラスは |
XSQL Pagesフレームワークによるカスタム・シリアライザのサポートを使用すると、oracle.xml.xsql.serializers.XSQLFOPSerializer
でApacheのFOPプロセッサ(http://xml.apache.org/fop)と統合できます。FOPプロセッサは、XSL Formatting Objects(http://www.w3.org/TR/xsl
)を含むXML文書からPDFドキュメントをレンダリングします。
たとえば、次のXSLTスタイルシートEmpTableFO.xsl
があるとします。
<?xml version="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- defines the layout master --> <fo:layout-master-set> <fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="2.5cm"> <fo:region-body margin-top="3cm"/> </fo:simple-page-master> </fo:layout-master-set> <!-- starts actual layout --> <fo:page-sequence master-reference="first"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="24pt" line-height="24pt" font-weight="bold" start-indent="15pt"> Total of All Salaries is $<xsl:value-of select="sum(/ROWSET/ROW/SAL)"/> </fo:block> <!-- Here starts the table --> <fo:block border-width="2pt"> <fo:table> <fo:table-column column-width="4cm"/> <fo:table-column column-width="4cm"/> <fo:table-body font-size="10pt" font-family="sans-serif"> <xsl:for-each select="ROWSET/ROW"> <fo:table-row line-height="12pt"> <fo:table-cell> <fo:block><xsl:value-of select="ENAME"/></fo:block> </fo:table-cell> <fo:table-cell> <fo:block><xsl:value-of select="SAL"/></fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </fo:block> </fo:flow> </fo:page-sequence> </fo:root>
注意: XSQL FOPシリアライザを使用するには、サーバーのCLASSPATHに次のJavaアーカイブを追加する必要があります。
|
実装をカスタマイズする際の参考として、このリリースで提供されているFOPシリアライザのソース・コードを次に示します。
package oracle.xml.xsql.serializers; import org.w3c.dom.Document; import org.apache.log.Logger; import org.apache.log.Hierarchy; import org.apache.fop.messaging.MessageHandler; import org.apache.log.LogTarget; import oracle.xml.xsql.XSQLPageRequest; import oracle.xml.xsql.XSQLDocumentSerializer; import org.apache.fop.apps.Driver; import org.apache.log.output.NullOutputLogTarget; /** * Tested with the FOP 0.20.3RC release from 19-Jan-2002 */ public class XSQLFOPSerializer implements XSQLDocumentSerializer { private static final String PDFMIME = "application/pdf"; public void serialize(Document doc, XSQLPageRequest env) throws Throwable { try { // First make sure we can load the driver Driver FOPDriver = new Driver(); // Tell FOP not to spit out any messages by default. // You can modify this code to create your own FOP Serializer // that logs the output to one of many different logger targets // using the Apache LogKit API Logger logger=Hierarchy.getDefaultHierarchy().getLoggerFor("XSQLServlet"); logger.setLogTargets(new LogTarget[]{new NullOutputLogTarget()}); FOPDriver.setLogger(logger); // Some of FOP's messages appear to still use MessageHandler. MessageHandler.setOutputMethod(MessageHandler.NONE); // Then set the content type before getting the reader env.setContentType(PDFMIME); FOPDriver.setOutputStream(env.getOutputStream()); FOPDriver.setRenderer(FOPDriver.RENDER_PDF); FOPDriver.render(doc); } catch (Exception e) { // Cannot write PDF output for the error anyway. // So maybe this stack trace will be useful info e.printStackTrace(System.err); } } }
XSQLRequest
クラスを使用すると、XSQL Page Processor Engineを独自のカスタムJavaプログラム内で使用できます。APIの使用は簡単です。XSQLRequest
のインスタンスを作成し、処理するXSQLページを次のいずれかのオブジェクトとしてコンストラクタに渡します。
ページへのURLを含むString
ページのURL
オブジェクト
メモリー内のXMLDocument
次のメソッドのどちらかを起動して、ページを処理します。
process()
- 結果をPrintWriter
またはOutputStream
に書き込む場合
processToXML()
- 結果をXML文書として戻す場合
XSQL構成ファイルの定義に基づいてJDBC接続プーリングを実装する組込みXSQL Connection Managerを使用する場合、コンストラクタに渡す必要があるものはXSQLページのみです。独自のConnection Manager実装を使用する場合、オプションでXSQLConnectionManagerFactory
インタフェース用のカスタム実装を渡すこともできます。
XSQLページをメモリー内のXMLDocumentオブジェクトとして渡す機能を使用すると、必要なすべての方法で有効なXSQLページを動的に生成して処理でき、その後そのページをXSQLエンジンに渡して評価できます。
ページの処理時に、次の2つの追加操作をリクエストの一部として実行できます。
一連のパラメータをリクエストに渡す操作
この操作は、Dictionary
インタフェースを実装する任意のオブジェクトをprocess()
メソッドまたはprocessToXML()
メソッドに渡すことによって実行できます。パラメータを含むHashTable
を渡すことは、一般的な方法の1つです。
ページがXML文書をポストされたXMLメッセージの本体として処理するように設定する操作
この操作は、XSQLRequestオブジェクトのsetPostedDocument()
メソッドで実行できます。
次に、XSQLRequest
を使用してページを処理する簡単な例を示します。
import oracle.xml.xsql.XSQLRequest; import java.util.Hashtable; import java.io.PrintWriter; import java.net.URL; public class XSQLRequestSample { public static void main( String[] args) throws Exception { // Construct the URL of the XSQL Page URL pageUrl = new URL("file:///C:/foo/bar.xsql"); // Construct a new XSQL Page request XSQLRequest req = new XSQLRequest(pageUrl); // Setup a Hashtable of named parameters to pass to the request Hashtable params = new Hashtable(3); params.put("param1","value1"); params.put("param2","value2"); /* If needed, treat an existing, in-memory XMLDocument as if ** it were posted to the XSQL Page as part of the request req.setPostedDocument(myXMLDocument); ** */ // Process the page, passing the parameters and writing the output // to standard out. req.process(params,new PrintWriter(System.out) ,new PrintWriter(System.err)); } }
手元のタスクの実行にカスタム処理が必要であり、そのニーズに厳密に合う組込みアクションがない場合は、XSQLページが使用できる独自のアクションを作成することでレパートリーを増やすことができます。
XSQL Page Processorのコアは、アクション・ハンドラ要素を含む、XML文書を処理するエンジンです。Page Processor Engineは、XSQLActionHandler
インタフェースを実装するすべてのアクションをサポートするように作成されています。すべての組込みアクションは、このインタフェースを実装します。
XSQL Page Processorは、ページ内のアクションを次の方法で処理します。ページ内のアクションごとに、エンジンは次の手順を実行します。
デフォルトのコンストラクタを使用して、アクション・ハンドラ・クラスのインスタンスを作成します。
メソッドinit(Element actionElt,XSQLPageRequest context
)をコールして、アクション・ハンドラ要素オブジェクトおよびXSQL Page Processorコンテキストを含むハンドラ・インスタンスを初期化します。
メソッドhandleAction (Node result)を起動して、ハンドラがアクションを処理できるようにします。
組込みアクションの場合、XSQLエンジンは、そのアクション・ハンドラを実装するJavaクラスへのXSQLアクション・ハンドラ要素名のマップを認識します。表8-17「組込みXSQLアクション・ハンドラ要素およびアクション・ハンドラ・クラス」に、参考としてそのマッピングを明示的に示します。ユーザー定義のアクションの場合は、次の組込みアクションを使用します。
<xsql:action handler="fully.qualified.Classname" ... />
このアクションのhandler
属性は、そのカスタム・アクション・ハンドラを実装するJavaクラスの完全修飾名を指定します。
表8-17 組込みXSQLアクション・ハンドラ要素およびアクション・ハンドラ・クラス
XSQLアクション・ハンドラ要素 | oracle.xml.xsql.actionsのハンドラ・クラス | 説明 |
---|---|---|
<xsql:query> |
|
任意のSQL文を実行し、その結果を正規のXML形式に挿入します。 |
<xsql:dml> |
|
SQL DML文またはPL/SQL無名ブロックを実行します。 |
<xsql:set-stylesheet-param> |
|
最上位のXSLTスタイルシート・パラメータの値を設定します。 |
<xsql:insert-request> |
|
リクエストでポストされたXML文書またはHTMLフォームをデータベース表またはビューに挿入します。 |
<xsql:include-xml> |
|
相対URLまたは絶対URLを使用して、任意のXMLリソースをページの任意の場所に挿入します。 |
<xsql:include-request-params> |
|
すべてのリクエスト・パラメータをXML要素としてXSQLページに挿入します。 |
<xsql:include-posted-xml> |
|
|
<xsql:include-xsql> |
|
XSQLページの結果を別のXSQLページの任意の場所に挿入します。 |
<xsql:include-owa> |
|
データベース内でOracle Web Agent(OWA)パッケージを使用してXMLを生成するストアド・プロシージャの実行結果を挿入します。 |
<xsql:action> |
|
Javaに実装されたユーザー定義のアクション・ハンドラを起動し、カスタム・ロジックを実行して、カスタムXML情報をXSQLページに挿入します。 |
<xsql:ref-cursor-function> |
|
PL/SQLストアド・ファンクションが戻すカーソルの結果セットの正規のXML表示を挿入します。 |
<xsql:include-param> |
|
パラメータおよびその値を要素としてXSQLページに挿入します。 |
<xsql:if-param> |
|
XMLコンテンツおよび他のXSQLアクション(または他のXSQLアクション)を条件付きで挿入します。 |
<xsql:set-session-param> |
|
HTTPセッション・レベルのパラメータを設定します。 |
<xsql:set-page-param> |
|
HTTPセッション・レベルのパラメータを設定します。ページの後続のSQL文内で参照できるページ・レベル(ローカル)のパラメータを設定します。 |
<xsql:set-cookie> |
|
HTTP Cookieを設定します。 |
<xsql:insert-param> |
|
単一のパラメータの値に含まれるXML文書を挿入します。 |
<xsql:update-request> |
|
リクエストで指定されたポスト済XML文書に基づいて、データベース内の既存の行を更新します。 |
<xsql:delete-request> |
|
リクエストで指定されたポスト済XML文書に基づいて、データベース内の既存の行を削除します。 |
<xsql:if-param> |
|
パラメータ値に基づく条件が真である場合、ネストしたアクションおよびリテラルXMLコンテンツ(またはリテラルXMLコンテンツ)を挿入します。 |
http://localhost/xsql/index.html
に、すべてのデモがあります。
カスタム・アクション・ハンドラを作成するには、oracle.xml.xsql.XSQLActionHandler
インタフェースを実装するクラスを作成する必要があります。ほぼすべてのカスタム・アクション・ハンドラは、init()
メソッドのデフォルト実装および非常に有用なヘルパー・メソッドのセットを提供するoracle.xml.xsql.XSQLActionHandlerImpl
を拡張します。
XSQL Page Processorがアクション・ハンドラのhandleActionメソッドを起動すると、アクション実装がDOMドキュメント・フラグメントのルート・ノードに渡されます。アクション・ハンドラは、ページに戻された、動的に作成されたXMLコンテンツをこのルート・ノードに追加します。
XSQLページ・テンプレート内のアクション・ハンドラ要素は、概念的にこのドキュメント・フラグメントのコンテンツに置き換えられます。当然のことですが、ページに追加するXMLコンテンツがない場合、アクション・ハンドラはこのドキュメント・フラグメントに何も追加しません。
カスタム・アクション・ハンドラを作成する場合、XSQLActionHandlerImpl
クラスのいくつかのメソッドが役立ちます。これらのメソッドによって作業が容易になるためです。表8-18に、有用と思われるメソッドを示します。
表8-18 oracle.xml.xsql.SQLActionHandlerImplの有用なメソッド
メソッド名 | 説明 |
---|---|
getActionElement |
処理中の現行のアクション・ハンドラ要素を戻します。 |
getActionElementContent |
すべての字句パラメータを適切に置き換えて、現行のアクション・ハンドラ要素のテキスト・コンテンツを戻します。 |
getPageRequest |
現行のXSQLページ・プロセッサのコンテキストを戻します。このオブジェクトでは次のメソッドを使用できます。
|
getAttributeAllowingParam |
属性値で使用されているすべてのXSQL字句パラメータ参照を解決し、要素から属性値を取得します。通常、このメソッドはアクション・ハンドラ要素自体に適用されますが、サブ要素の属性にアクセスすることも有効です。字句パラメータを許可せずに属性値にアクセスするには、DOMのElementインタフェースに対して標準の |
appendSecondaryDocument |
外部XML文書のコンテンツ全体をアクション・ハンドラの結果コンテンツのルートに追加します。 |
addResultElement |
テキスト・コンテンツを含む単一の要素をアクション・ハンドラの結果コンテンツのルートに追加する操作を簡単にします。 |
firstColumnOfFirstRow |
渡されたSQL文の最初の行にある最初の列値を戻します。このメソッドを使用するには、現行のページのドキュメント要素に接続属性が含まれている必要があります。含まれていない場合は、エラーが戻されます。 |
bindVariableCount |
空白で区切られた |
handleBindVariables |
現行のアクション・ハンドラ要素の |
reportErrorIncludingStatement |
問題の原因である違反(SQL)文を含むエラーを報告します。オプションで、エラーに数値エラー・コードが含まれる場合もあります。 |
reportFatalError |
致命的エラーを報告します。 |
reportMissingAttribute |
標準の |
reportStatus |
標準の |
requiredConnectionProvided |
このリクエストに使用できる接続の有無を確認し、使用可能な接続がない場合はページにエラーグラムを出力します。 |
variableValue |
字句パラメータのデフォルト値を決定する場合があるすべての有効範囲決定規則を考慮して、字句パラメータの値を戻します。 |
次の例に、カスタム・アクション・ハンドラMyIncludeXSQLHandler
を示します。このハンドラは、組込みアクション・ハンドラの1つおよび任意のJavaコードを使用し、そのハンドラによって戻された結果のXMLフラグメントを変更してから、その結果をXSQLページに追加します。
import oracle.xml.xsql.*; import oracle.xml.xsql.actions.XSQLIncludeXSQLHandler; import org.w3c.dom.*; import java.sql.SQLException; public class MyIncludeXSQLHandler extends XSQLActionHandlerImpl { XSQLActionHandler nestedHandler = null; public void init(XSQLPageRequest req, Element action) { super.init(req, action); // Create an instance of an XSQLIncludeXSQLHandler // and init() the handler by passing the current request/action // This assumes the XSQLIncludeXSQLHandler will pick up its // href="xxx.xsql" attribute from the current action element. nestedHandler = new XSQLIncludeXSQLHandler(); nestedHandler.init(req,action); } public void handleAction(Node result) throws SQLException { DocumentFragment df=result.getOwnerDocument().createDocumentFragment(); nestedHandler.handleAction(df); // Custom Java code here can work on the returned document fragment // before appending the final, modified document to the result node. // For example, add an attribute to the first child Element e = (Element)df.getFirstChild(); if (e != null) { e.setAttribute("ExtraAttribute","SomeValue"); } result.appendChild(df); } }
ページがXSQLRequestクラスを介して、XSQLサーブレット、XSQLコマンドライン・ユーティリティまたはプログラムでリクエストされているかどうかに基づいて異なる動作をする必要があるカスタム・アクション・ハンドラを作成する場合、アクション・ハンドラの実装で、getPageRequest()
をコールして、現行のページ・リクエスト用のXSQLPageRequestインタフェースを参照できます。XSQLPageRequestオブジェクトに対してgetRequestType()
をコールすると、Servlet、Command LineまたはProgrammaticからそれぞれリクエストを受信しているかを確認できます。戻り値がServletの場合、HTTPサーブレットのリクエスト、レスポンスおよびサーブレット・コンテキスト・オブジェクトに次のようにアクセスできます。
XSQLServletPageRequest xspr = (XSQLServletPageRequest)getPageRequest(); if (xspr.getRequestType().equals("Servlet")) { HttpServletRequest req = xspr.getHttpServletRequest(); HttpServletResponse resp = xspr.getHttpServletResponse(); ServletContext cont = xspr.getServletContext(); // do something fun here with req, resp, or cont however // writing to the response directly from a handler will // produce unexpected results. Allow the XSQL Servlet // or your custom Serializer to write to the servlet // response output stream at the write moment later when all // action elements have been processed. }
カスタムXSQLアクションの基本クラスXSQLActionHandlerImpl
では、配列名を使用した字句パラメータ置換、配列名を使用したバインド変数および単一の値のパラメータの使用がサポートされます。カスタム・アクションでこの基本クラスからのメソッド、たとえばgetAttributeAllowingParam()
、getActionElementContent()
またはhandleBindVariables()
などを使用する場合は、カスタム・アクションで複数値のパラメータの機能を使用できます。
パラメータ値をString[]
として明示的に取得するには、XSQLPageRequest
インタフェースでgetParameterValues()
メソッドを使用します。XSQLActionHandlerImpl
のヘルパー・メソッドvariableValues()
を使用すると、プログラムで必要な場合にカスタム・アクション・ハンドラ内からこの機能を簡単に使用できます。
ユーザー定義のシリアライザ・クラスを作成し、最終XSQLデータ・ページのXML文書をテキストまたはバイナリ・ストリームにシリアライズする方法を制御できます。ユーザー定義のシリアライザには、次の単一のメソッドで構成されるoracle.xml.xsql.XSQLDocumentSerializer
インタフェースを実装する必要があります。
void serialize(org.w3c.dom.Document doc, XSQLPageRequest env) throws Throwable;
このリリースでは、DOMベースのシリアライザのみがサポートされます。今後のリリースでは、SAX2ベースのシリアライザもサポートされる可能性があります。カスタム・シリアライザ・クラスを使用する場合は、次のタスクを適切な順序で実行する必要があります。
出力PrintWriter
(またはOutputStream
)に内容を出力する前に、シリアライズされたストリームのコンテンツ・タイプを設定します。
シリアライザに渡されるXSQLPageRequest
に対してsetContentType()
をコールし、型を設定します。コンテンツ・タイプを設定する場合は、次のようなMIMEタイプを設定できます。
env.setContentType("text/html");
または、次のように明示的な出力エンコーディング・キャラクタ・セットを含むMIMEタイプを設定できます。
env.setContentType("text/html;charset=Shift_JIS");
XSQLPageRequest
に対してgetWriter()
またはgetOutputStream()
のどちらかをコールし(両方は不可)、それぞれ適切なPrintWriter
またはOutputStream
を取得して、コンテンツのシリアライズに使用します。
たとえば次のカスタム・シリアライザは、現行のXSQLデータ・ページのドキュメント要素名を含むHTMLドキュメントをシリアライズするのみの単純な実装を示します。
package oracle.xml.xsql.serializers; import org.w3c.dom.Document; import java.io.PrintWriter; import oracle.xml.xsql.*; public class XSQLSampleSerializer implements XSQLDocumentSerializer { public void serialize(Document doc, XSQLPageRequest env) throws Throwable { String encoding = env.getPageEncoding(); // Use same encoding as XSQL page // template. Set to specific // encoding if necessary String mimeType = "text/html"; // Set this to the appropriate content type // (1) Set content type using the setContentType on the XSQLPageRequest if (encoding != null && !encoding.equals("")) { env.setContentType(mimeType+";charset="+encoding); } else { env.setContentType(mimeType); } // (2) Get the output writer from the XSQLPageRequest PrintWriter e = env.getWriter(); // (3) Serialize the document to the writer e.println("<html>Document element is <b>"+ doc.getDocumentElement().getNodeName()+ "</b></html>"); } }
カスタム・シリアライザを使用するには、シリアライズの前にXSLT変換を実行する必要があるかどうかによって、2つの方法があります。カスタム・シリアライザを使用する前にXSLT変換を実行するには、ページの最上部にある<?xml-stylesheet?>
処理命令内にserializer="java:fully.qualified.ClassName"
を追加します。
<?xml version="1.0?> <?xml-stylesheet type="text/xsl" href="mystyle.xsl" serializer="java:my.pkg.MySerializer"?>
カスタム・シリアライザのみが必要である場合は、type
属性およびhref
属性を次のように省略します。
<?xml version="1.0?> <?xml-stylesheet serializer="java:my.pkg.MySerializer"?>
また、XSQL構成ファイル(デフォルトではXSQLConfig.xml
)の<serializerdefs>
セクションでカスタム・シリアライザに短縮名を割り当てて、serializer属性でそのニックネーム(大/小文字は区別)を使用して入力作業を省くことができます。たとえばXSQL構成ファイルに次の情報があるとします。
<XSQLConfig> <!--and so on. --> <serializerdefs> <serializer> <name>Sample</name> <class>oracle.xml.xsql.serializers.XSQLSampleSerializer</class> </serializer> <serializer> <name>FOP</name> <class>oracle.xml.xsql.serializers.XSQLFOPSerializer</class> </serializer> </serializerdefs> </XSQLConfig>
この場合、次の例に示すように、ニックネームSampleおよびFOP(またはFOP)を使用できます。
<?xml-stylesheet type="text/xsl" href="emp-to-xslfo.xsl" serializer="FOP"?>
または
<?xml-stylesheet serializer="Sample"?>
XSQLPageRequest
インタフェースは、getWriter()
メソッドおよびgetOutputStream()
メソッドの両方をサポートします。カスタム・シリアライザは、getOutputStream()
をコールして、OutputStream
インスタンスを戻すことができます。バイナリ・データ(動的に生成されるGIFイメージなど)は、このインスタンスにシリアライズできます。XSQLサーブレットを使用する場合は、このOutputStreamに出力すると、バイナリ情報がサーブレットのOutputStreamに出力されます。
たとえば次のシリアライザは、動的GIFイメージを出力する例を示します。この例では、GIFイメージは静的で小さな「OK」アイコンですが、より高度なイメージ・シリアライザで使用する必要がある基本的な方法を示します。
package oracle.xml.xsql.serializers; import org.w3c.dom.Document; import java.io.*; import oracle.xml.xsql.*; public class XSQLSampleImageSerializer implements XSQLDocumentSerializer { // Byte array representing a small "ok" GIF image private static byte[] okGif = {(byte)0x47,(byte)0x49,(byte)0x46,(byte)0x38, (byte)0x39,(byte)0x61,(byte)0xB,(byte)0x0, (byte)0x9,(byte)0x0,(byte)0xFFFFFF80,(byte)0x0, (byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0, (byte)0xFFFFFFFF,(byte)0xFFFFFFFF,(byte)0xFFFFFFFF,(byte)0x2C, (byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0, (byte)0xB,(byte)0x0,(byte)0x9,(byte)0x0, (byte)0x0,(byte)0x2,(byte)0x14,(byte)0xFFFFFF8C, (byte)0xF,(byte)0xFFFFFFA7,(byte)0xFFFFFFB8,(byte)0xFFFFFF9B, (byte)0xA,(byte)0xFFFFFFA2,(byte)0x79,(byte)0xFFFFFFE9, (byte)0xFFFFFF85,(byte)0x7A,(byte)0x27,(byte)0xFFFFFF93, (byte)0x5A,(byte)0xFFFFFFE3,(byte)0xFFFFFFEC,(byte)0x75, (byte)0x11,(byte)0xFFFFFF85,(byte)0x14,(byte)0x0, (byte)0x3B}; public void serialize(Document doc, XSQLPageRequest env) throws Throwable { env.setContentType("image/gif"); OutputStream os = env.getOutputStream(); os.write(okGif,0,okGif.length); os.flush(); } }
XSQLコマンドライン・ユーティリティを使用する場合は、バイナリ情報がターゲット出力ファイルに出力されます。XSQLRequestプログラムAPIを使用する場合は、2つのコンストラクタが存在します。これらのコンストラクタは、コール元がページ処理の結果用に使用するターゲットOutputStream
を提供できるようにします。
シリアライザは、getWriter()
(テキスト出力用)またはgetOutputStream()
(バイナリ出力用)のどちらかをコールする必要があります。ただし、これらの両方をコールすることはできません。同一のリクエストで両方のメソッドをコールすると、エラーが発生します。
XSQL構成ファイル内に自分が使用する接続に名前を付けて定義するという方法の他に、提供されている2つのXSQLConnectionManager実装のいずれかを使用するという方法があります。これらの実装を使用すると、サーブレット・コンテナのJDBCデータソース実装および関連する接続プーリング機能を使用できます。
このリリースのXSQLページには、代替として使用できる2つのConnection Manager実装が付属しています。
oracle.xml.xsql.XSQLDatasourceConnectionManager
サーブレット・コンテナのデータソース実装が保護された状況でOracle JDBCドライバを使用しない場合は、このConnection Managerを代替に使用することをお薦めします。Oracle JDBCドライバを使用していないと、<xsql:ref-cursor-function>
や<xsql:include-owa>
などのXSQLページ・システムの一部の機能が使用できなくなります。
oracle.xml.xsql.XSQLOracleDatasourceConnectionManager
データソース実装が、oracle.jdbc.PreparedStatement
インタフェースおよびoracle.jdbc.CallableStatement
インタフェースをそれぞれ実装するJDBCのPreparedStatement
オブジェクトおよびCallableStatement
オブジェクトを戻すことがわかった場合は、この代替Connection Managerを使用することをお薦めします。Oracle Application Serverには、これを実行するデータソース実装が含まれています。
これらの代替Connection Manager実装のいずれかを使用するとき、XSQLページ・テンプレート内の接続属性の値には、必要なデータソースの検索に使用するJNDI名を指定します。接続属性の値の例を次に示します。
jdbc/scottDS
java:comp/env/jdbc/MyDatasource
デフォルトのXSQLページConnection Managerを使用しない場合は、代替のConnection Manager実装を使用して必要な接続プーリング機能を提供する必要があることを念頭に置いてください。JDBCデータソースに基づく前述の2つのオプションでは、接続プーリングを提供するためにサーブレット・コンテナの適切な構成に依存しています。プールされた接続を提供するためにデータソースを適切に構成する方法については、使用しているサーブレット・コンテナのドキュメントを参照してください。
カスタムConnection Managerを作成し、組込みConnection Managementメカニズムを置き換えることができます。カスタムConnection Manager実装を提供するには、次のオブジェクトを用意する必要があります。
oracle.xml.xsql.XSQLConnectionManagerFactory
インタフェースを実装するConnection Managerfactoryオブジェクト。
oracle.xml.xsql.XSQLConnectionManager
インタフェースを実装するConnection Managerオブジェクト。
このセクションで、XSQL構成ファイル(デフォルトではXSQLConfig.xml
)にクラス名を指定すると、カスタムConnection ManagerファクトリをデフォルトのConnection Managerファクトリとして使用するように設定できます。
<!-- | Set the name of the XSQL Connection Manager Factory | implementation. The class must implement the | oracle.xml.xsql.XSQLConnectionManagerFactory interface. | If unset, the default is to use the built-in connection | manager implementation in | oracle.xml.xsql.XSQLConnectionManagerFactoryImpl +--> <connection-manager> <factory>oracle.xml.xsql.XSQLConnectionManagerFactoryImpl</factory> </connection-manager>
デフォルトのConnection Managerファクトリを指定する他に、指定されたAPIを使用して、カスタム接続ファクトリを個々のXSQLRequest
オブジェクトに関連付けることができます。
XSQLConnectionManagerFactory
は、現行のリクエストが使用するXSQLConnectionManager
のインスタンスを戻します。サーブレット・エンジンなどのマルチスレッド環境では、XSQLConnectionManager
オブジェクトが、2つの異なるスレッドによって単一のXSQLConnection
インスタンスが使用されていないことを保証する責任があります。これは、getConnection()
メソッドのコールからreleaseConnection()
メソッドのコールまでの間、接続を使用中としてマークすることで保証できます。デフォルトのXSQL Connection Manager実装は、名前付き接続を自動的にプールし、このスレッド・セーフ・ポリシーに従います。
XSQLConnectionManager
のカスタム実装で、オプションのoracle.xml.xsql.XSQLConnectionManagerCleanup
インタフェースも実装する場合は、Connection Managerで、割当て済のリソースをクリーンアップできます。たとえば、サーブレット・コンテナがXSQLServlet
サーブレットに対してdestroy()
メソッドを起動すると(サーブレットのオンライン管理中などに発生)、Connection Managerはサーブレットの破棄プロセスの一部として、リソースをクリーンアップできます。
重大なPage Processorエラー(接続が使用できないなど)をユーザーに通知する方法を制御する場合があります。oracle.xml.xsql.XSQLErrorHandler
インタフェースを実装するクラスを作成すると、通知する方法を制御できます。このインタフェースには次の単一メソッドがあります。
public interface XSQLErrorHandler { public void handleError( XSQLError err, XSQLPageRequest env); }
XSQLErrorHandler
インタフェースを実装するクラスを提供すると、XSQL Page Processorによるページ・プロセッサ・エラー・メッセージの出力方法をカスタマイズできます。新しいXSQLError
オブジェクトはエラー情報をカプセル化し、エラー・コード、フォーマットされたエラー・メッセージなどへのアクセスを提供します。
たとえば、XSQLErrorHandler
のサンプル実装を次に示します。
package example; import oracle.xml.xsql.*; import java.io.*; /** * Example of a custom XSQLErrorHandler implementation */ public class MyErrorHandler implements XSQLErrorHandler { public void logError( XSQLError err, XSQLPageRequest env) { // Must set the content type before writing anything out env.setContentType("text/html"); PrintWriter pw = env.getErrorWriter(); pw.println("<H1>ERROR</H1><hr>"+err.getMessage()); } }
使用するカスタムXSQLErrorHandler
実装を、次の2つの方法で制御できます。
エラー・ハンドラ・クラスの完全修飾クラス名を/XSQLConfig/processor/error-handler/class
エントリの値として指定することで、XSQL構成ファイル(デフォルトではXSQLConfig.xml
)にカスタムXSQLErrorHandler
実装クラス名を定義できます。
XSQL Page Processorがこのクラスをロードし、XSQLErrorHandler
インタフェースを正しく実装すると、このクラスはシングルトンとして使用され、ページ・プロセッサのエラーが通知された場合にデフォルトの実装をグローバルに置換します。
ページのドキュメント要素に対して、新しいオプションのerrorHandler
(またはxsql:errorHandler
)属性を使用して、ページごとにエラー・ライターをオーバーライドできます。
この属性の値は、XSQLErrorHandler
インタフェースを実装するクラスの完全修飾クラス名です。このクラスはこのページのみで発生したエラーの通知に使用され、Page Engineによってページ・リクエストごとにインスタンス化されます。
両方の方法を、必要に応じて組み合せて使用できます。
各XSQLページ・リクエストの開始と終了のロギングを処理するカスタム・コードをオプションで登録できます。カスタム・ログ出力コードでは、oracle.xml.xsql.XSQLLoggerFactory
とoracle.xml.xsql.XSQLLogger
の2つのインタフェースの実装を提供する必要があります。
XSQLLoggerFactory
インタフェースには次に示す単一のメソッドが含まれています。
public interface XSQLLoggerFactory { public XSQLLogger create( XSQLPageRequest env); }
XSQLLoggerFactory
インタフェースを実装するクラスを提供し、ロギング用にXSQLLogger
オブジェクトを作成(または再利用)する方法を決定できます。XSQL Page Processorは、ページ・リクエストの存続期間中ファクトリによって戻されるXSQLLogger
オブジェクトへの参照を保持し、この参照を使用して、オブジェクトに対してlogRequestStart()
メソッドおよびlogRequestEnd()
メソッドを起動することにより、各ページ・リクエストの開始と終了をログに記録します。
XSQLLogger
インタフェースは次のようになります。
public interface XSQLLogger { public void logRequestStart(XSQLPageRequest env) ; public void logRequestEnd(XSQLPageRequest env); }
次の2つのクラスは、カスタム・ログ出力の一般的な実装を示します。最初のXSQLLogger
実装では、ページ・リクエストの開始時刻を記録します。また、ページ・リクエストの名前と経過時間をSystem.out
に出力して、ページ・リクエストの終了時刻を記録します。
package example; import oracle.xml.xsql.*; public class SampleCustomLogger implements XSQLLogger { long start = 0; public void logRequestStart(XSQLPageRequest env) { start = System.currentTimeMillis(); } public void logRequestEnd(XSQLPageRequest env) { long secs = System.currentTimeMillis() - start; System.out.println("Request for " + env.getSourceDocumentURI() + " took "+ secs + "ms"); } }
次に、ファクトリ実装を示します。
package example; import oracle.xml.xsql.*; public class SampleCustomLoggerFactory implements XSQLLoggerFactory { public XSQLLogger create(XSQLPageRequest env) { return new SampleCustomLogger(); } }
カスタム・ログ出力ファクトリを登録するには、XSQLConfig.xml
ファイルを編集し、カスタム・ログ出力ファクトリ・クラスの名前を/XSQLConfig/processor/logger/factory
要素のコンテンツとして次のように指定します。
<XSQLConfig> : <processor> : <logger> <factory>example.SampleCustomLoggerFactory</factory> </logger> : </processor> </XSQLConfig>
デフォルトでは、この<logger>
セクションはコメントにされているため、デフォルトのログ出力はありません。
XSQLアクション・ハンドラ要素の処理によって発生したエラーは、XML要素として決まった方法で通知されます。そのため、XSLスタイルシートはエラーの存在を検出し、オプションでそれらをフォーマットして表示できます。
エラーが発生したアクション・ハンドラ要素は、ページ内で次の要素によって置き換えられます。
<xsql-error action="xxx">
エラーによっては、<xsql-error>
要素に次のものが含まれます。
ネストした<message>
要素
違反SQL文を含む<statement>
要素
次の情報を使用してエラー情報を画面上に表示するXSLTスタイルシートの例を示します。
<xsl:if test="//xsql-error"> <table style="background:yellow"> <xsl:for-each select="//xsql-error"> <tr> <td><b>Action</b></td> <td><xsl:value-of select="@action"/></td> </tr> <tr valign="top"> <td><b>Message</b></td> <td><xsl:value-of select="message"/></td> </tr> </xsl:for-each> </table> </xsl:if>
XSQLサーブレットには次の制限があります。
マルチバイト名を持つHTTPパラメータ(漢字表記の名前を持つパラメータなど)は、<xsql:include-request-params>
を使用してXSQLページに挿入すると、適切に処理されます。<xsql:query>
タグの問合せ文内でマルチバイト名を持つパラメータの参照を試みると、パラメータの値に対して空の文字列が戻されます。
パラメータに非マルチバイト名を使用してください。このパラメータは、引き続きマルチバイト値を持つことができ、このマルチバイト値は正しく処理できます。
SQL文でCURSOR()関数を使用する場合、CURSOR()文がネストされ、問合せの最初の行がCURSOR()関数に対して空の結果セットを戻すとExhausted ResultSetエラーが出力される場合があります。
この項では、XSUサーブレットのヒントを示します。
XSQL出力をワイヤレス・アプリケーション用のWMLドキュメントに変換中に、特定のDTDを指定する方法があります。
これを実行するには、<xsl:output>
というXSLTスタイルシートの組込み機能を使用します。次に例を示します。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output type="xml" doctype-system="your.dtd"/> <xsl:template match="/"> </xsl:template> ... ... </xsl:stylesheet>
これにより、次のコードを含むXML結果が生成されます。
<!DOCTYPE xxxx SYSTEM "your.dtd">
"your.dtd"
には、任意の有効な絶対URLまたは相対URLを指定できます。
次のように、XSQLファイルに条件文を作成できます。
<xsql:choose> <xsql:when test="@security='admin'"> <xsql:query> SELECT .... </xsql:query> </xsq:when> <xsql:when test="@security='user'"> <xsql:query> SELECT .... </xsql:query> </xsql:when> </xsql:if>
<xsql:ref-cursor-function>
を使用して、REF CURSOR
を適切な問合せに条件付きで戻すPL/SQLプロシージャをコールします。
1つのXSQLファイル内に問合せが2つ存在する場合、ページ・パラメータを使用して、1つ目の問合せのSELECT構文のリスト項目の値を2つ目の問合せで使用できます。
<page xmlns:xsql="urn:oracle-xsql" connection="demo"> <!-- Value of page param "xxx" will be first column of first row --> <xsql:set-page-param name="xxx"> select one from table1 where ... </xsl:set-param-param> <xsql:query bind-params="xxx"> select col3,col4 from table2 where col3 = ? </xsql:query> </page>
XSQLサーブレットはJDBCをサポートするすべてのデータベースに接続できます。XSQL構成ファイル(デフォルトではXSQLConfig.xml
)の接続定義に適切なJDBCドライバ・クラスと接続URLを指定してください。もちろん、オブジェクト・リレーショナル機能は、OracleをOracle JDBCドライバとともに使用する場合にのみ機能します。
<input name="choices" type="checkbox">
に必要な複数値のHTMLの<form>
パラメータを処理する方法があります。
パラメータ名でパラメータ配列表記(たとえば、choices[]
)を使用し、選択したチェック・ボックスからの値の配列を参照します。
たとえば、guy
という名前の複数値のパラメータを使用する場合、次に示すように、XSQLページにパラメータ配列表記を使用できます。
<page xmlns:xsql="urn:oracle-xsql"> <xsql:set-page-param name="guy-list" value="{@guy[]}" treat-list-as-array="yes"/> <xsql:set-page-param name="quoted-guys" value="{@guy[]}" treat-list-as-array="yes" quote-array-values="yes"/> <xsql:include-param name="guy-list"/> <xsql:include-param name="quoted-guys"/> <xsql:include-param name="guy[]"/> </page>
このページが、複数値の属性を生成するために同じ名前の複数のパラメータを含む次のURLによってリクエストされるとします。
http://yourserver.com/page.xsql?guy=Curly&guy=Larry&guy=Moe
この場合、戻されるページは次のようになります。
<page> <guy-list>Curly,Larry,Moe</guy-list> <quoted-guys>'Curly','Larry','Moe'</quoted-guys> <guy> <value>Curly</value> <value>Larry</value> <value>Moe</value> </guy> </page>
次のコードを使用して、複数値のページ・パラメータの前述の0(ゼロ)以外の値をSQL文に使用することもできます。
<page connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:set-page-param name="quoted-guys" value="{@guy[]}" treat-list-as-array="yes" quote-array-values="yes"/> <xsql:query> SELECT * FROM sometable WHERE name IN ({@quoted-guys}) </xsql:query> </page>
<xsql:dml>
を使用してこのリリースのOUT
変数の位置にパラメータ値をバインドしても、パラメータ値を設定できません。バインディングは、IN
パラメータに対してのみサポートされます。HTTPパッケージを使用してXML要素を作成するラッパー・プロシージャを作成できます。XSQLページでは、かわりに<xsql:include-owa>
を使用してラッパー・プロシージャを起動できます。
たとえば、次のプロシージャがあるとします。
CREATE OR REPLACE PROCEDURE addmult(arg1 NUMBER, arg2 NUMBER, sumval OUT NUMBER, prodval OUT NUMBER) IS BEGIN sumval := arg1 + arg2; prodval := arg1 * arg2; END;
次のプロシージャを記述してこれをラップし、前述のプロシージャに必要なすべてのIN
引数を受け入れて、OWAページ・バッファに出力する小規模なXMLデータグラムとしてOUT
値をエンコーディングすることができます。
CREATE OR REPLACE PROCEDURE addmultwrapper(arg1 NUMBER, arg2 NUMBER) IS sumval NUMBER; prodval NUMBER; xml VARCHAR2(2000); BEGIN -- Call the procedure with OUT values addmult(arg1,arg2,sumval,prodval); -- Then produce XML that encodes the OUT values xml := '<addmult>'|| '<sum>'||sumval||'</sum>'|| '<product>'||prodval||'</product>'|| '</addmult>'; -- Print the XML result to the OWA page buffer for return HTP.P(xml); END;
この場合、次のようなXSQLページを作成して、ラッパー・プロシージャをコールできます。
<page connection="demo" xmlns:xsql="urn:oracle-xsql"> <xsql:include-owa bind-params="arg1 arg2"> BEGIN addmultwrapper(?,?); END; </xsql:include-owa> </page>
次のようなリクエストがあるとします。
http://yourserver.com/addmult.xsql?arg1=30&arg2=45
この場合、次のようにOUT
値を反映するXMLデータグラムが戻されます。
<page> <addmult><sum>75</sum><product>1350</product></addmult> </page>
データベースに接続できず、helloworld.xsql
サンプルのようなプログラムの実行中に次のエラーが発生したとします。
Oracle XSQL Servlet Page Processor 9.0.0.0.0 (Beta) XSQL-007: Cannot acquire a database connection to process page. Connection refused(DESCRIPTION=(TMP=)(VSNNUM=135286784)(ERR=12505) (ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
ずっとこのエラーが発生している場合、helloworld.xsql
デモ・ページが変更されていないことを前提に、XSQLサーブレットがdemo
という名前の接続の<connectiondef>
情報に基づいてJDBC接続を実際に試みています。
XSQLConfig.xml
ファイルには、デフォルトで次のようなdemo
接続のエントリが含まれています。
<connection name="demo"> <username>scott</username> <password>tiger</password> <dburl>jdbc:oracle:thin:@localhost:1521:ORCL</dburl> <driver>oracle.jdbc.driver.OracleDriver</driver> </connection>
次のいずれかが原因でエラーが発生している可能性があります。
データベースがlocalhost
で指定されたローカル・ホスト・マシン上にない。
データベースのSID
がORCL
ではない。
TNSリスナー・ポートが1521ではない。
これらの値がデータベースに対して適切であり、問題がないことを確認してください。
拡張子.xsql
は、XSQLページの認識に使用するデフォルトの拡張子です。サーブレット・エンジンの構成設定を変更し、任意の拡張子をoracle.xml.xsql.XSQLServlet
サーブレット・クラスと関連付けることができます。この関連付けには、拡張子*.xsqll
とこのサーブレット・クラスを関連付けたときと同じ方法を使用します。
XML情報を処理するためにXSQLページにポストする場合は、HTTP POSTメソッドで送信する必要があります。この送信は、HTTP POSTによって送信されたHTTP POST HTML形式またはXML文書になります。かわりにHTTP GETを使用しようとすると、ポスト済の文書が存在しないため、このエラーが発生します。正しく動作させるには、HTTP POSTを使用してください。
使用するXSQLページでは、<xsql:set-page-param>
アクションのxpath="XpathExpression
属性を使用して、受信SOAPメッセージのコンテンツにアクセスできます。また、getPageRequest().getPostedDocument()
をコールして、カスタム・アクション・ハンドラでポストしたSOAPメッセージ本体に直接アクセスすることもできます。クライアントに戻すSOAPレスポンス本体を作成するには、XSLTスタイルシートまたはカスタム・シリアライザの実装を使用して、XMLレスポンスを適切なSOAPエンコーディング形式で書き出すことができます。
XSQLページを使用してSOAPベースのWebサービスを実装する例については、XSQL Pagesフレームワークに付属するAirportSOAPデモを参照してください。
XSQLページのconnection
属性にXSQLパラメータを参照して、接続名のデフォルト値に必ず同じ名前の属性を定義してください。次に例を示します。
<xsql:query conn="testdb" connection="{@conn}" xmlns:xsql="urn:oracle-xsql">
...
</xsql:query>
パラメータを指定せずにこのページを取得する場合、conn
パラメータの値はtestdb
となり、このページはXSQL構成ファイル(デフォルトではXSQLConfig.xml
)に定義されたtestdb
という接続を使用します。この方法のかわりにconn=proddb
を使用してページをリクエストすると、proddb
という接続が使用されます。
デフォルトでXSQL構成ファイルを使用してXSQLで提供される方法よりも高度な方法でユーザー名とパスワードを管理する必要があるとします。
XSQLConnectionManager
インタフェースの独自の実装を作成することで、XSQL Page Processorがデータベース接続を処理する方法を完全に再定義できます。これを行うには、oracle.xml.xsql.XSQLConnectionManagerFactory
インタフェースを実装するクラスと、oracle.xml.xsql.XSQLConnectionManager
インタフェースを実装するクラスを作成し、XSQL構成ファイルで使用するXSQLConnectionManagerFactory
クラスの名前を変更する必要があります。この作業が完了すると、XSQLページのデフォルト・スキームではなく、定義した接続管理スキームが使用されます。
HTTP認証メカニズムを使用して、データベースに接続するためのユーザー名およびパスワードを取得するとします。カスタムConnection ManagerのgetConnection()
メソッドでユーザー名およびパスワードの情報を取得できます。
getConnection()
メソッドは、XSQLPageRequest
インタフェースのインスタンスに渡されます。そのインスタンスから、次の操作を実行してHTTP Requestオブジェクトを取得できます。
リクエストのタイプがServlet
であることを確認します。
XSQLServletPageRequest
にXSQLPageRequest
をキャストします。
2.の結果に対してgetHttpServletRequest()
をコールします。
HTTP Requestオブジェクトから認証情報を取得できます。
現行ページへのリンクを作成するために、実行時にXSQLページからそのページの名前にアクセスする、一般的で効率的な方法があります。次のようなヘルパー・メソッドを使用すると、カスタム・アクション・ハンドラ内のページの名前を取得できます。
// Get the name of the current page from the current page's URI private String curPageName(XSQLPageRequest req) { String thisPage = req.getSourceDocumentURI();; int pos = thisPage.lastIndexOf('/'); if (pos >=0) thisPage = thisPage.substring(pos+1); pos = thisPage.indexOf('?'); if (pos >=0) thisPage = thisPage.substring(0,pos-1); return thisPage; }
Formatting Object(FOP)を使用してXMLをPDFにフォーマットできます。FOPシリアライザを使用する際にエラーが発生した場合、通常は必要なすべてのJARファイルがCLASSPATHに指定されていないことが原因です。XSQLFOPSerializer
クラスは別のxsqlserializers.jar
ファイルに存在しますが、FOPの統合を使用するには、CLASSPATH内にこのクラスが存在する必要があります。
XSQLFOPSerializer
クラス自体がApacheのいくつかのライブラリに依存しています。たとえば、FOPソフトウェアのApache FOP 0.20.3RCリリース候補で動作するFOPシリアライザのソース・コードを次に示します。
package sample; import org.w3c.dom.Document; import org.apache.log.Logger; import org.apache.log.Hierarchy; import org.apache.fop.messaging.MessageHandler; import org.apache.log.LogTarget; import oracle.xml.xsql.XSQLPageRequest; import oracle.xml.xsql.XSQLDocumentSerializer; import org.apache.fop.apps.Driver; import org.apache.log.output.NullOutputLogTarget; /** * Tested with the FOP 0.20.3RC release from 19-Jan-2002 */ public class SampleFOPSerializer implements XSQLDocumentSerializer { private static final String PDFMIME = "application/pdf"; public void serialize(Document doc, XSQLPageRequest env) throws Throwable { try { // First make sure we can load the driver Driver FOPDriver = new Driver(); // Tell FOP not to spit out any messages by default. // You can modify this code to create your own FOP Serializer // that logs the output to one of many different logger targets // using the Apache LogKit API Logger logger = Hierarchy.getDefaultHierarchy() .getLoggerFor("XSQLServlet"); logger.setLogTargets(new LogTarget[]{new NullOutputLogTarget()}); FOPDriver.setLogger(logger); // Some of FOP's messages appear to still use MessageHandler. MessageHandler.setOutputMethod(MessageHandler.NONE); // Then set the content type before getting the reader/ env.setContentType(PDFMIME); FOPDriver.setOutputStream(env.getOutputStream()); FOPDriver.setRenderer(FOPDriver.RENDER_PDF); FOPDriver.render(doc); } catch (Exception e) { // Cannot write PDF output for the error anyway. // So maybe this stack trace will be useful info e.printStackTrace(System.err); } } }
このFOPシリアライザは、実行時に次のApache JARファイルをCLASSPATHに追加する必要があります。
fop.jar
- Apache FOP Rendering Engine
batik.jar
- Apache Batik SVG Rendering Engine
avalon-framework-4.0.jar
- Apache Avalon Framework用のAPI
logkit-1.0.jar
- Apache Logkit用のAPI
パフォーマンスに最も影響を与えるのは、問合せ対象のデータのサイズ(および問合せの純粋な速度)です。問合せをチューニングして、SQLが許可する場所に字句バインド変数ではなくバインド変数を使用している場合、それ以外の主なヒントとしては、必要な結果をレンダリングするために必要最小限のデータにのみ問合せを行っているかどうかを確認することです。
何千もの行のデータに問合せを行っている場合、XSLTスタイルシートを使用して、ブラウザにこれらの行のうち10行のみを表示するようにフィルタリングすることはよい選択とは言えません。データベースの機能を最大限に利用して、行のフィルタを行い、可能なかぎり必要な10行のみを戻します。Oracleデータベースと、変換言語として使用するXSLTの機能間でXSQLは単純な調整を行っていると考えられます。
たとえば、WebLogic WebサーバーでXSQLサーブレットを実行している場合、XSQLページを設定して接続プールから取得した接続を使用できます。
XSQLはそれ自体の接続プーリングを実装するため、一般的には他の接続プールを使用する必要はありません。ただし、適切な形式のJDBC接続文字列を指定するのみではWebLogicプールの使用に不十分である場合、XSQLConnectionManagerFactory
インタフェースおよびXSQLConnectionManager
インタフェースを実装することでXSQLの独自のカスタムConnection Managerを作成できます。
XSQLタグとJavaServer Pages(JSP)タグを同じページに組み合せることはできますか。また、そのためにincludeタグを使用しますか。
JSPとXSQLは2つの異なるモデルです。JSPは出力ストリームへの文字のストリームの書出しに基づくモデルです。XSQLは純粋なXMLおよびXSLTベースのモデルです。1日の終わりにHTMLやXMLなどの結果がユーザーに戻されます。コードを作成し、XML文書を文字のストリームとして操作して、内部で大量の再解析を行った場合、XSQLで実装できてJSPで実装できない操作は存在しません。XSQLは顧客がデータ・コンテンツ(XMLで表示)とデータ表示(XSLTスタイルシートで表示)を明確に分ける場合のアーキテクチャに適しています。XSQLはXML/XSLTアーキテクチャを専門に扱うため、このような目的に最適です。
たとえば、<jsp:include>
または<jsp:forward>
を使用して、XSQLページにJSPページを挿入または転送できます。これが最適な方法です。
入力引数に基づいてスタイルシートを動的に変更できます。
これを行うには、xml-stylesheet処理命令のhref属性に字句パラメータを使用します。
<?xml-stylesheet type="text/xsl" href="{@filename}.xsl"?>
パラメータの値をリクエストの一部として渡すことができます。または<xsql:set-page-param>
を使用して、SQL問合せに基づいてパラメータの値を設定できます。
次の質問が提起されました。
100のレコードのセットがあり、一度に10ずつ表示するとします。各列名にリンクを作成してあります。リンクをクリックしたときに、その列に基づいてページごとにデータをソートするようにします。
IE5専用に作成してXMLデータを受け取る場合、Microsoft社のXSLを使用してページ内でデータをソートできます。その他のブラウザ用に作成して、そのブラウザがHTMLとしてデータを受け取る場合、XSQLスクリプトでソート・パラメータを設定し、そのパラメータをORDER BY
句で使用する必要があります。skip-rowsパラメータと一緒にこのパラメータを渡します。