ヘッダーをスキップ
Oracle XML Developer's Kitプログラマーズ・ガイド
10gリリース3(10.1.3)
B28611-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

8 XSQL Pagesパブリッシング・フレームワーク

この章の内容は次のとおりです。

XSQL Pagesパブリッシング・フレームワークの概要

Oracle XSQL Pagesパブリッシング・フレームワークは、XML情報を必要な任意の形式で容易に公開できる拡張可能なプラットフォームです。これにより、SQL、XMLおよびXSLTの機能を組み合せて、データベース情報に基づく動的なWebコンテンツの公開が大幅に簡略化されます。

XSQLパブリッシング・フレームワークを使用すると、SQLに精通した人なら誰でも、XSQLページと呼ばれる宣言テンプレートを作成および使用して次の操作を実行できます。

公開する情報の作成および変換には、プログラミングは必要ありません。実際に一般に行われる操作のほとんどが宣言方式で簡単に実行できます。ただし、XSQLパブリッシング・フレームワークは拡張可能であるため、いずれかの組込み機能が要件に合わない場合は、Javaを使用してフレームワークを容易に拡張し、カスタム情報ソースを統合したり、サーバー側でカスタム処理を実行したりすることができます。

XSQL Pagesフレームワークを使用すると、公開する情報の作成工程と表示工程を明確に分離できます。この単純なアーキテクチャには、生産性における様々なメリットがあります。メリットは次のとおりです。

Oracle XSQL Pagesの機能

