ヘッダーをスキップ
Oracle XML Developer's Kitプログラマーズ・ガイド
11gリリース1(11.1)
E05676-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

14 XSQLページ・パブリッシング・フレームワークの使用

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

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

Oracle XSQLページ・パブリッシング・フレームワークは、XMLを複数の形式で公開できる拡張可能なプラットフォームです。このフレームワークの中心となるJavaベースのXSQLサーブレットは、リレーショナル・データに基づく動的Webコンテンツを動的に公開するための宣言インタフェースです。

XSQLフレームワークはSQL、XML、XSLTの機能を組み合せたものです。このフレームワークでXSQLページと呼ばれる宣言テンプレートを作成して、次の操作を行うことができます。

デフォルト拡張子が.xsqlであるところから名付けられたXSQLページは、XSQLサーブレットの命令が記述されたXMLファイルです。例14-1に、単純なXSQLページを示します。このページでは、アクション・ハンドラ要素<xsql:query>hr.employees表に問合せを行います。

例14-1 サンプルXSQLページ

<?xml version="1.0">
<?xml-stylesheet type="text/xsl" href="emplist.xsl"?>
<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql">
 SELECT * FROM employees
</xsql:query>

ブラウザ・クライアントに例14-1の問合せで戻されたデータを表示できます。公開する情報の作成および変換には、プログラミングは必要ありません。多くの操作を宣言方式で実行できます。ただし、いずれかの組込み機能が要件に合わない場合は、Javaを使用してカスタム情報ソースを統合したり、サーバー側でカスタム処理を実行できます。

XSQLページ・フレームワークを使用すると、公開する情報の作成工程と表示工程を分離できます。このアーキテクチャには次のメリットがあります。

前提条件

この章では、次のテクノロジを十分に理解していると想定します。

  • Oracle Database SQL: XSQLフレームワークでは、データベースのデータにアクセスします。

  • PL/SQL: XDKには、Java APIをミラー化するXSU用のPL/SQL APIがあります。

  • Java Database Connectivity(JDBC): XSQLページ・フレームワークでは、データベース接続にJDBCドライバを使用します。

  • eXtensible Stylesheet Language Transformation(XSLT): XSLTでデータを適切な形式に変換してユーザーに提供できます。

  • XML SQL Utility(XSU): XSQLページ・フレームワークでは、データベースの問合せにXSUを使用します。

XSQLページ・パブリッシング・フレームワークの使用: 概要

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

XSQLページ・フレームワークの使用: 基本プロセス

XSQL Page Processor Engineは、XSQLページのコンテンツを解析、キャッシュおよび処理します。図14-1に、XSQLページ・パブリッシング・フレームワークの基本アーキテクチャを示します。XSQL Page Processorにアクセスするには、次のエントリ・ポイントがあります。

  • XSQLコマンドライン・ユーティリティを使用して、コマンドラインから、またはバッチ・モードで実行します。oracle.xml.xsql.XSQLCommandLineクラスはコマンドライン・インタフェースです。

  • 任意のWebサーバーにインストールしたXSQLサーブレットを使用して、Web上で実行します。oracle.xml.xsql.XSQLServletクラスはサーブレット・インタフェースです。

  • <jsp:include>を使用してテンプレートを挿入するか、<jsp:forward>を使用してテンプレートを転送し、JSPアプリケーションの一部として実行します。

  • oracle.xml.xsql.XSQLRequest Javaクラスを使用して、プログラム的に実行します。

図14-1 XSQLページ・フレームワークのアーキテクチャ

この図については次のテキストで説明しています。
「図14-1 XSQLページ・フレームワークのアーキテクチャ」の説明

同一のXSQLページを図14-1に示すアクセス・ポイントのいずれかから実行できます。どの方法を選択しても、XSQL Page Processorでは次の処理が行われ、結果が生成されます。

  1. XSQLページの処理リクエストを受信します。リクエストはコマンドライン・ユーティリティから送信されるか、XSQLRequestオブジェクトを使用してプログラム的に送信されます。

  2. 1つ以上のSQL問合せの結果を使用して、XMLデータグラムを作成します。問合せはXSQLページの<xsql:query>要素に指定します。

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

  4. オプションで、データグラムをXML、HTMLまたは他のテキスト形式に変換します。

図14-2に、WebサーバーがPage.xsqlのHTTPリクエストを受信する一般的なWebベースの使用例を示します。このリクエストには、XSLTスタイルシート、Style.xslへの参照が含まれています。このXSQLページにはデータベースへの問合せも含まれます。

図14-2 XSQLページへのWebアクセス

この図については次のテキストで説明しています。
「図14-2 XSQLページへのWebアクセス」の説明

図14-2に示すXSQLページでは、次の手順が実行されます。

  1. XSQLサーブレットからのリクエストを受信し、Page.xsqlを処理します。

  2. Oracle XML ParserでPage.xsqlを解析してキャッシュします。

  3. ドキュメント要素の接続属性の値に基づいてデータベースに接続します。

  4. 各XSQLアクション・ハンドラ要素(<xsql:query>など)を組込みアクション・ハンドラによって戻されたXML結果に変更して、XMLデータグラムを生成します。

  5. Style.xslスタイルシートを解析してキャッシュします。

  6. データグラムとStyle.xslスタイルシートをOracle XSLT Processorに渡してデータグラムを変換します。

  7. XMLまたはHTMLの文書をリクエスタに戻します。

