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

XSQLページ・パブリッシング・フレームワークの基本的な機能の使用方法について説明します。

トピック:

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

Oracle XSQLページ・パブリッシング・フレームワークは、Extensible Markup Language (XML)を複数の形式で公開できる拡張可能なプラットフォームです。

このフレームワークの中心となるJavaベースのXSQLサーブレットは、リレーショナル・データに基づく動的Webコンテンツを動的に公開するための宣言インタフェースです。

XSQLフレームワークでは、Structured Query Language (SQL)、XMLおよびExtensible Stylesheet Language Transformation (XSLT)の機能が統合されます。これを使用してXSQLページと呼ばれる宣言テンプレートを作成し、次の操作を行うことができます。

  • パラメータ化されたSQL問合せに基づいて、動的XMLデータグラムを作成します。

  • XSLTを使用してデータグラムを変換し、XML、HTMLまたはテキストベース形式の文書を生成します。

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

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

XSQLページ・フレームワークでは、公開する情報の作成工程と表示工程を分離できます。このアーキテクチャ上の特徴によって次のことが可能です。

  • リクエストの発信元であるクライアント・デバイス(ブラウザ、携帯電話、携帯情報端末(PDA)など)の種類に合せて適切に表示を調整するなど、同じ情報を複数の方法で表示できます。

  • 既存のページを新しいページに集計して、情報を簡単に再利用できます。

  • コンテンツを変更することなく、表示を修正および改善できます。

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

トピック:

16.1.1 XSQLページ・パブリッシング・フレームワークの使用の前提条件

XSQLページ・パブリッシング・フレームワークの使用の前提条件について説明します。

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

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

  • Procedural Language/Structured Query Language (PL/SQL)。Oracle XML Developer's Kit (XDK)には、Java APIをミラー化するXML SQL Utility (XSU)用のPL/SQLアプリケーション・プログラミング・インタフェース(API)が用意されています。

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

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

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

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

このトピックでは、基本的な使用方法、設定、デモ・プログラムの実行およびコマンドライン・ユーティリティの使用について説明します。

トピック:

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

XSQL Page Processor Engineは、XSQLページのコンテンツを解析、キャッシュおよび処理します。XSQLページ・フレームワークの基本的な使用方法について説明します。

図16-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クラスを使用して、プログラム的に実行します。

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

図16-1の説明が続きます
「図16-1 XSQLページ・フレームワークのアーキテクチャ」の説明

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

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

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

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

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

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

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

図16-2の説明が続きます
「図16-2 XSQLページへのWebアクセス」の説明

図16-2に示すXSQL Page Processorでは、次の手順が実行されます。

  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ベースのドキュメント形式

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

XSQLページは、様々な方法で開発し、様々な用途に使用できます。

トピック:

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

ここでは、Oracle JDeveloperのタスク、つまり、XSQLページの作成、XSQLページへのXSQLアクション要素の追加、XSQLページの構文チェック、XSQLページのテスト、およびプロジェクトのライブラリ・リストへのXSQLランタイム・ライブラリの追加による環境変数CLASSPATHの適切な設定について説明します。

IDEでは次の機能がサポートされます。

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

  • XML構文チェック

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

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

  • デバッグ・ツール

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

XSQLページをOracle JDeveloperプロジェクトで作成するには、次のようにします。

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

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

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

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

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

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

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

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

  1. アプリケーション・ナビゲータでプロジェクトを右クリックします。
  2. 「プロジェクト・プロパティ」を選択します。
  3. ナビゲーション・ツリーで「プロファイル」「ライブラリ」を選択します。
  4. XSQL Runtime「使用可能なライブラリ」ペインから「選択済のライブラリ」に移動します。
16.2.2.2 XSQLページのCLASSPATHの設定

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

適切なJava Archive (JAR)ファイルがXSQLページを処理するJava仮想マシン(JVM)のCLASSPATHに含まれていることを確認します。XDK JARファイルの完全なセットは、表3-1で説明しています。XSQLフレームワークには、次のJARファイルが含まれます。

  • xml.jar(XSQL Page Processor)

  • xmlparserv2.jar(Oracle XML Parser)

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

  • ojdbc6.jar(Oracle JDBC driver)

注意:

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

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

Windowsの%CLASSPATH%変数には、次のエントリが含まれます。

%ORACLE_HOME%\lib\ojdbc6.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/ojdbc6.jar:$ORACLE_HOME/lib/xmlparserv2.jar:
$ORACLE_HOME/lib/xsu12.jar:$ORACLE_HOME/lib/xml.jar:$ORACLE_HOME\xdk\admin

注意:

XSQLページをJava Platform, Enterprise Edition (Java EE) Web Application Archive (WAR)ファイルでデプロイする場合、XSQL JARファイルをWARファイルの./WEB-INF/libディレクトリに含めることができます。

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

XSQLサーブレットは、様々なWebサーバーにインストールできます。サーブレットのインストール方法については、ファイル$ORACLE_HOME/xdk/readme.htmlを参照してください。