サーバー側のテンプレート(.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オブジェクトを使用してプログラム的に実行します。

図8-1 XSQL Pagesフレームワークのアーキテクチャの理解

図8-1の説明が続きます
「図8-1 XSQL Pagesフレームワークのアーキテクチャの理解」の説明

これらのいずれかまたはすべてのシナリオで同じXSQLページ・テンプレートを使用できます。テンプレートが処理される方法を問わず、同じ基本手順で結果が生成されます。XSQL Page Processor Engineは次の操作を実行します。

  1. XSQLテンプレートの処理リクエストを受信します。

  2. 1つ以上のSQL問合せの結果を使用して、XMLデータグラムを作成します。

  3. このXMLデータグラムをリクエスタに戻します。

  4. オプションで、データグラムを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の入手場所

XSQLサーブレットはOracleに付属し、OTNサイトからダウンロードすることもできます。

指定の場所で、この章の例やデモはOTNから入手できます。


関連資料:

http://www.oracle.com/technology/tech/xml/にあるOTNのXSQLサーブレットに関するリリース・ノート

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サーブレットのリリース・ノートを参照してください。

XSQLページのセキュリティ上の注意事項

この項では、Oracle XSQLサーブレットを使用する際の、推奨されるセキュリティ方法について説明します。

安全なディレクトリへのXSQLConfig.xmlファイルのインストール

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文の構文部分をパラメータ化する必要がある場合、字句パラメータを使用することが唯一の方法です。それ以外の場合は、バインド変数をお薦めします。バインド変数を使用すると、無効な値が渡された場合はエラーが生成され、予想外の結果が生成されることはありません。

XSQLページのリリース10.1の新機能

次に、リリース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ページの基本機能の概要

この項では、サーバー側のXSQLページ・テンプレートで実行可能な基本機能の概要について説明します。

  • SQL問合せからのXMLデータグラムの生成

  • 別のXML形式へのXMLデータグラムの変換

  • 表示用のHTMLへのXMLデータグラムの変換

SQL問合せからの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結果

図8-2の説明が続きます
「図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>アクションに固有です。

別のXML形式へのXMLデータグラムの変換

図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の表示

図8-3の説明が続きます
「図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を参照できます。

図8-4 業界標準XML形式でのXSQLページの結果

図8-4の説明が続きます
「図8-4 業界標準XML形式でのXSQLページの結果」の説明

表示用のHTMLへのXMLデータグラムの変換

同じXML情報を別のXML形式ではなくHTMLで戻すには、別のXSLTスタイルシートを使用します。スタイルシートは、<flight-list><flight>などの要素を生成するのではなく、かわりに<table><tr><td>などのHTML要素を生成します。動的に問合せが実行された情報の結果は、図8-5に示すHTMLページの表示に類似しています。XSQLページは、未加工のXML情報を戻すのではなく、サーバー側でのXSLTによる変換を使用して、ブラウザに送信するために情報をHTMLとしてフォーマットします。

図8-5 関連するXSLTスタイルシートを使用したHTMLのレンダリング

図8-5の説明が続きます
「図8-5 関連する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ページの設定と使用

XSQLページは、様々な方法で開発および使用できます。始めに最も簡単な入門方法を説明し、Oracle JDeveloperを使用してから、本番環境で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ページを作成するときに自動的にこのエントリを追加しますが、「プロジェクト」→「プロジェクト・プロパティ」を選択して、「ライブラリ」タブをクリックすることにより、プロジェクトにエントリを手動で追加することもできます。

本番環境でのCLASSPATHの正しい設定

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つの情報項目を指定できます。

  1. <username>

  2. <password>

  3. <dburl>(JDBC接続文字列)

  4. <driver>(使用するJDBCドライバの完全修飾クラス名)

  5. <autocommit>(オプションでAUTOCOMMITTRUEまたはFALSEに設定)

<autocommit>要素を省略した場合、XSQL Page ProcessorはAUTOCOMMITフラグのJDBCドライバのデフォルト設定を使用します。

任意の数の<connection>要素をこのファイルに配置して、必要な接続を定義できます。個々のXSQLページは、ページ内の最上位の要素(ドキュメント要素)にconnection="xxx"属性を挿入して、使用する接続を参照します。


注意:

セキュリティ上の理由から、本番用のWebサーバーにXSQLサーブレットをインストールする場合、XSQLConfig.xmlファイルがWebサーバーの仮想ディレクトリ階層を構成するディレクトリに置かれていないことを確認してください。この注意事項に従わない場合、構成情報がWebで公開されてしまう危険性があります。

XSQLコマンドライン・ユーティリティの使用

動的なページのコンテンツは、使用する環境で頻繁に変更されないデータに基づいていることがほとんどです。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クラスを実行します。

すべてのXSQLページ機能の概要

これまでは1つのXSQLアクション・ハンドラ要素、<xsql:query>アクションのみを見てきました。このアクション・ハンドラ要素は最も一般的なアクションですが、XSQL Pagesフレームワークには他のアクションも組み込まれています。次の項では、XSQLページで使用できるすべての機能について見ていきます。

すべてのコア組込みアクションの使用

この項では、コア組込みアクションのリストを示し、各アクションの機能を簡単に説明します。また、各アクションがサポートするすべての必須属性およびオプションの属性を示します。

<xsql:query>アクション

<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内の書式化された日付列と属性の値に対して使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

error-statement = "boolean"

noに設定すると、生成されたすべての<xsql-error>要素への違反SQL文の挿入が抑制されます。有効値は、yesおよびnoです。デフォルト値はyesです。

fetch-size = "integer"

データベース・ラウンドトリップごとにフェッチするレコードの数。指定しない場合は、XSQLConfig.xml内の/XSQLConfig/processor/default-fetch-size構成設定で指定されているデフォルト値が使用されます。

id-attribute = "string"

結果セット内の各行を一意に識別するためのデフォルトのnum属性のかわりに使用するXML属性名。この属性の値が空の文字列である場合は、行のID属性が抑制されます。

id-attribute-column = "string"

結果セット内の列の大/小文字を区別した名前。この値は、行IDの属性値として各行に指定する必要があります。デフォルトでは、行カウントが行IDの属性値として使用されます。

include-schema = "boolean"

yesに設定すると、結果セットの構造を記述するインラインXMLスキーマが挿入されます。有効値は、yesおよびnoです。デフォルト値はnoです。

max-rows = "integer"

フェッチする行の最大数。オプションで、skip-rows属性が示す行数をスキップした後にフェッチする行の最大数を指定することもできます。指定しない場合は、デフォルトですべての行がフェッチされます。

null-indicator = "boolean"

NULL="Y"属性が列の要素に挿入され、列の値がnullであることを通知するかどうかを指定します。デフォルトでは、値がnullである列は出力されません。有効値は、yesおよびnoです。デフォルト値はnoです。

row-element = "string"

問合せ結果のrowset全体に対するデフォルトの<ROW>要素名のかわりに使用するXML要素名。結果セット内の各行に対して含まれる<ROW>要素の生成を抑制するには、空の文字列を設定します。

rowset-element = "string"

問合せ結果のrowset全体に対するデフォルトの<ROWSET>要素名のかわりに使用するXML要素名。含まれる<ROWSET>要素の生成を抑制するには、空の文字列を設定します。

skip-rows = "integer"

結果セットから行をフェッチする前にスキップする行の数。max-rowsと組み合せて、問合せ結果のステートレス・ページングを行うこともできます。

tag-case = "string"

有効値は、lowerおよびupperです。指定しない場合は、デフォルトで、問合せで対応するXML要素名として指定されている列名の大/小文字が使用されます。


<xsql:dml>アクション

<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"

yesに設定すると、DML文が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yesおよびnoです。デフォルト値はnoです。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

error-statement = "boolean"

noに設定すると、生成されたすべての<xsql-error>要素への違反SQL文の挿入が抑制されます。有効値は、yesおよびnoです。デフォルト値はyesです。


<xsql:ref-cursor-function>アクション

<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>アクション

<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'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

error-statement = "boolean"

noに設定すると、生成されたすべての<xsql-error>要素への違反SQL文の挿入が抑制されます。有効値は、yesおよびnoです。デフォルト値はyesです。


バインド変数の使用

前述のアクションの結果をパラメータ化するには、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パラメータの値が次の順序で解決されます。

  1. paramという名前の、ページのプライベート・パラメータの値(設定されている場合)。設定されていない場合は次に示す値を参照

  2. paramという名前のリクエスト・パラメータの値(指定されている場合)。指定されていない場合は次に示す値を参照

  3. 現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparamという名前の属性によって指定されているデフォルト値。指定されていない場合は次に示す値を参照

  4. 前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列

XSQLサーブレットを使用してHTTP経由で処理されるXSQLページでは、HTTPに固有の2つの追加パラメータを設定および参照できます。これらはHTTPセッション・レベル変数やHTTP Cookieです。XSQLサーブレットを使用して処理されるXSQLページでは、パラメータ値の解決スキームが次のように拡張されます。paramパラメータの値は次の順序で解決されます。

  1. paramという名前の、ページのプライベート・パラメータの値(設定されている場合)。設定されていない場合は次に示す値を参照

  2. paramという名前のCookieの値(設定されている場合)。設定されていない場合は次に示す値を参照

  3. paramという名前のセッション変数の値(設定されている場合)。設定されていない場合は次に示す値を参照

  4. paramという名前のリクエスト・パラメータの値(指定されている場合)。指定されていない場合は次に示す値を参照

  5. 現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparamという名前の属性によって指定されているデフォルト値。指定されていない場合は次に示す値を参照

  6. 前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列

ユーザーがリクエストにパラメータ値を指定して、HTTPセッションで設定されている同じ名前のパラメータ(存続期間はそのHTTPセッションの継続期間で、Webサーバーで制御)、または、Cookieとして設定されている同じ名前のパラメータ(ブラウザ・セッション中存続するように設定可能)をオーバーライドできないように、このような解決順序が設定されています。

<xsql:include-request-params>アクション

<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>アクション

<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>アクション

<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に、このアクションがサポートする属性を示します。太字の属性は必須です。

表8-4 <xsql:include-xml>の属性

属性名 説明
bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。


<xsql:include-posted-xml>アクション

<xsql:include-posted-xml>アクションでは、リクエストでポストされたXML文書をXSQLページに挿入します。XML文書ではなくHTML形式をポストした場合、挿入されるXMLは、<xsql:include-request-params>アクションによって挿入されるものと類似したものになります。

<xsql:set-page-param>アクション

<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 ..."

値を設定するページ・パラメータ名を空白またはカンマで区切ったリスト。name属性またはnames属性のいずれかを使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

ページ・レベルのパラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesまたはnoです。デフォルト値はnoです。

treat-list-as-array = "boolean"

パラメータに割り当てられた文字列値を、割当て前に別の値の配列にトークン化するかどうかを指定します。文字列中にカンマが存在する場合、トークンの区切りにそのカンマが使用されます。それ以外の場合は、空白が使用されます。有効な値は、yesおよびnoです。デフォルト値は、設定中のパラメータ名が配列パラメータ名(たとえば、myparam[])である場合はyes、設定中のパラメータ名が単一の値のパラメータ名(たとえば、myparam)である場合はnoです。

iquote-array-values = "boolean"

設定されているパラメータ名が単一の値のパラメータ名(たとえば、myparam)で、treat-list-as-array="yes"を指定している場合、quote-array-values="yes"を指定すると、カンマで値が区切られる前に各文字列トークンが一重引用符で囲まれます。有効値は、yesおよびnoです。デフォルト値はnoです。

xpath = "XPathExpression"

XSQL Page ProcessorにポストされたXML文書またはHTML形式に対して評価されたXPath式に、パラメータの値を設定します。


<xsql:set-session-param>アクション

<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 ..."

値を設定するセッション・パラメータ名を空白またはカンマで区切ったリスト。name属性またはnames属性のいずれかを使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定します。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

セッション・レベルのパラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesおよびnoです。デフォルト値はnoです。

only-if-unset = "boolean"

セッション変数が存在しない場合にのみセッション変数を割り当てるかどうかを指定します。有効値は、yesおよびnoです。デフォルト値はnoです。


<xsql:set-cookie>アクション

<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名を空白またはカンマで区切ったリスト。name属性またはnames属性のいずれかを使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

domain = "string"

Cookieの値が有効で読取り可能なドメイン。ドメインが明示的に設定されていない場合は、デフォルトで、そのCookieを作成するドキュメントの完全修飾ホスト名(bigserver.yourcompany.comなど)に設定されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定します。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

Cookieに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesおよびnoです。デフォルト値はnoです。

max-age = "integer"

Cookieの存続期間の最大値(秒)を設定します。デフォルトでは、Cookieが現行ブラウザ・セッションの終了時に期限切れになるように設定されます。

only-if-unset = "boolean"

Cookieが存在しない場合にのみCookieを割り当てるかどうかを指定します。有効値は、yesおよびnoです。デフォルト値はnoです。

path = "string"

Cookieの値が有効で読取り可能なドメイン内の相対URLパス。パスが明示的に設定されていない場合は、デフォルトで、そのCookieを作成するドキュメントのURLパスに設定されます。

immediate = "boolean"

Cookieの割当てを現在のページにすぐに表示するかどうかを指定します。通常、現行のリクエストで設定されたCookieは、ブラウザが後続のリクエストでCookieをサーバーに送信するまでは、表示されません。有効値は、yesおよびnoです。デフォルト値はnoです。


<xsql:set-stylesheet-param>アクション

<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 ..."

値を設定する最上位のスタイルシート・パラメータ名を空白またはカンマで区切ったリスト。name属性またはnames属性のいずれかを使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

スタイルシート・パラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesおよびnoです。デフォルト値はnoです。


配列値パラメータの使用

単一の文字列値のサポートに加えて、リクエスト・パラメータ、セッション・パラメータおよびページのプライベート・パラメータで、値に文字列の配列を使用できます。パラメータの値を配列として処理するには、パラメータの名前の最後に一対の空の大カッコを追加します。たとえば、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'"を割り当てます。

SQL文およびPL/SQL文での配列値パラメータのバインド

文字列値のスカラー型バインド変数がサポートされている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"}に設定されます。

XSQLRequestを使用した複数値のパラメータのプログラムによる指定

XSQL Page Engineに対するXSQLRequestプログラムAPIは、名前付きパラメータのjava.util.Dictionaryを取ります。通常、リクエストにString値パラメータを追加するには、Hashtableを使用し、そのput(name,value)メソッドをコールします。複数値のパラメータを追加する場合は、String型の値ではなくString[]型の値のみを使用します。

<xsql:if-param>を使用した、条件付きのアクションの実行またはコンテンツの挿入

<xsql:if-param>アクションを使用すると、ある条件が真である場合に、このアクション内にネストされている要素およびアクションを条件付きで挿入できます。条件が真として評価される場合は、すべてのネストされたXMLコンテンツおよびアクションがページに挿入されます。条件が偽として評価される場合は、ネストされたXMLコンテンツまたはアクションはいずれも挿入されません(したがって、ネストされたアクションは実行されません)。

評価するパラメータ値を指定するには、必要なname属性を指定します。単純なパラメータの名前と配列パラメータの名前の両方を指定できます。

パラメータ値(配列の場合は複数)のテスト方法を指定するために、name属性の他に次の5つの属性のいずれかを使用する必要があります。

  1. exists="yes"またはexists="no"

    exists="yes"を使用する場合、名前付きパラメータが存在するかどうか、そして値が空でないかどうかがテストされます。配列値パラメータについては、配列パラメータが存在し、空ではない要素が1つ以上含まれているかどうかがテストされます。exists="no"を使用する場合、パラメータが存在しないとき、または存在するが値が空であるときに真と評価されます。配列値パラメータについては、パラメータが存在しないとき、または配列要素がすべて空であるときに真と評価されます。

  2. equals="stringValue"

    名前付きパラメータと指定された文字列値が等しいかどうかがテストされます。デフォルトでは、文字列が完全一致するかどうかが比較されます。配列値パラメータについては、配列内の任意の要素に指定された値が含まれているかどうかがテストされます。

  3. not-equals="stringValue"

    名前付きパラメータと指定された文字列値が等しくないかどうかがテストされます。配列値パラメータについては、配列内の要素のいずれにも指定された値が含まれていないときに真と評価されます。

  4. in-list="comma-or-space-separated-list"

    名前付きパラメータが指定されたリスト内の文字列のいずれかに一致するかどうかがテストされます。文字列内にカンマが検出された場合、そのカンマはデリミタとして使用され、それ以外の場合は空白がデリミタとして使用され、in-listパラメータの値が配列にトークン化されます。配列値パラメータについては、配列内の任意の要素がリスト内の要素に一致するかどうかがテストされます。

  5. not-in-list="comma-or-space-separated-list"

    名前付きパラメータが指定されたリスト内の文字列のいずれかに一致しないかどうかがテストされます。文字列内にカンマが検出された場合、そのカンマはデリミタとして使用され、それ以外の場合は空白がデリミタとして使用され、not-in-listパラメータの値が配列にトークン化されます。配列値パラメータについては、配列内の要素がいずれもリスト内の任意の要素に一致しないかどうかがテストされます。

equalsnot-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: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"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

reparse = "boolean"

挿入されたXSQLページの出力を挿入前に再解析するかどうかを指定します。この属性は、挿入側のページが要素として処理する必要があるXML文書のフラグメントのテキストを、挿入されたXSQLページが選択している場合に有効です。有効な値は、yesおよびnoです。デフォルト値はnoです。


XMLType問合せ結果の挿入

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"

yesに設定すると、挿入が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yesおよびnoです。デフォルト値はyesです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。

date-format = "string"

挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。


表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"

yesに設定すると、更新が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yesおよびnoです。デフォルト値はyesです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。

date-format = "string"

挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。


表8-12 <xsql:delete-request>の属性

属性名 説明
table = "string"

XML情報の挿入に使用する表、ビューまたはシノニムの名前。

key-columns = "string"

ポストされたXML文書の値が更新する既存の行の識別に使用する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。

transform = "URL"

挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

commit = "boolean"

yesに設定すると、削除が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yesおよびnoです。デフォルト値はyesです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。


表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"

yesに設定すると、挿入が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yesおよびnoです。デフォルト値はyesです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるNを指定すると、Nのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。指定されない場合のデフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。

date-format = "string"

挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。


様々なXMLポスト・オプションの理解

XSQL Pagesフレームワークでは、ポストされた情報を3つの異なる方法で処理できます。

  1. クライアント・プログラムは、XSQLページをターゲットとするHTTP POSTメッセージを送信できます。そのリクエストの本体にはXML文書を含み、HTTPヘッダーに"text/xml"のContentTypeを指定します。

    この場合、<xsql:insert-request><xsql:update-request>または<xsql:delete-request>アクションを使用して、ポストされたXMLのコンテンツを指定したとおりにターゲット表で挿入、更新または削除できます。XSLT変換を使用してポストされたXML文書を変換する場合、ポストされたXML文書がこの変換のソース・ドキュメントです。

  2. クライアント・プログラムは、パラメータの1つにXML文書を含む、XSQLページに対するHTTP GETリクエストを送信できます。

    この場合、<xsql:insert-param>アクションを使用して、ポストされたXMLパラメータ値のコンテンツを指定したとおりにターゲット表に挿入できます。XSLT変換を使用してポストされたXML文書を変換する場合、パラメータ値内のXML文書がこの変換のソース・ドキュメントです。

  3. ブラウザは、アクションが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アクション・ハンドラの使用

組込みアクション・ハンドラで処理されないタスクを実行する必要がある場合、XSQL Pagesフレームワークでは、カスタム・アクションを起動して、必要なジョブをページ処理の一部として実質的に行うことができます。カスタム・アクションは、任意のXMLコンテンツをデータ・ページに提供し、任意の処理を実行することができます。Javaでのカスタム・アクション・ハンドラの作成の詳細は、この章で後述する「カスタムXSQLアクション・ハンドラの作成」を参照してください。ここでは、カスタム・アクション・ハンドラがすでに作成されたものとしてその使用方法を見ていきます。

カスタム・アクション・ハンドラを起動するには、組込み<xsql:action>アクション・ハンドラ要素を使用します。この要素には、handlerという単一の必須属性があり、その値は起動するアクションの完全修飾Javaクラス名です。このクラスはoracle.xml.xsql.XSQLActionHandlerインタフェースを実装する必要があります。次に例を示します。

<xsql:action handler="yourpackage.YourCustomHandler"/>

通常の方法では、任意の数の追加属性をハンドラに指定できます。たとえば、yourpackage.YourCustomHandlerparam1および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>

XSQLサーブレットのサンプルの説明

表8-14に、ソフトウェアで提供される./demoディレクトリ内のXSQLサーブレットのサンプル・アプリケーションを示します。

表8-14 XSQLサーブレットのサンプル

デモの名前 説明

Hello World

./demo/helloworld

最も簡単で実行可能なXSQLページ。

Do You XML Site ./demo/doyouxml

XSQLページを使用して単純なデータ・ドリブンのWebサイトを構築する方法を示すXSQLページ。問合せにSQL、XSQLの置換変数を使用し、サイトの形式にXSLTを使用します。

(ステートレスな方法で問合せ結果をページングするための)表示およびスキップするレコード数などの制御に、<xsql:query>タグ内のSQL問合せ文の本体と<xsql:query>タグの属性内の両方で置換パラメータを使用した実例を示します。

Employee Page

./demo/emp

HRスキーマのEMPLOYEES表のXMLデータを表示するXSQLページ。XSQLページ・パラメータを使用して、戻される従業員およびデータベースのソートに使用する列を制御します。

関連付けられたXSLTスタイルシートを使用して、フォーム・アクションとしてemp.xsqlページを含むHTMLフォームに結果をフォーマットします。そのため、ユーザーは検索基準を絞り込むことができます。

Insurance Claim Page

./demo/insclaim

豊富な構造のInsurance Claimオブジェクト・ビューに対するサンプル問合せの実例を示します。insclaim.sqlは、INSURANCE_CLAIM_VIEWオブジェクト・ビューを設定し、サンプル・データを移入します。

Invalid Classes Page ./demo/classerr

invalidclasses.xslを使用して、スキーマ内で発生した現在のJavaクラスのコンパイル・エラーの最新リストをフォーマットするXSQLページ。付属のSQLスクリプトは、デモ用のXSQLJavaClassesViewオブジェクト・ビューを設定します。オブジェクト・ビューからのマスター情報/ディテール情報は、サーバー内のinvalidclasses.xslスタイルシートによってHTMLにフォーマットされます。

Airport Code Validation ./demo/airport

3文字の空港コードに基づいて、空港情報のデータグラムを戻すXSQLページ。最初の問合せが行を戻さない場合、代替の問合せとして<xsql:no-rows-query>を使用します。XSQLページは、渡された空港コードの一致検索を試みた後、空港の説明に基づいて、あいまい一致検索を試みます。

airport.htmページは、JavaScriptによってInternet Explorer 5.0の組込みXML Document Object Model(DOM)機能を使用して、Webページからのairport.xsqlページのXML結果を使用する方法を実例で示します。

Webページ上で3文字の空港コードを入力すると、JavaScriptは、Web上のXSQLサーブレットから、入力したコードに対応するXMLデータグラムをフェッチします。戻り値が、一致するものがなかったことを示す場合、プログラムは、XSQLサーブレットからXMLデータグラム形式で戻された情報に基づいて、一致する可能性があるもののリストを生成します。

Airport Code Display ./demo/airport

前述の例と同じXSQLページを使用して実例を示しますが、ここでは、リクエストでXSLTスタイルシート名を指定します。これによって、空港情報は、未加工のXMLとして戻されるのではなく、HTMLフォームにフォーマットされます。

Airport Soap Service ./demo/airport

空港情報をSOAPサービスとして戻す実例を示します。

Emp/Dept Object Demo

./demo/empdept

オブジェクト・ビューを使用して、EMPやDEPTなどの2つの既存フラット表からのマスター情報/ディテール情報をグループ化する実例を示します。empdeptobjs.sqlスクリプトが、オブジェクト・ビューを作成します(INSTEAD OF INSERTトリガーも作成し、マスター・ビュー/詳細ビューをxsql:insert-requestの挿入ターゲットとして使用できるようにします)。

empdept.xslスタイルシートは、最上位に余分なxsl:stylesheetまたはxsl:transformのないHTMLページのように見える形式のXSLTスタイルシートの簡単な例を示します。これは、リテラル結果要素をスタイルシートとして使用するXSLT 1.0仕様の一部です。生成されたHTMLが、coolcolors.cssファイル内にある、集中化されたHTMLスタイルの情報用のCSSを十分に使用できるように、<link rel="stylesheet">を含むHTMLページを生成する実例も示します。

Adhoc Query Visualization

./demo/adhocsql

パラメータとして使用するSQL問合せ全体およびXSLTスタイルシートをサーバーに渡す実例を示します。

XML Document Demo ./demo/document

XML文書をリレーショナル表に挿入する実例を示します。docdemo.sqlスクリプトが、XMLDOCFRAGという、CLOB型の属性を含むユーザー定義型を作成します。

文書のテキストを./xsql/demo/xml99.xmlに挿入し、スタイルシートとしてxml99.xslという名前を指定します。./xsql/demo/JDevRelNotes.xmlにも挿入し、スタイルシートとしてrelnotes.xslという名前を指定します。

docstyle.xsqlページは、クライアントが提供するスタイルシート名を使用して最終出力を変換する前に、doc.xsqlページの出力を独自のページに挿入するためのアクション・ハンドラ要素である<xsql:include-xsql>の例を示します。

デモは、Internet Explorer 5.0のクライアント側XML機能を使用して、文書がサーバーにポストされる前に、その文書が整形式であるかどうかを確認します。

XML Insert Request Demo ./demo/insertxml

クライアントからのXMLをXSQLページにポストする実例を示します。このXSQLページは、アクション・ハンドラ要素である<xsql:insert-request>を使用して、ポストされたXML情報をデータベース表に挿入します。このデモは、moreover.comが提供するXMLベースのニュース形式のXML文書を受け入れるように設定されています。

この場合、XMLをポストするプログラムは、Internet Explorer 5.0、およびJavaScriptからXMLHttpRequestオブジェクトを使用するクライアント側のWebページです。insertnewsstory.xsqlページのソースを見ると、このページが表名およびXSLT変換名を指定していることがわかります。moreover-to-newsstory.xslスタイルシートは、受信したXML情報をOracleXMLSaveユーティリティが挿入方法を判断できる正規の形式に変換します。

<article>要素の例を<moreovernews>要素内に数回コピーおよび貼付けして、数個の新しいニュース記事を一度に挿入します。

newsstory.sqlスクリプトは、受信データの処理方法、主キーのデフォルト値などをカスタマイズするために、XSQLページにデータを挿入させる挿入先のデータベース・ビューでINSTEAD OFトリガーを使用する方法を示します。

SVG Demo

./demo/svg

deptlist.xsqlページが、SalChart.xsqlページへのハイパーリンクを使用して、単純な部門リストを表示します。SalChart.xsqlページは、パラメータとして渡された特定の部門の従業員を問い合せ、SalChart.xsqlスタイルシートを使用して、問合せの結果をその部門内の従業員の給与を比較する棒グラフのSVGにフォーマットします。

PDF Demo

./demo/fop

emptable.xsqlページが、単純な従業員リストを表示します。emptable.xslスタイルシートは、データ・ページをXSLFOに変換します。XSLFOは、組込みFOPシリアライザと組み合されて、結果をAdobe PDF形式にレンダリングします。


デモ・データの設定

デモ・データを設定するには、次の手順を実行します。

  1. ディレクトリを./demoディレクトリに変更します。

  2. このディレクトリでSQLPLUSを実行します。Oracle Text(Intermedia Text)パッケージのスキーマ所有者であるCTXSYS/CTXSYSとしてデータベースに接続して、次のコマンドを発行します。

    GRANT EXECUTE ON ctx_ddl TO scott;
    
    
  3. SYSTEM/MANAGERとしてデータベースに接続して、次のコマンドを発行します。

    GRANT QUERY REWRITE TO scott;
    
    

    これによって、SCOTTは、デモの1つが空港の説明に基づく大/小文字を区別しない問合せを実行するために使用するファンクション索引を作成できるようになります。

  4. SCOTT/TIGERとしてデータベースに接続します。

  5. スクリプトinstall.sql./demoディレクトリで実行します。このスクリプトは、すべてのデモ用のすべてのSQLスクリプトを実行します。

    install.sql
    @@insclaim/insclaim.sql
    @@document/docdemo.sql
    @@classerr/invalidclasses.sql
    @@airport/airport.sql
    @@insertxml/newsstory.sql
    @@empdept/empdeptobjs.sql
    



  1. ディレクトリを./doyouxmlサブディレクトリに変更して、次のコマンドを実行します。

    imp scott/tiger file=doyouxml.dmp
    
    

    Do You XML? Siteデモ用のサンプル・データがインポートされます。

  1. SVGのデモンストレーションを体験するには、Adobe社製のSVG Plug-inなどのSVGプラグインをブラウザにインストールします。

高度なXSQLページのトピック

これらの項では、XSQLページの高度なトピックについて説明します。

カスタム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スタイルシートの場合、この属性は文字列text/xslに設定する必要があります。

serializer属性を使用する場合、この属性は、そのシリアライザをコールする前にXSLTスタイルシートを実行する必要があるかどうかによって、存在する場合と存在しない場合があります。

href = "URL"

使用するXSLTスタイルシートへの相対URLまたは絶対URLを指定します。httpプロトコル・スキームを使用する絶対URLを指定する場合は、リソースのIPアドレスがXSQL構成ファイル(デフォルト名XSQLConfig.xml)に示されているトラステッド・ホストである必要があります。

media = "string"

この属性はオプションです。指定した場合、リクエスト側デバイスが送信したHTTPヘッダーのUser-Agent文字列に対する大/小文字を区別しない一致検索を実行するためにその値が使用されます。現行の<?xml-stylesheet?>処理命令は、User-Agent文字列にmedia属性の値が含まれている場合にのみ使用されます。含まれていない場合は、無視されます。

client = "boolean"

yesに設定すると、XSQL Page Processorでは、関連付けられた、クライアントに対するXSLTスタイルシートの処理が遅延します。ドキュメントの最上部に現行の<?xml-stylesheet?>処理命令が挿入された状態で、未加工のXMLデータグラムがクライアントに送信されます。値を指定しない場合、デフォルトでは、変換がサーバーで実行されます。

serializer = "string"

デフォルトでは、XSQL Page Processorは次のシリアライザを使用します。

  • XML DOMシリアライザ(XSLTスタイルシートを使用しない場合)

  • XSLTプロセッサのシリアライザ(XSLTスタイルシートを使用する場合)

この擬似属性を指定すると、前述のコードのかわりにカスタム・シリアライザの実装を使用する必要があります。

有効値は、XSQL構成ファイル(デフォルトではXSQLConfig.xml)の<serializerdefs>セクションで定義されるカスタム・シリアライザの名前、または文字列java:fully.qualified.Classnameです。XSLTスタイルシートとserializer属性の両方が存在する場合は、まずXSLT変換が実行され、次にカスタム・シリアライザがコールされて最終結果がOutputStreamまたはPrintWriterにレンダリングされます。


XSQL構成ファイルを使用した環境のチューニング

XSQL構成ファイル(デフォルトではXSQLConfig.xml)を使用して、XSQLページ環境をチューニングできます。表8-16に、設定可能なすべてのパラメータを定義します。

表8-16 XSQL構成ファイルの設定

構成設定名 説明
XSQLConfig/servlet/output-buffer-size

バッファ付き出力ストリーム・サイズ(バイト単位)を設定します。サーブレット・エンジンがすでにI/Oをサーブレット出力ストリームにバッファリング済である場合は、0に設定してさらなるバッファリングを回避できます。

デフォルト値は0です。有効値は負ではない整数です。

XSQLConfig/servlet/suppress-mime-charset/media-type

XSQLサーブレットは、HTTP ContentTypeヘッダーがリクエストに対して戻されているリソースのMIMEタイプを示すように設定します。デフォルトでは、XSQLサーブレットはMIMEタイプにオプションのキャラクタ・セット情報を挿入します。特定のMIMEタイプについて、必要なMIMEタイプをコンテンツとして指定した<media-type>要素を挿入すると、キャラクタ・セット情報の挿入を抑制できます。

任意の数の<media-type>要素を指定できます。

有効値はすべての文字列です。

XSQLConfig/processor/character-set-conversion/default-charset

デフォルトでは、HTTPパラメータの値に基づいてXSQL Page Processorでキャラクタ・セット変換が行われ、ほぼすべてのサーブレット・エンジンが使用するデフォルトのキャラクタ・セットを補完します。変換に使用されるデフォルトのベース・キャラクタ・セットは、IANAのISO-8859-1キャラクタ・セットに対応するJavaキャラクタ・セット8859_1です。サーブレット・エンジンが異なるキャラクタ・セットをベースとして使用する場合は、この構成設定でその値を指定できます。

キャラクタ・セット変換を抑制するには、<default-charset>要素のコンテンツとして、キャラクタ・セット名ではなく空の要素である<none/>を指定します。この方法は、サーブレットのデフォルト・キャラクタ・セットを使用して適切に表示できるパラメータ値を使用する場合に有効であり、キャラクタ・セット変換の実行に関連するオーバーヘッドが削減されます。

有効値は、すべてのJavaキャラクタ・セット名または<none/>要素です。

XSQLConfig/processor/reload-connections-on-error

XSQL Page Processorを初期化すると、接続定義がキャッシュされます。yesに設定した場合、キャッシュされた接続のリストに含まれていない接続名のリクエストが試行されると、XSQL Page ProcessorはXSQLConfig.xmlファイルを再度読み取り、接続定義を再ロードします。yesを設定すると、開発時、サーブレットの実行中に新しい<connection>定義をファイルに追加する場合に有効です。メモリー内のキャッシュで接続名が見つからなかった場合の接続定義ファイルの再ロードを回避するには、noに設定します。

デフォルト値はyesです。有効値は、yesおよびnoです。

XSQLConfig/processor/default-fetch-size

データベースからSQL問合せを使用して情報を取得するための行のフェッチ・サイズのデフォルト値を設定します。この設定は、Oracle JDBC Driverを使用している場合にのみ有効です。それ以外の場合は無視されます。異なる層で実行中のサーブレット・エンジンからデータベースへのネットワーク・ラウンドトリップの削減に役立ちます。

デフォルト値は50です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/page-cache-size

XSQLページ・テンプレート用のXSQLキャッシュ・サイズを設定します。この設定は、キャッシュされるXSQLページの最大数を決定します。この最大数を超えると、最も使用頻度の少ないページがキャッシュから削除されます。

デフォルト値は25です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-cache-size

XSLTスタイルシート用のXSQLキャッシュ・サイズを設定します。この設定は、キャッシュされるスタイルシートの最大数を決定します。この最大数を超えると、最も使用頻度の少ないスタイルシートがキャッシュから削除されます。

デフォルト値は25です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-pool/initial

実際に、キャッシュされた各スタイルシートは、スループットを改善するためにキャッシュされたスタイルシート・インスタンスのプールです。この構成設定は、各スタイルシート・プールに対するスタイルシートの初期割当て数を設定します。

デフォルト値は1です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-pool/increment

サーバー上でのロードが増加したためスタイルシート・プールを拡大する必要がある場合に割り当てるスタイルシートの数を設定します。

デフォルト値は1です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-pool/timeout-seconds

プールが縮小して初期サイズに戻ろうとするときに、プール内のスタイルシート・インスタンスが削除され、リソースが解放される前の非活動時間(秒)を設定します。

デフォルト値は60です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/initial

XSQL Page ProcessorのデフォルトのConnection Managerは、接続プーリングを実装して、スループットを改善します。この設定は、各接続プールに対するJDBC接続の初期割当て数を制御します。

デフォルト値は2です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/increment

サーバー上でのロードが増加したため接続プールを拡大する必要がある場合に割り当てる接続の数を設定します。

デフォルト値は1です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/timeout-seconds

プールが縮小して初期サイズに戻ろうとするときに、プール内のJDBC接続が削除され、リソースが解放される前の非活動時間(秒)を設定します。

デフォルト値は60です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/dump-allowed

dump-pool=yパラメータをページ・リクエストで渡すことによって接続プール・アクティビティの診断レポートをリクエストできるかどうかを決定します。

デフォルト値はnoです。有効値は、yesまたはnoです。

XSQLConfig/processor/connection-manager/factory

XSQL Connection Managerファクトリ実装の完全修飾Javaクラス名を指定します。指定しない場合、デフォルトではoracle.xml.xsql.XSQLConnectionManagerFactoryImplに設定されます。

デフォルトはoracle.xml.xsql.XSQLConnectionManagerFactoryImplです。有効値はoracle.xml.xsql.XSQLConnectionManagerFactoryインタフェースを実装する任意のクラス名です。

XSQLConfig/processor/owa/fetch-style

<xsql:include-owa>アクションが使用するOWAページ・バッファのデフォルトのフェッチ・スタイルを設定します。有効値は、CLOBまたはTABLEです。指定しない場合のデフォルト値はCLOBです。

CLOBに設定すると、プロセッサは一時CLOBを使用してOWAページ・バッファを取得します。

TABLEに設定すると、プロセッサは、XSQL_OWA_ARRAYというOracleのユーザー定義型を必要とする、より効率的な方法を使用します。この型は、次のDDL文を使用して手動で作成する必要があります。

CREATE TYPE xsql_owa_array AS TABLE OF VARCHAR2(32767)

XSQLConfig/processor/timing/page

XSQL Page Processorがxsql-timing属性を、ページの処理に必要な経過時間(ミリ秒)を報告する値を持つページのドキュメント要素に追加するかどうかを決定します。

デフォルト値はnoです。有効値は、yesまたはnoです。

XSQLConfig/processor/timing/action

XSQL Page Processorがページ内の、アクションの処理に必要な経過時間(秒)を報告するコンテンツを持つアクション・ハンドラ要素のすぐ前にコメントを追加するかどうかを決定します。

デフォルト値はnoです。有効値は、yesまたはnoです。

XSQLConfig/processor/logger/factory

カスタムXSQLログ出力ファクトリ実装の完全修飾Javaクラス名を指定します。値を指定しない場合は、ログは出力されません。

有効値はoracle.xml.xsql.XSQLLoggerFactoryインタフェースを実装する任意のクラス名です。

XSQLConfig/processor/error-handler/class

デフォルトのエラー・ハンドラ実装になるカスタムXSQLエラー・ハンドラの完全修飾Javaクラス名を指定します。値を指定しない場合は、デフォルトのエラー・ハンドラが使用されます。

有効値はoracle.xml.xsql.XSQLErrorHandlerインタフェースを実装する任意のクラス名です。

XSQLConfig/processor/xml-parsing/preserve-whitespace

XSQLページ・テンプレートおよびXSLTスタイルシートの解析時に、XSQL Page Processorで空白を保持するかどうかを決定します。

デフォルト値はtrueです。有効値は、trueまたはfalseです。デフォルトをfalseに変更すると空白が無視されるため、XSQLページおよびXSQLスタイルシートの処理が若干速くなります。空白を無視する方が解析は速く実行されます。

XSQLConfig/processor/security/stylesheet/defaults/allow-client-style

アプリケーションの開発中は、特定のxml-stylesheetパラメータの値をリクエストで指定し、XSQL Page Processorの各リクエスト・スタイルシートをオーバーライドする機能を使用すると便利な場合が多くあります。最も一般的な使用方法の1つは、xml-stylesheet=noneの組合せを指定してスタイルシートの適用を一時的に無効にし、デバッグ操作のために未処理のXSQLデータ・ページを参照することです。

開発が完了すると、allow-client-style="no"属性を各XSQLページのドキュメント要素に明示的に追加して、クライアントが本番アプリケーションでスタイルシートをオーバーライドしないようにできます。ただし、この構成設定を使用すると、allow-client-styleのデフォルト動作を1つの場所でグローバルに変更できます。

この設定で指定されるのはデフォルト動作のみであることに注意してください。特定のXSQLページのドキュメント要素に対してallow-client-style="yes|no"属性を明示的に指定すると、その値がこのグローバル・デフォルト値より優先されます。

有効値は、yesおよびnoです。

XSQLConfig/processor/security/stylesheet/trusted-hosts/host

XSLTスタイルシートは拡張関数を起動できます。特に、XSQL Page ProcessorがすべてのXSLTスタイルシートの処理に使用するOracle XSLT Processorでは、Java拡張関数がサポートされます。通常、XSQLページは相対URLを使用してXSLTスタイルシートを参照します。XSQL Page Processorでは、処理されるXSLTスタイルシートへの絶対URLが構成ファイルに示されている名前を持つトラステッド・ホストからのものになるように強制します。

<trusted-hosts>要素内で任意の数の<host>要素を指定できます。デフォルトでは、ローカル・マシン名、localhostおよび127.0.0.1がトラステッド・ホストです。

有効値は、すべてのホスト名またはIPアドレスです。

XSQLConfig/http/proxyhost

HTTPプロトコル・スキームを使用するURLを処理する場合に使用するHTTPプロキシ・サーバーの名前を設定します。

有効値は、すべてのホスト名またはIPアドレスです。

XSQLConfig/http/proxyport

HTTPプロトコル・スキームを使用するURLを処理する場合に使用するHTTPプロキシ・サーバーのポート番号を設定します。

有効値は0(ゼロ)以外の整数です。

XSQLConfig/connectiondefs/connection

XSQL Page Processorが使用する名前付き接続のニックネームおよびJDBC接続の詳細を定義します。

<connectiondefs>には、任意の数の<connection>子要素を指定できます。各接続定義にはname属性を指定する必要があります。また、適切な子要素<username>、<password>、<driver>、<dburl>および<autocommit>を指定できます。

XSQLConfig/connectiondefs/connection/username

現行の接続のユーザー名を定義します。

XSQLConfig/connectiondefs/connection/password

現行の接続のパスワードを定義します。

XSQLConfig/connectiondefs/connection/dburl

現行の接続のJDBC接続URLを定義します。

XSQLConfig/connectiondefs/connection/driver

現行の接続に使用するJDBCドライバの完全修飾Javaクラス名を指定します。値を指定しない場合は、デフォルトでoracle.jdbc.driver.OracleDriverに設定されます。

XSQLConfig/connectiondefs/connection/autocommit

現行の接続の自動コミット・フラグを明示的に設定します。値を指定しない場合、接続はJDBCドライバの自動コミットのデフォルト設定を使用します。

XSQLConfig/serializerdefs/serializer

名前付きカスタム・シリアライザの実装を定義します。

<serializerdefs>には、任意の数の<serializer>子要素を指定できます。各シリアライザには、<name>子要素と<class>子要素の両方を指定する必要があります。

XSQLConfig/serializerdefs/serializer/name

現行のカスタム・シリアライザ定義の名前を定義します。

XSQLConfig/connectiondefs/connection/class

現行のカスタム・シリアライザの完全修飾Javaクラス名を指定します。このクラスはoracle.xml.xsql.XSQLDocumentSerializerインタフェースを実装する必要があります。


FOPシリアライザを使用したPDF出力の生成

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アーカイブを追加する必要があります。
  • xsqlserializers.jar - Oracle XSQLで提供されるJavaアーカイブ

  • fop.jar - Apacheバージョン0.20.3以上のJavaアーカイブ

  • batik.jar - FOP配布パッケージに含まれるJavaアーカイブ

  • avalon-framework-4.0.jar - FOP配布パッケージに含まれるJavaアーカイブ

  • logkit-1.0.jar - FOP配布パッケージに含まれる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);
    }
  }
}