この処理の変換手順中に、W3CのXSLT 1.0または2.0標準に準拠するスタイルシートを使用して、作成されたデータグラムを次のようなドキュメント形式に変換できます。

  • HTML - ブラウザ表示用

  • WML - 無線デバイス用

  • Scalable Vector Graphics(SVG)- データ・ドリブン・チャート、グラフおよびダイアグラム用

  • eXtensible Stylesheet Language Formatting Object(XSLFO)- Adobe PDF形式へのレンダリング用

  • テキスト・ドキュメント(電子メール、SQLスクリプト、Javaプログラムなど)

  • 任意のXMLベースのドキュメント形式

XSQLページ・フレームワークの設定

XSQLページは、様々な方法で開発し、様々な用途に使用できます。この項の内容は次のとおりです。

Oracle JDeveloperでのXSQLページの作成およびテスト

XSQLページを処理する最も簡単な方法は、Oracle JDeveloper 10gを使用することです。このIDEでは次の機能がサポートされています。

  • 色分けされた構文ハイライト表示

  • XML構文チェック

  • 有効なXSQLタグ名や、オートコンプリートのタグ名および属性名を選択するコンテキスト依存のドロップダウン・リスト

  • XSQLページのデプロイとテスト

  • デバッグ・ツール

  • XSQLアクション作成ウィザード

XSQLページをOracle JDeveloper 10gプロジェクトで作成するには、次の手順を実行します。

  1. プロジェクトを作成するか、既存プロジェクトを開きます。

  2. 「ファイル」「新規」を選択します。

  3. 「新規ギャラリ」ダイアログ・ボックスで「一般」カテゴリを選択し、「XML」を選択します。

  4. 「項目」ウィンドウでXSQLページを選択し、「OK」をクリックします。JDeveloperで新しいXSQLページのタブが中央のウィンドウにロードされます。

<xsql:query>などのXSQLアクション・ハンドラ要素をXSQLページに追加するには、新しい要素を挿入する位置にカーソルを置き、コンポーネント・パレットの項目をクリックします。ウィザードが開いたら、そこに示された手順に従って、使用するXSQLアクションおよび必要な属性を選択します。

XSQLページの構文をチェックするには、対象ページにカーソルを置き、「XML構文のチェックを右クリックします。XML構文エラーが存在する場合、JDeveloperでそのエラーが表示されます。

XSQLページをテストするには、ナビゲータ内でページを選択し、「実行」を右クリックします。JDeveloperは、XSQLページを実行できるように適切に構成されたローカルのWebサーバーを自動的に起動し、ページをリクエストする適切なURLを指定したデフォルトのブラウザを起動してそのページをテストします。XSQLページを実行した後、引き続きIDEでそのページ(およびそのページが関連付けられているすべてのXSLTスタイルシート)に変更を加えることができます。IDEでファイルを保存した後、すぐにブラウザで再表示して反映された変更を確認できます。

CLASSPATHが適切に設定されるように、XSQLランタイム・ライブラリをプロジェクトのライブラリ・リストに追加する必要があります。IDEでは、ユーザーが「新規ギャラリ」ダイアログ・ボックスを使用して新しいXSQLページを作成するときに自動的にこのエントリを追加しますが、次の方法によりエントリを手動でプロジェクトに追加することもできます。

  1. アプリケーション・ナビゲータでプロジェクトを右クリックします。

  2. 「プロジェクト・プロパティ」を選択します。

  3. ナビゲーション・ツリーで「プロファイル」「ライブラリ」を選択します。

  4. XSQL Runtime「使用可能なライブラリ」ペインから「選択済のライブラリ」に移動します。

XSQLページのCLASSPATHの設定

JDeveloper以外の環境では、XSQL Page Processor Engineが適切に構成されていることを確認する必要があります。

XSQLページを処理するJVMのCLASSPATHに、適切なjarファイルが含まれていることを確認します。XDK jarファイルの詳細は、表3-1「XDKコンポーネントのJavaライブラリ」を参照してください。XSQLフレームワークには、次のjarファイルが含まれます。

  • xml.jar(XSQL Page Processor)

  • xmlparserv2.jar(Oracle XML Parser)

  • xsu12.jar(Oracle XML SQL Utility)(XSU)

  • ojdbc5.jarまたはojdbc6.jar(Oracle JDBC Driver)


注意:

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

また、「Java XDK環境の設定」の説明に従ってCLASSPATHを構成している場合は、構成ファイルが格納されているXSQLページをディレクトリに追加するだけで済みます。XDKのデータベース・インストールのXSQLConfig.xmlのディレクトリは$ORACLE_HOME/xdk/adminです。

Windowsの%CLASSPATH%変数には、次のエントリを指定する必要があります。

%ORACLE_HOME%\lib\ojdbc5.jar;%ORACLE_HOME%\lib\xmlparserv2.jar;
%ORACLE_HOME%\lib\xsu12.jar;C:\xsql\lib\xml.jar;%ORACLE_HOME%\xdk\admin


UNIXの$CLASSPATH変数には、次のエントリを指定する必要があります。

$ORACLE_HOME/lib/ojdbc5.jar:$ORACLE_HOME/lib/xmlparserv2.jar:
$ORACLE_HOME/lib/xsu12.jar:$ORACLE_HOME/lib/xml.jar:$ORACLE_HOME\xdk\admin

注意:

XSQLページをJ2EE WARファイルでデプロイする場合、XSQL jarファイルをWARファイルの./WEB-INF/libディレクトリに配置できます。

XSQLサーブレット・コンテナの構成