16.2.2.4 接続定義の設定

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

注意:

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

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

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

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

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

  • <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ページのセキュリティ上の注意事項」を参照してください。

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

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

XSQLサーブレットのデモ・プログラムは$ORACLE_HOME/xdk/demo/java/xsqlにあります。

表16-1に、デモのサブディレクトリとデモの内容を示します。デモの名前の列は、XSQLページとXSQLサーブレットのホームページに表示されているデモ・タイトルを示しています。ホームページのアクセス方法については、「XSQLデモの実行」を参照してください。

表16-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の組込みDocument Object Model (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

空港情報をSimple Object Access Protocol (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つのサンプル・カスタム・アクションのソース・コードを示します。

トピック:

16.2.3.1 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
    
  6. ディレクトリを./doyouxmlサブディレクトリに変更し、次のコマンドを実行して、Do You XML?デモ用のサンプル・データをインポートします(パスワードの入力を求められます)。
    imp scott file=doyouxml.dmp
    
  7. SVGのデモンストレーションを実行するには、Adobe社製のSVG Plug-inなどのSVGプラグインをブラウザにインストールします。
16.2.3.2 XSQLデモの実行

XSQLデモはWebブラウザを介してアクセスするよう設計されています。

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

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

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

図16-3 XSQLホームページ

図16-3の説明が続きます
「図16-3 XSQLホームページ」の説明

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

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

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

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

$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のユーザー・エージェント文字列をシミュレーションします。

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

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

トピック:

16.3.1 XSQLページの作成

XSQLページを使用して、XML形式のデータベース情報をWeb上で提供できます。

次に、今日JFK空港に到着するすべてのフライトのリアルタイムのXMLデータグラムをOracleから提供する例を示します。例16-3に、AvailableFlightsToday.xsqlファイルのサンプルXSQLページを示します。

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

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

<?xml version="1.0"?>

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

注意:

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

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

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

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

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

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

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

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

例16-3 AvailableFlightsToday.xsqlのサンプル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>

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

トピック:

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

バインド・パラメータの使用について説明します。

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

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

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

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

次のようなリクエストで顧客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ブロックを必要とするすべてのアクションで使用できます。例16-6のページに、この方法を示します。このXSQLページでは、3つのアクション・ハンドラ要素が使用されています。

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

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

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

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

例16-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>
16.3.1.2 字句置換パラメータの使用

すべてのXSQLアクション要素で、任意の属性の値または含まれるSQL文のテキストのかわりに字句置換パラメータを使用できます。これによって、アクションの動作をパラメータ化したり、アクションが実行するSQL文の一部を置き換えることができます。

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

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

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

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

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

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

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

例16-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>
16.3.1.3 バインド・パラメータおよび置換パラメータのデフォルト値の指定

バインド変数または置換パラメータのデフォルト値はページで直接指定できます。これによって、リクエスタで各リクエストのすべての値を明示的に渡さなくても、ページをパラメータ化できます。

パラメータのデフォルト値を挿入するには、そのパラメータと同じ名前のXML属性をアクション・ハンドラ要素または任意の祖先クラス要素に追加します。任意のパラメータの値がリクエスト内に挿入されていない場合、XSQL Page Processorは現行のアクション・ハンドラ要素で同じ名前の属性を検索します。検索されなかった場合は、ページのドキュメント要素に到達するまで、現行のアクション・ハンドラ要素の各祖先クラス要素で該当する属性が検索されます。

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

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

次の例に示すように、リクエストでmaxパラメータの値を指定すると、すべてのデフォルト値がオーバーライドされます。

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

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

例16-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属性を削除します。例16-12に、この方法を示します。

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

<example>
  <rowset/>
</example>

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

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

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

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

例16-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>
16.3.1.4 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として設定することもできません。

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

SQL問合せを使用してデータグラムを生成する方法について説明します。

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

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

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

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

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

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

図16-4の説明が続きます
「図16-4 XSQLページ(AvailableFlightsToday.xsql)問合せのXML結果」の説明

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

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

正規の出力は、図16-4に示されています。

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

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

図16-5の説明が続きます
「図16-5 XML Authorityを使用したflight-list.dtd」の説明

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

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

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

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

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

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

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

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

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

例16-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仕様で定義されている要素セット用のグローバル主キーとして考えます。名前空間を定義すると、スタイルシートで<xsl:XXX>アクション・ハンドラ要素を使用し、必要に応じて値をループおよびプラグインできます。

  • xsl:version="1.0"

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

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

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

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

図16-6の説明が続きます
「図16-6 XML形式のXSQLページ」の説明

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

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

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

XMLデータを別のXML形式ではなくHTMLで戻すには、適切なXSLTスタイルシートを使用します。たとえば、<flight-list><flight>などの要素を生成するのではなく、<table><tr><td>などのHTML要素を生成するスタイルシートを記述できます。

動的に問い合されたデータの結果は、図16-7に示すHTMLページの表示に類似しています。XSQLページは、未加工のXMLデータを戻すのではなく、サーバー側でのXSLTによる変換を使用して、ブラウザに送信するために情報をHTMLとしてフォーマットします。

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

図16-7の説明が続きます
「図16-7 XSLTスタイルシートを使用したHTMLのレンダリング」の説明

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

注意:

このスタイルシートは、整形式のHTMLを生成します。それぞれの開始タグは適切にクローズされ(<td></td>など)、空のタグに、<br/>ではなく空のXML要素構文<br/>が使用されています。

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

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

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

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

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

16.4 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エンジンに渡して評価できます。

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

  • 一連のパラメータをリクエストに渡す操作。

    この操作は、Dictionaryインタフェースを実装する任意のオブジェクトをprocess()メソッドまたはprocessToXML()メソッドに渡すことによって実行できます。パラメータを含むHashTableを渡すことは、一般的な方法の1つです。

  • ページがXML文書をポストされたXMLメッセージの本体として処理するように設定する操作。

    この操作は、XSQLResquest.setPostedDocument()メソッドで実行できます。

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

関連項目:

XSQL Java APIの詳細は、「XSQLページ・パブリッシング・フレームワークの使用: 高度なトピック」を参照してください

例16-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));
  }
}

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