プログラムでのXSQL Page Processorの使用

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ページが使用できる独自のアクションを作成することでレパートリーを増やすことができます。

XSQL Page Processorのコアは、アクション・ハンドラ要素を含む、XML文書を処理するエンジンです。Page Processor Engineは、XSQLActionHandlerインタフェースを実装するすべてのアクションをサポートするように作成されています。すべての組込みアクションは、このインタフェースを実装します。

XSQL Page Processorは、ページ内のアクションを次の方法で処理します。ページ内のアクションごとに、エンジンは次の手順を実行します。

  1. デフォルトのコンストラクタを使用して、アクション・ハンドラ・クラスのインスタンスを作成します。

  2. メソッドinit(Element actionElt,XSQLPageRequest context)をコールして、アクション・ハンドラ要素オブジェクトおよびXSQL Page Processorコンテキストを含むハンドラ・インスタンスを初期化します。

  3. メソッド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>

XSQLQueryHandler

任意のSQL文を実行し、その結果を正規のXML形式に挿入します。

<xsql:dml>

XSQLDMLHandler

SQL DML文またはPL/SQL無名ブロックを実行します。

<xsql:set-stylesheet-param>

XSQLStylesheetParameterHandler

最上位のXSLTスタイルシート・パラメータの値を設定します。