XSQLサーブレットは、OC4JやJakarta Tomcatなどの多様なWebサーバーにインストールできます。サーブレットの詳細なインストール方法については、OTNからダウンロードしたXDKのリリース・ノートを参照してください。

次のように、設定手順にナビゲートします。

  1. OTNにログオンし、次のURLにナビゲートします。

    http://www.oracle.com/technology/tech/xml/xdk/doc/production10g/readme.html
    
  2. 「Getting Started with XDK Java Components」をクリックします。

  3. 「Introduction」項の箇条書きリストでXSQL Servletにスクロール・ダウンし、「Release Notes」をクリックします。

  4. 「Contents」項の「Downloading and Installing the XSQL Servlet」をクリックします。

  5. 「Setting Up Your Servlet Engine to Run XSQL Pages」項までスクロール・ダウンして、目的のWebサーバーを探します。

接続定義の設定

XSQLページは、XSQL構成ファイルに定義されている接続用の短縮名を使用して、データベース接続を指定します。この構成ファイルのデフォルト名は$ORACLE_HOME/xdk/admin/XSQLConfig.xmlです。


注意:

XSQLページをJ2EE WARファイルでデプロイする場合、XSQLConfig.xmlをWARファイルの./WEB-INF/classesディレクトリに配置できます。

例14-1のサンプルXSQLページには、次の接続情報が含まれます。

<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql">

接続名は、XSQL構成ファイルの<connectiondefs>セクションに定義されています。例14-2に、データベースに付属するサンプル構成ファイルの関連セクションを示します。hr接続は太字で表示されています。

例14-2 XSQLConfig.xmlの接続定義セクション

<connectiondefs>
  ...
  <connection name="hr">
    <username>hr</username>
    <password>hr_password</password>
    <dburl>jdbc:oracle:thin:@localhost:1521:ORCL</dburl>
    <driver>oracle.jdbc.driver.OracleDriver</driver>
    <autocommit>false</autocommit>
  </connection>
  ...
</connectiondefs>

データベース接続ごとに次の要素を指定できます。

  • <username>(データベース・ユーザー名)

  • <password>(データベース・パスワード)

  • <dburl>(JDBC接続文字列)

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

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

<autocommit>子要素を指定して、接続のJDBC自動コミットの設定を制御します。<connection>に対して<autocommit>子要素が設定されていない場合、XSQL Connection Managerで自動コミットは設定されません。この場合の設定は、JDBCドライバのデフォルトの自動コミット設定になります。

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


注意:

XSQLConfig.xmlファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれているため、データベース・サーバーの安全な場所に格納する必要があります。手順については、「XSQLページのセキュリティ上の注意事項」を参照してください。

XSQLページのデモ・プログラムの実行

XSQLサーブレットのデモ・プログラムは$ORACLE_HOME/xdk/demo/java/xsqlにあります。表14-1に、デモのサブディレクトリとデモの内容を示します。デモの名前の列は、XSQLページとXSQLサーブレットのホームページに表示されているデモ・タイトルを示しています。ホームページのアクセス方法については、「XSQLデモの実行」を参照してください。

表14-1 XSQLサーブレットのデモ

ディレクトリ デモの名前 説明

home/

XSQL Pages & XSQL Servlet

タブを使用したXSQLデモのホームページと、このページからアクセス可能なオンラインXSQLヘルプを表示するページが含まれます。「XSQLデモの実行」の説明に従って、index.htmlページからXSQLホームページを起動できます。

helloworld/

Hello World Page

最も簡単なXSQLページの例を示します。

emp/

Employee Page

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

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

insclaim/

Insurance Claim Page

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

classerr/

Invalid Classes Page

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

doyouxml/

Do You XML? Site

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

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

empdept/

Emp/Dept Object Demo

オブジェクト・ビューを使用して、scott.empscott.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ページを生成する実例も示します。

airport/

Airport Code Validation

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

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

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

airport/

Airport Code Display

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

airport/

Airport Soap Service

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

adhocsql/

Adhoc Query Visualization

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

document/

XML Document Demo

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機能を使用して、文書がサーバーにポストされる前に、その文書が整形式であるかどうかを確認します。

insertxml/

XML Insert Request Demo

クライアントからの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/

Scalable Vector Graphics Demo

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

fop/

PDF Demo

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

cursor/

Cursor Demo

ネストしたCURSOR式の使用例を示します。これは、デフォルトの<xsql:query>要素で、ネストした要素を生成する3種類の方法のうちの1つです。

actions/


2つのサンプル・カスタム・アクションのソース・コードを示します。


XSQLデモの設定

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

  1. ディレクトリを$ORACLE_HOME/xdk/demo/java/xsqlディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\xsqlディレクトリ(Windowsの場合)に変更します。

  2. SQL*Plusを起動し、Oracle Textパッケージのスキーマ所有者であるctxsysとしてデータベースに接続して、次のコマンドを発行します。

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

    GRANT QUERY REWRITE TO scott;
    

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

  4. scottとしてデータベースに接続します。パスワードの入力を求められます。

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

    @install.sql
    



  1. ディレクトリを./doyouxmlサブディレクトリに変更し、次のコマンドを実行して、Do You XML?デモ用のサンプル・データをインポートします(パスワードの入力を求められます)。

    imp scott file=doyouxml.dmp
    
  1. SVGのデモンストレーションを実行するには、Adobe社製のSVG Plug-inなどのSVGプラグインをブラウザにインストールします。

XSQLデモの実行