このトピックでは、XSQLページの使用に関する情報を提供します。

トピック:

16.5.1 XSQLページの制限事項

XSQLページには制限事項があります。

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

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

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

このトピックでは、XSQLサーブレットの使用に関するヒントを提供します。

トピック:

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

XSQL出力をワイヤレス・アプリケーション用のWireless Markup Language (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">

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

XSQLページにif-thenロジックを使用できます。

例16-17に、パラメータ値のテストに基づいて問合せを実行する方法を示します。

関連項目:

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

例16-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>
16.5.2.3 問合せ結果を別の問合せのWHERE句に渡す方法

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

例16-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>
16.5.2.4 複数値のHTMLフォーム・パラメータを処理する方法

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

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

このページが、複数値の属性を生成するために同じ名前の複数のパラメータを含む次の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>

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

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

例16-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>
16.5.2.5 PL/SQLラッパー・プロシージャを起動してXMLデータグラムを生成する方法

PL/SQLラッパー・プロシージャを使用してXMLデータグラムを生成する方法について説明します。

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

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

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

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

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

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

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

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

例16-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;

例16-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;

例16-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>
16.5.2.6 ポストされたXMLコンテンツへのアクセス

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

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

関連項目:

SOAPベースのWebサービスを実装するXSQLページを使用する例については、Airport SOAPデモを参照してください。

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

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という接続が使用されます。

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

現行ページへのリンクを作成するために、実行時にXSQLページからそのページの名前にアクセスする、一般的な方法があります。

例16-24のようなヘルパー・メソッドを使用すると、カスタム・アクション・ハンドラ内のページの名前を取得できます。

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

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

このトピックでは、接続不能のエラーおよび文書がポストされていないエラーの発生について説明します。

トピック:

16.5.3.1 接続不能エラーの原因

接続できないことを示すエラーが発生する原因を示します。

データベースに接続できず、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ではない。

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

HTTP POSTのかわりにHTTP GETを使用して、XSQLページにXML情報をポストして処理しようとすると、ポスト済の文書が存在しないため、「処理対象の文書がポストされていません」というエラーが発生します。

XML情報を処理するためにXSQLページにポストする場合は、HTTP POSTで送信する必要があります。この送信は、HTTP POSTによって送信されたHTML形式またはXML文書の影響を受ける可能性があります。

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

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

トピック:

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

XSQLConfig.xml構成ファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれています。このファイルの格納場所は、Webサーバーの仮想パスにマップされるディレクトリおよびそのサブディレクトリ以外である必要があります。

この構成ファイルに必要な権限は、サーブレット・エンジンを所有するUNIXアカウントの読取り権限のみです。この推奨事項に従わない場合、構成ファイルの内容がサイトのユーザーによって参照され、データベース・アカウントのパスワードが取得される可能性が生じます。

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

XSQL Page Processorのデフォルトでは、ユーザーがページ・リクエストでパラメータxml-stylesheetの値を渡すことによって、スタイルシートを指定できるようになっています。サーバー側のXSQLページ内で参照しているスタイルシートのみを有効なスタイルシートにするには、そのページのドキュメント要素に属性allow-client-style="no"を挿入します。

また、XSQLConfig.xmlファイルのデフォルト設定をグローバルに変更し、クライアントによるスタイルシートのオーバーライドを禁止することもできます。どちらの方法を選択しても、クライアントによるスタイルシートのオーバーライドが許可されるのは、ドキュメント要素にallow-client-style="yes"属性が挿入されているページのみとなります。

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

置換変数の不正使用を防ぐために役立つ予防措置について説明します。

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

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

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

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

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