<xsql:insert-request>

XSQLInsertRequestHandler

リクエストでポストされたXML文書またはHTMLフォームをデータベース表またはビューに挿入します。

<xsql:include-xml>

XSQLIncludeXMLHandler

相対URLまたは絶対URLを使用して、任意のXMLリソースをページの任意の場所に挿入します。

<xsql:include-request-params>

XSQLIncludeRequestHandler

すべてのリクエスト・パラメータをXML要素としてXSQLページに挿入します。

<xsql:include-posted-xml>

XSQLIncludePostedXMLHandler

 


<xsql:include-xsql>

XSQLIncludeXSQLHandler

XSQLページの結果を別のXSQLページの任意の場所に挿入します。

<xsql:include-owa>

XSQLIncludeOWAHandler

データベース内でOracle Web Agent(OWA)パッケージを使用してXMLを生成するストアド・プロシージャの実行結果を挿入します。

<xsql:action>

XSQLExtensionActionHandler

Javaに実装されたユーザー定義のアクション・ハンドラを起動し、カスタム・ロジックを実行して、カスタムXML情報をXSQLページに挿入します。

<xsql:ref-cursor-function>

XSQLRefCursorFunctionHandler

PL/SQLストアド・ファンクションが戻すカーソルの結果セットの正規のXML表示を挿入します。