XSQLデモの起動にはWebブラウザを使用します。「XSQLサーブレット・コンテナの構成」の説明に従ってXSQLサーブレットをWebサーバーに設定している場合は、次のURLからデモを起動できます。yourserverportは適切な値に変更してください。

http://yourserver:port/xsql/index.html

図14-3に、XSQLホームページのセクションをInternet Explorerで表示した場合を示します。バージョン5以上のブラウザを使用する必要があります。

図14-3 XSQLホームページ

XSQLホームページを表示します。
「図14-3 XSQLホームページ」の説明

デモはわかりやすく作成されています。「Hello World Page」「Employee Page」などのデモ・タイトルをクリックし、画面の指示に従います。

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

動的なページのコンテンツは、頻繁に変更されないデータに基づいていることがほとんどです。Webパブリッシングのパフォーマンスを最適化するには、オペレーティング・システムの機能を使用してXSQLページのオフライン処理をスケジューリングします。これによって、処理結果がWebサーバーによって静的に提供されます。

XDKには、XSQL Page Processorを実行するコマンドラインJavaインタフェースがあります。XSQLコマンドライン・ユーティリティを使用して、任意のXSQLページを処理できます。

$ORACLE_HOME/xdk/bin/xsqlおよび%ORACLE_HOME%\xdk\bin\xsql.batシェル・スクリプトはoracle.xml.xsql.XSQLCommandLineクラスを実行します。クラスを起動する前に、環境が「XSQLページ・フレームワークの設定」の説明に従って構成されていることを確認してください。ユーティリティの起動方法に応じて、構文は次のいずれかになります。

java oracle.xml.xsql.XSQLCommandLine xsqlpage [outfile] [param1=value1 ...]
xsql 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のユーザー・エージェント文字列をシミュレーションします。

XSQLサーブレットでのXMLの生成および変換

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

XSQLページの作成

XSQLページを使用して、XML形式のデータベース情報をWeb上で提供できます。次に、今日JFK空港に到着するすべてのフライトのリアルタイムのXMLデータグラムをOracleから提供する例を示します。例14-3に、AvailableFlightsToday.xsqlファイルのサンプルXSQLページを示します。

例14-3 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 "?" represents a bind variable bound */
  ORDER BY  ExpectedTime      /* to the value of the City parameter.      */
</xsql:query>

このXSQLページは、静的XMLコンテンツとXSQLアクション・ハンドラ要素の組合せを含むXMLファイルです。任意の拡張子を使用可能ですが、XSQLページのデフォルト拡張子は.xsqlです。「XSQLサーブレット・コンテナの構成」で説明している方法に従ってサーブレット・エンジンの構成設定を変更し、別の拡張子を関連付けることができます。サーブレット拡張子のマッピングは、J2EE WARファイルの./WEB-INF/web.xmlファイル内に構成します。

例14-3のXSQLページは次の宣言で始まります。

<?xml version="1.0"?>

XSQLページの最初の、一番外側にある要素はドキュメント要素です。AvailableFlightsToday.xsqlには、静的XML要素は含まれず、単一のXSQLアクション・ハンドラ要素<xsql:query>のみが含まれています。この場合、<xsql:query>要素がドキュメント要素です。例14-3に、最も単純で有用な、単一の問合せを含むXSQLページを示します。XSQLページの<xsql:query>セクションが問合せの結果に置き換えられます。


注意:

第30章「XSQLページ・リファレンス」では、組込みアクション・ハンドラ要素の詳細を説明しています。

<xsql:query>アクション・ハンドラ要素には、名前空間の接頭辞xsqlをOracle XSQL名前空間識別子urn:oracle-xsqlのシノニムとして宣言するxmlns属性が含まれています。

<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">

この要素にも、connection属性が含まれています。この属性の値は、XSQL構成ファイル内にある事前定義済接続の1つの名前です。

<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">

demo接続に使用する、ユーザー名、パスワード、データベースおよびJDBCドライバの詳細は、構成ファイルにすべて記載されます。

ページに複数の問合せを挿入する場合は、独自のXML要素を作成して他の要素をラップする必要があります。例14-4に、その方法を示します。

例14-4 <xsql:query>要素のラップ

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

例14-4では、connection属性およびxsql名前空間宣言は常にドキュメント要素に指定されますが、bind-params<xsql:query>アクションに固有です。

バインド・パラメータの使用

例14-3<xsql:query>要素には、bind-params属性が含まれています。この属性は、リクエスト内のパラメータの値を<xsql:query>タグに含まれるSQL文のバインド変数に関連付けます。SQL文のバインド・パラメータは疑問符で示されます。

SQLバインド変数を使用すると、表30-1「組込みXSQLアクション・ハンドラ要素およびアクション・ハンドラ・クラス」に示されている、SQL文を使用可能なアクションの結果をパラメータ化できます。バインド変数を使用すると、XSQLページ・テンプレートで、リクエストで渡されたパラメータの値に基づいて結果を生成できます。

バインド変数を使用するには、SQLによってバインド変数が許可されている文内の任意の場所に疑問符を挿入します。このアクション・ハンドラ要素のbind-params属性を指定すると、ページ内のSQL文が実行されるたびに、パラメータ値がXSQLエンジンによってバインド変数にバインドされます。

例14-5に、バインド変数をページ・リクエストでcustidパラメータ値にバインドするXSQLページを示します。

例14-5 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パラメータを渡すと、顧客IDが101のXMLデータをリクエストできます。