<xsql:include-param>

XSQLGetParameterHandler

パラメータおよびその値を要素としてXSQLページに挿入します。

<xsql:if-param>

XSQLIfParamHandler

XMLコンテンツおよび他のXSQLアクション(または他のXSQLアクション)を条件付きで挿入します。

<xsql:set-session-param>

XSQLSetSessionParamHandler

HTTPセッション・レベルのパラメータを設定します。

<xsql:set-page-param>

XSQLSetPageParamHandler

HTTPセッション・レベルのパラメータを設定します。ページの後続のSQL文内で参照できるページ・レベル(ローカル)のパラメータを設定します。

<xsql:set-cookie>

XSQLSetCookieHandler

HTTP Cookieを設定します。

<xsql:insert-param>

XSQLInsertParameterHandler

単一のパラメータの値に含まれるXML文書を挿入します。

<xsql:update-request>

XSQLUpdateRequestHandler

リクエストで指定されたポスト済XML文書に基づいて、データベース内の既存の行を更新します。

<xsql:delete-request>

XSQLDeleteRequestHandler

リクエストで指定されたポスト済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ページ・プロセッサのコンテキストを戻します。このオブジェクトでは次のメソッドを使用できます。

  • setPageParam()

    ページ・パラメータ値を設定します。

  • getPostedDocument()/setPostedDocument()

    ポストされたXML文書を取得または設定します。

  • translateURL()

    相対URLを絶対URLに変換します。

  • getRequestObject()/setRequestObject()

    単一のページのアクション間で共有できるページ・リクエスト・コンテキスト内のオブジェクトを取得または設定します。

  • getJDBCConnection()

    このページが使用中のJDBC接続(使用中の接続がない場合はnull)を取得します。

  • getRequestType()

    Servlet、Command LineまたはProgrammaticのいずれのコンテキストで実行中かを検出します。たとえば、リクエストのタイプがServletの場合は、XSQLPageRequestオブジェクトをより固有のXSQLServletPageRequestにキャストし、getHttpServletRequestgetHttpServletResponsegetServletContextなどのサーブレット固有のメソッドにアクセスできます。