http://yourserver.com/fin/CustomerPortfolio.xsql?custid=1001

bind-params属性の値は、空白で区切られたパラメータ名のリストです。これらのパラメータ名の左から右への順序は、その値がバインドされるバインド変数の文内での位置を示します。そのため、SQL文内に5つの疑問符がある場合、bind-params属性には空白で区切られた5つのパラメータ名のリストを指定する必要があります。1つのバインド変数が複数回出現し、それに同一のパラメータ値をバインドする必要がある場合は、そのパラメータ名をbind-params属性値の適切な位置に繰り返します。問合せ結果と同数のパラメータ名がbind-params属性に挿入されていない場合は、ページの実行時にエラーが発生します。

変数は、SQL文またはPL/SQLブロックを必要とするすべてのアクションで使用できます。例14-6のページに、この方法を示します。このXSQLページでは、3つのアクション・ハンドラ要素が使用されています。

  • <xsql:dml>は、useridCookielog_user_hitプロシージャの引数にバインドします。

  • <xsql:query>は、パラメータcustidWHERE句の変数にバインドします。

  • <xsql:include-owa>は、パラメータcustidおよびuserCookiehistorical_dataプロシージャの2つの引数にバインドします。

例14-6 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}を使用して参照されます。

例14-7に、2つの字句置換パラメータの使用方法を示します。<xsql:query>要素の1つのパラメータはパラメータとして渡すことができる行の最大数を指定し、もう1つのパラメータはソートする列のリストを制御します。

例14-7 DevOpenBugs.xsql

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

例14-7でも2つのバインド・パラメータ、devprodを使用します。ここでは、製品817に対する開発者smuenchのオープン・エラーを取得することにします。10行のみを取得し、バグ番号順にソートします。パラメータ値を次のように指定して、エラー・リストのXMLをフェッチします。

http://server.com/bug/DevOpenBugs.xsql?dev=smuench&prod=817&max=10&orderby=bugno

次のように、XSQLコマンドライン・ユーティリティでリクエストを実行することもできます。

xsql DevOpenBugs.xsql dev=smuench prod=817 max=10 orderby=bugno

字句パラメータは、XSQLページ接続をパラメータ化したり、ページを処理するためのスタイルシートをパラメータ化する場合にも使用できます。例14-8に、その方法を示します。スタイルシートtest.xsqlprod.xslとを切り替えるには、名前と値の組合せをsheet=testおよびsheet=prodと指定します。

例14-8 DevOpenBugs.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は現行のアクション・ハンドラ要素で同じ名前の属性を検索します。検索されなかった場合は、ページのドキュメント要素に到達するまで、現行のアクション・ハンドラ要素の各祖先クラス要素で該当する属性が検索されます。

例14-9のページでは、ページ内の2つの<xsql:query>アクションのmaxパラメータのデフォルト値は10に設定されています。

例14-9 デフォルト値の設定

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

例14-10のページでは、maxパラメータのデフォルト値を、1つ目の問合せでは5に、2つ目の問合せでは7に、3つ目の問合せでは10に指定します。

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

バインド変数のデフォルト値を指定する場合も、同じ規則に従います。例14-11に、valパラメータのデフォルト値を10に設定する方法を示します。

例14-11 バインド変数のデフォルト

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

例14-11のページをパラメータなしでリクエストすると、次のXMLデータグラムが戻されます。

<example>
  <rowset>
    <row>
      <somevalue>10</somevalue>
    </row>
  </row>
</example>

または、次のURLを指定してページをリクエストしたとします。

http://yourserver.com/example.xsql?val=3

前述のURLを指定すると、次のデータグラムが戻されます。

<example>
  <rowset>
    <row>
      <somevalue>3</somevalue>
    </row>
  </row>
</example>

valパラメータのデフォルト値をページから削除するには、val属性を削除します。例14-12に、その方法を示します。

例14-12 デフォルト値なしのバインド変数

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

名前と値の組合せを指定しないでページのURLリクエストを行うと、次のデータグラムが戻されます。

<example>
  <rowset/>
</example>

デフォルト値またはリクエストで指定された値のどちらも設定されていないパラメータにバインドされているバインド変数がNULLにバインドされ例14-12WHERE句は行を戻しません。

XSQL Page Processorによる各種パラメータの処理方法

XSQLページでは、リクエストで指定されるパラメータの他に、ページのプライベート・パラメータを使用できます。ページのプライベート・パラメータの名前および値は、ページ内のアクションが決定します。アクションがbind-params属性または字句パラメータ参照内でparamという名前のパラメータへの参照を検出すると、paramパラメータの値が次の順序で解決されます。

  1. paramという名前の、ページのプライベート・パラメータの値(設定されている場合)

  2. paramという名前のリクエスト・パラメータの値(指定されている場合)

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

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

XSQLサーブレットを使用してHTTP経由で処理されるXSQLページでは、HTTPセッション・レベル変数やHTTP Cookieパラメータを設定して参照することもできます。

XSQLサーブレットを使用して処理されるXSQLページでは、パラメータ値paramは次の順序で解決されます。

  1. paramという名前の、ページのプライベート・パラメータの値(設定されている場合)

  2. paramという名前のCookieの値(設定されている場合)

  3. paramという名前のセッション変数の値(設定されている場合)

  4. paramという名前のリクエスト・パラメータの値(指定されている場合)

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

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

この解決順序では、ユーザーがリクエストにパラメータ値を指定して、HTTPセッションで設定されている同じ名前のパラメータをオーバーライドすることはできません。また、ブラウザ・セッション中存続するCookieとして設定することもできません。

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

XSQLサーブレットがWebサーバー上に正しくインストールされている場合、次の基本手順でXSQLページにアクセスできます。

  1. XSQLファイルをWebサーバーの仮想階層内のディレクトリにコピーします。例14-3に、サンプル・ページAvailableFlightsToday.xsqlを示します。

    XSQLページを標準のJ2EE WARファイルでデプロイすることもできます。それには、Oracle JDeveloper 10gを使用してページを開発し、Oracle Application Serverにデプロイします。

  2. ページをブラウザにロードします。たとえば、ルートURLがyourcompany.comの場合、Webブラウザで次のURLをリクエストしてAvailableFlightsToday.xsqlページにアクセスできます。

    http://yourcompany.com/AvailableFlightsToday.xsql?City=JFK
    

XSQLページでの問合せの結果は、XSQL Page Processorで自動的にXMLとして生成され、リクエスタに戻されます。このXMLベースのデータグラムは、通常、他のサーバー・プログラムで処理するためにリクエストされます。ただし、Internet Explorerなどのブラウザを使用する場合、図14-4に示すようなXMLでの結果を直接表示できます。

図14-4 XSQLページ(AvailableFlightsToday.xsql)問合せのXML結果

この図については次のテキストで説明しています。
「図14-4 XSQLページ(AvailableFlightsToday.xsql)問合せのXML結果」の説明

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

図14-4に示す正規の<ROWSET>および<ROW>出力が必要なXML形式ではない場合は、XSLTスタイルシートを任意のXSQLページ・テンプレートと関連付けることができます。また、このXMLデータグラムをサーバー内で変換してからデータを戻すことができます。

他のプログラムとデータを交換する場合は、通常、交換するXML形式を記述するDTDをとり決めておきます。flight-list.dtdの定義が指定され、そのDTDに準拠した形式で到着フライトのリストを生成する必要があるとします。XML Authorityなどのビジュアル・ツールを使用して、図14-5に示すようなflight-list.dtdの構造を参照できます。

図14-5 XML Authorityを使用したflight-list.dtdの表示

この図については次のテキストで説明しています。
「図14-5 XML Authorityを使用したflight-list.dtd」の説明

図14-5は、フライト・リスト用の標準のXML形式が、次の要素を含むことを示します。

  • <flight-list>要素は、1つ以上の<flight>要素を含みます。

  • <flight>要素には属性airlineおよびnumberがあり、これらの属性には<arrives>要素があります。

  • テキストを含む<arrives>要素

例14-13に、XSLTスタイルシートflight-list.xslを示します。このスタイルシートをXSQLページと関連付けると、デフォルト形式である<ROWSET>および<ROW>を、業界標準の<flight-list>および<flight>に変換できます。

例14-13 flight-list.xsl

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

このXSLTスタイルシートは、結果として生成されたドキュメント内に、<flight-list><flight><arrives>などの必要なリテラル要素が生成されているテンプレートです。これらのリテラル要素は、次の操作を可能にするXSLTアクション・ハンドラ要素とともにテンプレート内に配置されます。

  • <xsl:for-each>を使用して、ソース・ドキュメント内の一致する要素に対するループを行います。

  • <xsl:value-of>を使用して、必要に応じてソース・ドキュメント要素の値をプラグインします。

  • {some_parameter}表記法を使用して、ソース・ドキュメント要素の値を属性値にプラグインします。

例14-13のスタイルシートでは、次の項目が最上位の<flight-list>要素に追加されています。

  • xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    この属性は、xslという名前のXML名前空間を定義し、XSLT仕様を一意に識別するURL文字列を識別します。これは、URLのように見えますが、文字列http://www.w3.org/1999/XSL/Transformを、XSLT 1.0仕様で定義されている要素セット用のグローバル主キーとして考えます。名前空間を定義すると、スタイルシートで<xsl:XXX>アクション・ハンドラ要素を使用し、必要に応じて値をループおよびプラグインできます。

  • xsl:version="1.0"

    この属性は、ドキュメントをXSLT 1.0スタイルシートとして識別します。version属性は、すべてのXSLTスタイルシートが、妥当であると識別され、XSLTプロセッサによって認識されるために必要です。

例14-3flight-list.xslスタイルシートとAvailableFlightsToday.xsqlを関連付けるには、<?xml-stylesheet?>命令をページ上部に追加します。例14-14に、その方法を示します。

例14-14 flight-list.xsl

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

XSLTスタイルシートをXSQLページに関連付けると、リクエスト側プログラムまたはブラウザによって、提供されたflight-list.dtdで指定された形式でXMLを参照できます。図14-6に、サンプル・ブラウザの表示を示します。

図14-6 XML形式のXSQLページ

この図については前のテキストで説明しています。
「図14-6 XML形式のXSQLページ」の説明

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

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

図14-7 XSLTスタイルシートを使用したHTMLのレンダリング

この図については次のテキストで説明しています。
「図14-7 XSLTスタイルシートを使用したHTMLのレンダリング」の説明

例14-15flight-list.xslスタイルシートは、flight-display.xslスタイルシートの構文と同様に、テンプレートのHTMLページの表示に類似しています。これには、<xsl:for-each><xsl:value-of>、および<ROWSET><ROW>で構成された基礎となるXML問合せ結果の動的な値をプラグインするための{DUE}などの属性値テンプレートが含まれます。

例14-15 flight-display.xsl