getAttributeAllowingParam

属性値で使用されているすべてのXSQL字句パラメータ参照を解決し、要素から属性値を取得します。通常、このメソッドはアクション・ハンドラ要素自体に適用されますが、サブ要素の属性にアクセスすることも有効です。字句パラメータを許可せずに属性値にアクセスするには、DOMのElementインタフェースに対して標準のgetAttribute()メソッドを使用します。

appendSecondaryDocument

外部XML文書のコンテンツ全体をアクション・ハンドラの結果コンテンツのルートに追加します。

addResultElement

テキスト・コンテンツを含む単一の要素をアクション・ハンドラの結果コンテンツのルートに追加する操作を簡単にします。

firstColumnOfFirstRow

渡されたSQL文の最初の行にある最初の列値を戻します。このメソッドを使用するには、現行のページのドキュメント要素に接続属性が含まれている必要があります。含まれていない場合は、エラーが戻されます。

bindVariableCount

空白で区切られたbind-paramsのリスト内にあるトークンの数を戻します。この値は、パラメータにバインドされるバインド変数の数を示します。

handleBindVariables

現行のアクション・ハンドラ要素のbind-params属性で指定されるパラメータ値を使用して、作成されたSQL文で使用されるJDBCバインド変数のバインディングを管理します。このメソッドをコールする前にSQL文がすでに多くのバインド変数を使用している場合は、使用中である既存のバインド変数スロットの数も渡すことができます。

reportErrorIncludingStatement

問題の原因である違反(SQL)文を含むエラーを報告します。オプションで、エラーに数値エラー・コードが含まれる場合もあります。

reportFatalError

致命的エラーを報告します。

reportMissingAttribute

標準の<xsql-error>要素を使用して、必須のアクション・ハンドラ属性が欠落していることを示すエラーを報告します。

reportStatus

標準の<xsql-status>要素を使用して、アクション・ハンドラの状態を報告します。

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アクション内での複数値パラメータの使用

カスタムXSQLアクションの基本クラスXSQLActionHandlerImplでは、配列名を使用した字句パラメータ置換、配列名を使用したバインド変数および単一の値のパラメータの使用がサポートされます。カスタム・アクションでこの基本クラスからのメソッド、たとえばgetAttributeAllowingParam()getActionElementContent()またはhandleBindVariables()などを使用する場合は、カスタム・アクションで複数値のパラメータの機能を使用できます。

パラメータ値をString[]として明示的に取得するには、XSQLPageRequestインタフェースでgetParameterValues()メソッドを使用します。XSQLActionHandlerImplのヘルパー・メソッドvariableValues()を使用すると、プログラムで必要な場合にカスタム・アクション・ハンドラ内からこの機能を簡単に使用できます。

カスタムXSQLシリアライザの作成

ユーザー定義のシリアライザ・クラスを作成し、最終XSQLデータ・ページのXML文書をテキストまたはバイナリ・ストリームにシリアライズする方法を制御できます。ユーザー定義のシリアライザには、次の単一のメソッドで構成されるoracle.xml.xsql.XSQLDocumentSerializerインタフェースを実装する必要があります。

void serialize(org.w3c.dom.Document doc, XSQLPageRequest env) throws Throwable;

このリリースでは、DOMベースのシリアライザのみがサポートされます。今後のリリースでは、SAX2ベースのシリアライザもサポートされる可能性があります。カスタム・シリアライザ・クラスを使用する場合は、次のタスクを適切な順序で実行する必要があります。

  1. 出力PrintWriter(またはOutputStream)に内容を出力する前に、シリアライズされたストリームのコンテンツ・タイプを設定します。

    シリアライザに渡されるXSQLPageRequestに対してsetContentType()をコールし、型を設定します。コンテンツ・タイプを設定する場合は、次のようなMIMEタイプを設定できます。

    env.setContentType("text/html");
    
    

    または、次のように明示的な出力エンコーディング・キャラクタ・セットを含むMIMEタイプを設定できます。

    env.setContentType("text/html;charset=Shift_JIS");
    
    
  2. 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()(バイナリ出力用)のどちらかをコールする必要があります。ただし、これらの両方をコールすることはできません。同一のリクエストで両方のメソッドをコールすると、エラーが発生します。

JDBCデータソースに対するカスタムXSQL Connection Managerの使用

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つのオプションでは、接続プーリングを提供するためにサーブレット・コンテナの適切な構成に依存しています。プールされた接続を提供するためにデータソースを適切に構成する方法については、使用しているサーブレット・コンテナのドキュメントを参照してください。

カスタムXSQL Connection Managerの作成

カスタムConnection Managerを作成し、組込みConnection Managementメカニズムを置き換えることができます。カスタムConnection Manager実装を提供するには、次のオブジェクトを用意する必要があります。

  1. oracle.xml.xsql.XSQLConnectionManagerFactoryインタフェースを実装するConnection Managerfactoryオブジェクト。

  2. 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はサーブレットの破棄プロセスの一部として、リソースをクリーンアップできます。

カスタムXSQLErrorHandler実装の提供