<!-- 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を生成します。それぞれの開始タグは適切にクローズされ(<td></td>など)、空のタグに、<br/>ではなく空のXML要素構文<br/>が使用されています。

次の機能を組み合せることによって、有益な結果を迅速に得ることができます。

  • Oracleデータベースから情報を選択するためのパラメータ化されたSQL文

  • 移植可能な中間データ交換形式としての業界標準のXML

  • XMLベースのデータグラムを任意のXMLベースまたはHTMLベースの形式に変換するためのXSLT

JavaプログラムでのXSQLの使用

oracle.xml.xsql.XSQLRequestクラスを使用すると、XSQL Page Processorを独自のJavaプログラム内で使用できます。XSQL Java APIを使用するには、次の基本手順に従います。

  1. XSQLRequestのインスタンスを作成し、処理するXSQLページを次のいずれかのオブジェクトとしてコンストラクタに渡します。

    • ページへのURLを含むString

    • ページのURLオブジェクト

    • メモリー内のXMLDocument

  2. 次のオブジェクト・メソッドのどちらかを起動して、ページを処理します。

    • process() - 結果をPrintWriterまたはOutputStreamに書き込む場合

    • processToXML() - 結果をXML文書として戻す場合

XSQL構成ファイルの定義に基づいてJDBC接続プーリングを実装する組込みXSQL Connection Managerを使用する場合、コンストラクタに渡す必要があるものはXSQLページのみです。また、オプションでXSQLConnectionManagerFactoryインタフェース用のカスタム実装を渡すこともできます。

XSQLページをメモリー内のXMLDocumentオブジェクトとして渡す機能を使用すると、有効なXSQLページを動的に生成して処理できます。その後、そのページをXSQLエンジンに渡して評価できます。

ページの処理時に、次の追加操作をリクエストの一部として実行できます。

例14-16に、XSQLRequestを使用したページの処理方法を示します。

例14-16 XSQLRequestSampleクラス

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);
   // Set up 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 Java APIの詳細は、第15章「XSQLページ・パブリッシング・フレームワークの使用: 高度なトピック」を参照してください。

XSQLページのヒントと使用方法

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

XSQLページの制限事項

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

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

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

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

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結果が生成されます。"your.dtd"には、任意の有効な絶対URLまたは相対URLを指定できます。

<!DOCTYPE xxxx SYSTEM "your.dtd">

XSQLページ内の条件のテスト

XSQLページにif-thenロジックを使用できます。例14-17に、パラメータ値のテストに基づいて問合せを実行する方法を示します。

例14-17 XSQLページの条件文

<xsql:if-param name="security" equals="admin">
  <xsql:query>
      SELECT ....
  </xsql:query>
</xsq:when>
<xsql:if-param name="security" equals="user">
  <xsql:query>
      SELECT ....
  </xsql:query>
</xsql:if-param>

関連項目:

<xsql:if-param>アクションの詳細は、第30章「XSQLページ・リファレンス」を参照してください。

問合せ結果を別の問合せのWHERE句に渡す方法

1つのXSQLページ内に問合せが2つ存在する場合、ページ・パラメータを使用して、1つ目の問合せのSELECT構文のリスト項目の値を2つ目の問合せで使用できます。例14-18に、その方法を示します。

例14-18 SQL問合せ間で値を渡す方法

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

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

<input name="choices" type="checkbox">に必要な複数値のHTMLの<form>パラメータを処理できます。パラメータ名でパラメータ配列表記(たとえば、choices[])を使用し、選択したチェック・ボックスからの値の配列を参照します。

ここでは、複数値のパラメータguyを使用するとします。例14-19に示すように、XSQLページにパラメータ配列表記を使用できます。

例14-19 複数値のパラメータの処理

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

また、例14-20のコードを使用して、複数値のページ・パラメータの値をSQL文のWHERE句に使用することもできます。

例14-20 複数値のページ・パラメータを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>

PL/SQLラッパー・プロシージャを起動してXMLデータグラムを生成する方法

<xsql:dml>を使用してOUT変数の位置にパラメータ値をバインドしても、パラメータ値を設定できません。バインディングは、INパラメータに対してのみサポートされます。ただし、HTTPパッケージを使用してXML要素を作成するラッパー・プロシージャを作成できます。XSQLページでは、<xsql:include-owa>を使用してそのラッパー・プロシージャを起動できます。

例14-21に、2つのINパラメータを受け取り、これらのパラメータを乗算した結果を1つのOUTパラメータの値に設定し、加算した結果をもう1つのOUTパラメータに設定するPL/SQLプロシージャを示します。

例14-21 addmult PL/SQLプロシージャ

CREATE OR REPLACE PROCEDURE addmult(arg1        NUMBER, arg2        NUMBER,
                                    sumval  OUT NUMBER, prodval OUT NUMBER)
IS
BEGIN
  sumval := arg1 + arg2;
  prodval := arg1 * arg2;
END;

例14-22のPL/SQLプロシージャを記述して、例14-21のプロシージャをラップできます。addmultwrapperプロシージャでは、前述のaddmultプロシージャに必要なIN引数を受け入れて、OWAページ・バッファに出力するXMLデータグラムとしてOUT値をエンコーディングします。

例14-22 addmultwrapper PL/SQLプロシージャ

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;

例14-23のXSQLページでは、PL/SQLラッパー・プロシージャのコールを追加して、XML文書を作成します。

例14-23 addmult.xsql