重大な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つの方法で制御できます。

  1. エラー・ハンドラ・クラスの完全修飾クラス名を/XSQLConfig/processor/error-handler/classエントリの値として指定することで、XSQL構成ファイル(デフォルトではXSQLConfig.xml)にカスタムXSQLErrorHandler実装クラス名を定義できます。

  2. XSQL Page Processorがこのクラスをロードし、XSQLErrorHandlerインタフェースを正しく実装すると、このクラスはシングルトンとして使用され、ページ・プロセッサのエラーが通知された場合にデフォルトの実装をグローバルに置換します。

  3. ページのドキュメント要素に対して、新しいオプションのerrorHandler(またはxsql:errorHandler)属性を使用して、ページごとにエラー・ライターをオーバーライドできます。

  4. この属性の値は、XSQLErrorHandlerインタフェースを実装するクラスの完全修飾クラス名です。このクラスはこのページのみで発生したエラーの通知に使用され、Page Engineによってページ・リクエストごとにインスタンス化されます。

両方の方法を、必要に応じて組み合せて使用できます。

カスタムXSQLログ出力実装の提供

各XSQLページ・リクエストの開始と終了のロギングを処理するカスタム・コードをオプションで登録できます。カスタム・ログ出力コードでは、oracle.xml.xsql.XSQLLoggerFactoryoracle.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アクション・ハンドラ・エラーのフォーマット

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サーブレットの制限とヒント

XSQLサーブレットには次の制限があります。

マルチバイト名を持つHTTPパラメータ

マルチバイト名を持つHTTPパラメータ(漢字表記の名前を持つパラメータなど)は、<xsql:include-request-params>を使用してXSQLページに挿入すると、適切に処理されます。<xsql:query>タグの問合せ文内でマルチバイト名を持つパラメータの参照を試みると、パラメータの値に対して空の文字列が戻されます。

パラメータに非マルチバイト名を使用してください。このパラメータは、引き続きマルチバイト値を持つことができ、このマルチバイト値は正しく処理できます。

SQL文のCURSOR()関数

SQL文でCURSOR()関数を使用する場合、CURSOR()文がネストされ、問合せの最初の行がCURSOR()関数に対して空の結果セットを戻すとExhausted ResultSetエラーが出力される場合があります。

XSQLサーブレットの使用のヒント

この項では、XSUサーブレットのヒントを示します。

XSQL出力をWMLドキュメントに変換中にDTDを指定する方法

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ファイルに条件文を作成できます。

<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プロシージャをコールします。

問合せで取得した値を別の問合せのWHERE句で使用する方法

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>

Oracle以外のデータベースでXSQLサーブレットを使用する方法

XSQLサーブレットはJDBCをサポートするすべてのデータベースに接続できます。XSQL構成ファイル(デフォルトではXSQLConfig.xml)の接続定義に適切なJDBCドライバ・クラスと接続URLを指定してください。もちろん、オブジェクト・リレーショナル機能は、OracleをOracle JDBCドライバとともに使用する場合にのみ機能します。

複数値のHTMLフォーム・パラメータを処理する方法

<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>

Oracleリリース7.3でXSQLサーブレットを実行する方法

Oracleリリース7.3データベースに問題なく接続できるJDBCドライバを必ず使用してください。

<xsql:dml>でサポートされないOUT変数

<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>

次のいずれかが原因でエラーが発生している可能性があります。

  1. データベースがlocalhostで指定されたローカル・ホスト・マシン上にない。

  2. データベースのSIDORCLではない。

  3. TNSリスナー・ポートが1521ではない。

これらの値がデータベースに対して適切であり、問題がないことを確認してください。

.xsql以外のファイル拡張子を使用する方法

拡張子.xsqlは、XSQLページの認識に使用するデフォルトの拡張子です。サーブレット・エンジンの構成設定を変更し、任意の拡張子をoracle.xml.xsql.XSQLServletサーブレット・クラスと関連付けることができます。この関連付けには、拡張子*.xsqllとこのサーブレット・クラスを関連付けたときと同じ方法を使用します。

XMLをポストしようとすると「処理対象の文書がポストされていません」というエラーが発生する原因

XML情報を処理するためにXSQLページにポストする場合は、HTTP POSTメソッドで送信する必要があります。この送信は、HTTP POSTによって送信されたHTTP POST HTML形式またはXML文書になります。かわりにHTTP GETを使用しようとすると、ポスト済の文書が存在しないため、このエラーが発生します。正しく動作させるには、HTTP POSTを使用してください。

XSQLによるSOAPのサポート

使用するXSQLページでは、<xsql:set-page-param>アクションのxpath="XpathExpression属性を使用して、受信SOAPメッセージのコンテンツにアクセスできます。また、getPageRequest().getPostedDocument()をコールして、カスタム・アクション・ハンドラでポストしたSOAPメッセージ本体に直接アクセスすることもできます。クライアントに戻すSOAPレスポンス本体を作成するには、XSLTスタイルシートまたはカスタム・シリアライザの実装を使用して、XMLレスポンスを適切なSOAPエンコーディング形式で書き出すことができます。

XSQLページを使用してSOAPベースのWebサービスを実装する例については、XSQL Pagesフレームワークに付属するAirportSOAPデモを参照してください。

XSQLの接続を渡す方法

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ページのデフォルト・スキームではなく、定義した接続管理スキームが使用されます。

カスタムConnection Managerの認証情報にアクセスする方法

HTTP認証メカニズムを使用して、データベースに接続するためのユーザー名およびパスワードを取得するとします。カスタムConnection ManagerのgetConnection()メソッドでユーザー名およびパスワードの情報を取得できます。

getConnection()メソッドは、XSQLPageRequestインタフェースのインスタンスに渡されます。そのインスタンスから、次の操作を実行してHTTP Requestオブジェクトを取得できます。

  1. リクエストのタイプがServletであることを確認します。

  2. XSQLServletPageRequestXSQLPageRequestをキャストします。

  3. 2.の結果に対してgetHttpServletRequest()をコールします。

HTTP Requestオブジェクトから認証情報を取得できます。

現行のXSQLページから名前を取得する方法

現行ページへのリンクを作成するために、実行時に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;
  }

FOPシリアライザの使用時にエラーを解決する方法

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に追加する必要があります。

  1. fop.jar - Apache FOP Rendering Engine

  2. batik.jar - Apache Batik SVG Rendering Engine

  3. avalon-framework-4.0.jar - Apache Avalon Framework用のAPI

  4. logkit-1.0.jar - Apache Logkit用のAPI

パフォーマンスを最適化するためにXSQLページをチューニングする方法

パフォーマンスに最も影響を与えるのは、問合せ対象のデータのサイズ(および問合せの純粋な速度)です。問合せをチューニングして、SQLが許可する場所に字句バインド変数ではなくバインド変数を使用している場合、それ以外の主なヒントとしては、必要な結果をレンダリングするために必要最小限のデータにのみ問合せを行っているかどうかを確認することです。

何千もの行のデータに問合せを行っている場合、XSLTスタイルシートを使用して、ブラウザにこれらの行のうち10行のみを表示するようにフィルタリングすることはよい選択とは言えません。データベースの機能を最大限に利用して、行のフィルタを行い、可能なかぎり必要な10行のみを戻します。Oracleデータベースと、変換言語として使用するXSLTの機能間でXSQLは単純な調整を行っていると考えられます。

他の接続プール実装でXSQLを使用する方法

たとえば、WebLogic WebサーバーでXSQLサーブレットを実行している場合、XSQLページを設定して接続プールから取得した接続を使用できます。

XSQLはそれ自体の接続プーリングを実装するため、一般的には他の接続プールを使用する必要はありません。ただし、適切な形式のJDBC接続文字列を指定するのみではWebLogicプールの使用に不十分である場合、XSQLConnectionManagerFactoryインタフェースおよびXSQLConnectionManagerインタフェースを実装することでXSQLの独自のカスタムConnection Managerを作成できます。

CLOBに格納されたXML文書をXSQLページに挿入する方法

問合せで<xsql:include-xml>を、CLOB値を取得する問合せとともに使用します。

JavaServer PagesとXSQLを同じページに組み合せる方法

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パラメータと一緒にこのパラメータを渡します。