<page connection="demo" xmlns:xsql="urn:oracle-xsql">
  <xsql:include-owa bind-params="arg1 arg2">
    BEGIN addmultwrapper(?,?); END;
  </xsql:include-owa>
</page>

ここでは、ブラウザに次のようにURLを入力して、addmult.xsqlを起動することにします。

http://yourserver.com/addmult.xsql?arg1=30&arg2=45

サーブレットによって戻されるXMLデータグラムには、OUTの値が次のように反映されます。

<page>
  <addmult><sum>75</sum><product>1350</product></addmult>
</page>

ポストされたXMLコンテンツへのアクセス

XSQL Page Processorで、ポストされたXMLのコンテンツを表示できます。XSQLがサポートする機能を使用して、任意のXML文書をポストおよび処理できます。

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


関連項目:

Airport SOAPデモに含まれる、XSQLページを使用してSOAPベースのWebサービスを実装する例

データベース接続を動的に変更する方法

XSQLページの起動時にデータベース接続を動的に選択することにします。たとえば、テスト・データベースと本番データベースを切り替える場合があります。それには、XSQLページのconnection属性にXSQLパラメータを追加します。接続名のデフォルト値に必ず同じ名前の属性を定義してください。

XSQL構成ファイルにデータベースtestdbおよびproddbの接続を定義することにします。そのために、次の<xsql:query>要素を使用してXSQLページを作成します。

<xsql:query conn="testdb" connection="{@conn}" xmlns:xsql="urn:oracle-xsql">
  ...
</xsql:query>

パラメータを指定せずにこのページをリクエストする場合、connパラメータの値はtestdbとなり、このページはXSQL構成ファイルに定義されたtestdbという接続を使用します。この方法のかわりにconn=proddbを使用してページをリクエストすると、proddbという接続が使用されます。

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

現行ページへのリンクを作成するために、実行時にXSQLページからそのページの名前にアクセスする、一般的で効率的な方法があります。例14-24のようなヘルパー・メソッドを使用すると、カスタム・アクション・ハンドラ内のページの名前を取得できます。

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

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

一般的なXSQL接続エラーの解決

この項では、XSQLエラーに対処するためのヒントを示します。

接続不能エラーの原因

データベースに接続できず、helloworld.xsqlサンプル・プログラムの実行中に次のようなエラーが戻されたとします。

Oracle XSQL Servlet Page Processor
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>password</password>
  <dburl>jdbc:oracle:thin:@localhost:1521:ORCL</dburl>
  <driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>

次のいずれかが原因でエラーが発生している可能性が高いと考えられます。

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

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

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

HTTP POST使用時に「処理対象の文書がポストされていません」というエラーが発生する原因

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

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

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

安全なディレクトリへのXSQL構成ファイルのインストール

XSQLConfig.xml構成ファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれています。このファイルの格納場所は、Webサーバーの仮想パスにマップされるディレクトリおよびそのサブディレクトリ以外である必要があります。この構成ファイルに必要な権限は、サーブレット・エンジンを所有するUNIXアカウントの読取り権限のみです。この推奨事項に従わない場合、構成ファイルの内容がサイトのユーザーによって参照され、データベース・アカウントのパスワードが取得される可能性が生じます。

クライアントによるスタイルシートのオーバーライドをデフォルトで不可にする設定

XSQL Page Processorのデフォルト設定では、ユーザーが、リクエストで特殊なxml-stylesheetパラメータの値を渡すことによって、スタイルシートを指定できるようになっています。サーバー側のXSQLページ内で参照しているスタイルシートのみを有効なスタイルシートにするには、そのページのドキュメント要素にallow-client-style="no"属性を挿入します。また、XSQLConfig.xmlファイルのデフォルト設定をグローバルに変更し、クライアントによるスタイルシートのオーバーライドを禁止することもできます。どちらの方法を選択しても、クライアントによるスタイルシートのオーバーライドが許可されるのは、ドキュメント要素にallow-client-style="yes"属性が挿入されているページのみとなります。

置換パラメータの不正使用に対する予防措置

特に、SQL問合せにおいて字句置換変数の使用をサポートする製品では、開発者側の問題となる場合があります。SQL文の一部を字句パラメータで置換するXSQLページをデプロイするときは、必ず不正使用に対する予防措置をとる必要があります。

たとえば、XSQLページに付属しているデモの1つにAdhoc Query Demoがあります。このデモでは、<xsql:query>アクション・ハンドラのSQL文全体が、パラメータとしてどのように提供されているかが記述されています。この方法は適正に使用される場合は非常に有用ですが、同じようなページを本番システムにデプロイする場合、ユーザーはこのページに関連付けられている接続に指定されたデータベース・セキュリティ権限の範囲内であればどんな問合せも実行できます。たとえば、Adhoc Query Demoは、scottアカウントにマップされた接続を使用するように設定されています。したがって、ユーザーは、scottがSQL*Plusから問合せできる任意のデータを問合せ可能です。

次の方法で、ページの不正使用を防ぐことができます。

  • ページに関連付けるデータベース・ユーザー・アカウントには、ユーザーに参照を許可する表およびビューの読取り権限のみを付与します。

  • SELECT文で単一の値を置換する場合は、字句バインド変数ではなくバインド変数を使用します。SQL文の構文部分をパラメータ化する必要がある場合にのみ、字句パラメータを使用します。それ以外の場合は、バインド変数を使用することをお薦めします。バインド変数を使用すると、無効な値が渡された場合はエラーが生成され、予想外の結果が生成されることはありません。