この章の内容は次のとおりです。
Oracle XSQLページ・パブリッシング・フレームワークは、XMLを複数の形式で公開できる拡張可能なプラットフォームです。このフレームワークの中心となるJavaベースのXSQLサーブレットは、リレーショナル・データに基づく動的Webコンテンツを動的に公開するための宣言インタフェースです。
XSQLフレームワークはSQL、XML、XSLTの機能を組み合せたものです。このフレームワークでXSQLページと呼ばれる宣言テンプレートを作成して、次の操作を行うことができます。
パラメータ化されたSQL問合せに基づいて、動的XMLデータグラムを作成します。
XSLTを使用してデータグラムを変換し、XML、HTMLまたはテキストベース形式の文書を生成します。
XSQLページとは、XSQLサーブレットの命令が記述されたXMLファイルであり、デフォルト拡張子が.xsql
であることからこのように名付けられています。例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ページ・フレームワークでは、公開する情報の作成工程と表示工程を分離できます。このアーキテクチャには次のメリットがあります。
リクエストの発信元であるクライアント・デバイス(ブラウザ、携帯電話、PDAなど)の種類に合せて適切に表示を調整するなど、同じ情報を複数の方法で表示できます。
既存のページを新しいページに集計して、情報を簡単に再利用できます。
コンテンツを変更することなく、表示を修正および改善できます。
この章では、次のテクノロジを十分に理解していると想定します。
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 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クラスを使用して、プログラム的に実行します。
同一のXSQLページを図14-1に示すアクセス・ポイントのいずれかから実行できます。どの方法を選択しても、XSQL Page Processorでは次の処理が行われ、結果が生成されます。
XSQLページの処理リクエストを受信します。リクエストはコマンドライン・ユーティリティから送信されるか、XSQLRequest
オブジェクトを使用してプログラム的に送信されます。
1つ以上のSQL問合せの結果を使用して、XMLデータグラムを作成します。問合せはXSQLページの<xsql:query>要素に指定します。
このXMLデータグラムをリクエスタに戻します。
オプションで、データグラムをXML、HTMLまたは他のテキスト形式に変換します。
図14-2に、WebサーバーがPage.xsql
のHTTPリクエストを受信する一般的なWebベースの使用例を示します。このリクエストには、Style.xsl
というXSLTスタイルシートへの参照が含まれています。このXSQLページにはデータベースへの問合せも含まれます。
図14-2に示すXSQLページでは、次の手順が実行されます。
XSQLサーブレットからのリクエストを受信し、Page.xsql
を処理します。
Oracle XML ParserでPage.xsql
を解析してキャッシュします。
ドキュメント要素の接続属性の値に基づいてデータベースに接続します。
各XSQLアクション・ハンドラ要素(<xsql:query>など)を組込みアクション・ハンドラによって戻されたXML結果に変更して、XMLデータグラムを生成します。
Style.xsl
スタイルシートを解析してキャッシュします。
データグラムとStyle.xsl
スタイルシートをOracle XSLT Processorに渡してデータグラムを変換します。
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 10gを使用することです。このIDEでは次の機能がサポートされています。
色分けされた構文ハイライト表示
XML構文チェック
有効なXSQLタグ名や、オートコンプリートのタグ名および属性名を選択するコンテキスト依存のドロップダウン・リスト
XSQLページのデプロイとテスト
デバッグ・ツール
XSQLアクション作成ウィザード
XSQLページをOracle JDeveloper 10gプロジェクトで作成するには、次の手順を実行します。
プロジェクトを作成するか、既存プロジェクトを開きます。
「ファイル」→「新規」を選択します。
「新規ギャラリ」ダイアログ・ボックスで「一般」カテゴリを選択し、「XML」を選択します。
「項目」ウィンドウで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ページを作成するときに自動的にこのエントリを追加しますが、次の方法によりエントリを手動でプロジェクトに追加することもできます。
アプリケーション・ナビゲータでプロジェクトを右クリックします。
「プロジェクト・プロパティ」を選択します。
ナビゲーション・ツリーで「プロファイル」→「ライブラリ」を選択します。
XSQL Runtimeを「使用可能なライブラリ」ペインから「選択済のライブラリ」に移動します。
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サーブレットは、OC4JやJakarta Tomcatなどの多様なWebサーバーにインストールできます。サーブレットの詳細なインストール方法については、OTNからダウンロードしたXDKのリリース・ノートを参照してください。
次のように、設定手順にナビゲートします。
OTNにログオンし、次のURLにナビゲートします。
http://www.oracle.com/technology/tech/xml/xdk/doc/production10g/readme.html
「Getting Started with XDK Java Components」をクリックします。
「Introduction」項の箇条書きリストでXSQL Servletにスクロール・ダウンし、「Release Notes」をクリックします。
「Contents」項の「Downloading and Installing the XSQL Servlet」をクリックします。
「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>
(オプションでAUTOCOMMIT
をTRUE
またはFALSE
に設定)
<autocommit>
子要素を指定して、接続のJDBC自動コミットの設定を制御します。<connection>
に対して<autocommit>
子要素が設定されていない場合、XSQL Connection Managerで自動コミットは設定されません。この場合の設定は、JDBCドライバのデフォルトの自動コミット設定になります。
任意の数の<connection>
要素をXSQL構成ファイルに配置して、データベース接続を定義できます。個々のXSQLページは、ページ内の最上位の要素(ドキュメント要素)にconnection="
xxx
"
属性を挿入して、使用する接続を参照します。
注意: XSQLConfig.xml ファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれているため、データベース・サーバーの安全な場所に格納する必要があります。手順については、「XSQLページのセキュリティ上の注意事項」を参照してください。 |
XSQLサーブレットのデモ・プログラムは$ORACLE_HOME/xdk/demo/java/xsql
にあります。表14-1に、デモのサブディレクトリとデモの内容を示します。デモの名前の列は、XSQLページとXSQLサーブレットのホームページに表示されているデモ・タイトルを示しています。ホームページのアクセス方法については、「XSQLデモの実行」を参照してください。
表14-1 XSQLサーブレットのデモ
ディレクトリ | デモの名前 | 説明 |
---|---|---|
|
XSQL Pages & XSQL Servlet |
タブを使用したXSQLデモのホームページと、このページからアクセス可能なオンラインXSQLヘルプを表示するページが含まれます。「XSQLデモの実行」の説明に従って、 |
|
Hello World Page |
最も簡単なXSQLページの例を示します。 |
|
Employee Page |
関連付けられたXSLTスタイルシートを使用して、フォーム・アクションとして |
|
Insurance Claim Page |
豊富な構造のInsurance Claimオブジェクト・ビューに対するサンプル問合せの実例を示します。 |
|
Invalid Classes Page |
|
|
Do You XML?Site |
XSQLページを使用して単純なデータ・ドリブンのWebサイトを構築する方法を示します。問合せにSQL、XSQLの置換変数を使用し、サイトの形式にXSLTを使用します。 (ステートレスな方法で問合せ結果をページングするための)表示およびスキップするレコード数の制御に、<xsql:query>タグ内のSQL問合せ文の本体と |
|
Emp/Dept Object Demo |
オブジェクト・ビューを使用して、
|
|
Airport Code Validation |
3文字の空港コードに基づいて、空港情報のデータグラムを戻します。最初の問合せが行を戻さない場合、代替の問合せとして
Webページ上で3文字の空港コードを入力すると、JavaScriptは、XSQLサーブレットからXMLデータグラムをフェッチします。このデータグラムは入力したコードに対応します。戻り値が、一致するものがなかったことを示す場合、プログラムは、XSQLサーブレットからXMLデータグラム形式で戻された情報に基づいて、一致する可能性があるもののリストを生成します。 |
|
Airport Code Display |
Airport Code Validationの例と同じXSQLページを使用して実例を示しますが、ここでは、リクエストでXSLTスタイルシート名を指定します。これによって、空港情報は、未加工のXMLとして戻されるのではなく、HTMLフォームにフォーマットされます。 |
|
Airport Soap Service |
空港情報をSOAPサービスとして戻す実例を示します。 |
|
Adhoc Query Visualization |
パラメータとして使用するSQL問合せおよびXSLTスタイルシートをサーバーに渡す実例を示します。 |
|
XML Document Demo |
XML文書をリレーショナル表に挿入する実例を示します。 文書のテキストを
デモは、Internet Explorer 5.0のクライアント側XML機能を使用して、文書がサーバーにポストされる前に、その文書が整形式であるかどうかを確認します。 |
|
XML Insert Request Demo |
クライアントからのXMLをXSQLページにポストする実例を示します。このXSQLページは、<xsql:insert-request>アクション要素を使用して、ポストされたXMLデータをデータベース表に挿入します。このデモは、 この場合、XMLをポストするプログラムは、Internet Explorer 5.0およびJavaScriptからXMLHttpRequestオブジェクトを使用するクライアント側のWebページです。
|
|
Scalable Vector Graphics Demo |
|
|
PDF Demo |
|
|
Cursor Demo |
ネストした |
|
2つのサンプル・カスタム・アクションのソース・コードを示します。 |
XSQLデモを設定するには、次の手順を実行します。
ディレクトリを$ORACLE_HOME/xdk/demo/java/xsql
ディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\xsql
ディレクトリ(Windowsの場合)に変更します。
SQL*Plusを起動し、Oracle Textパッケージのスキーマ所有者であるctxsys
としてデータベースに接続して、次のコマンドを発行します。
GRANT EXECUTE ON ctx_ddl TO scott;
DBA
としてデータベースに接続し、次のコマンドを発行します。
GRANT QUERY REWRITE TO scott;
これによって、scott
は、デモの1つが空港の説明に基づく大/小文字を区別しない問合せを実行するために必要とするファンクション索引を作成できるようになります。
scott
としてデータベースに接続します。パスワードの入力を求められます。
SQLスクリプトinstall.sql
を現在のディレクトリで実行します。このスクリプトは、すべてのデモ用のすべてのSQLスクリプトを実行します。
@install.sql
ディレクトリを./doyouxml
サブディレクトリに変更し、次のコマンドを実行して、Do You XML?デモ用のサンプル・データをインポートします(パスワードの入力を求められます)。
imp scott file=doyouxml.dmp
SVGのデモンストレーションを実行するには、Adobe社製のSVG Plug-inなどのSVGプラグインをブラウザにインストールします。
XSQLデモの起動にはWebブラウザを使用します。「XSQLサーブレット・コンテナの構成」の説明に従ってXSQLサーブレットをWebサーバーに設定している場合は、次のURLからデモを起動できます。yourserver
とport
は適切な値に変更してください。
http://yourserver:port/xsql/index.html
図14-3に、XSQLホームページのセクションをInternet Explorerで表示した場合を示します。バージョン5以上のブラウザを使用する必要があります。
デモはわかりやすく作成されています。「Hello World Page」、「Employee Page」などのデモ・タイトルをクリックし、画面の指示に従います。
動的なページのコンテンツは、頻繁に変更されないデータに基づいていることがほとんどです。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ページ・テンプレートで実行可能な基本機能について説明します。
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>
セクションが問合せの結果に置き換えられます。
<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>は、useridCookie
をlog_user_hit
プロシージャの引数にバインドします。
<xsql:query>は、パラメータcustid
をWHERE
句の変数にバインドします。
<xsql:include-owa>は、パラメータcustid
およびuserCookie
をhistorical_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つのバインド・パラメータ、dev
とprod
を使用します。ここでは、製品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.xsql
とprod.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のこのページでは、1つ目の問合せではmax
のデフォルト値を5
に、2つ目の問合せではmax
のデフォルト値を7
に、3つ目の問合せではmax
のデフォルト値を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-12
のWHERE句は行を戻しません。
XSQLページでは、リクエストで指定されるパラメータの他に、ページのプライベート・パラメータを使用できます。ページのプライベート・パラメータの名前および値は、ページ内のアクションが決定します。アクションがbind-params
属性または字句パラメータ参照内でparam
という名前のパラメータへの参照を検出すると、param
パラメータの値が次の順序で解決されます。
param
という名前の、ページのプライベート・パラメータの値(設定されている場合)
param
という名前のリクエスト・パラメータの値(指定されている場合)
現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparam
という名前の属性によって指定されているデフォルト値
前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列
XSQLサーブレットを使用してHTTP経由で処理されるXSQLページでは、HTTPセッション・レベル変数やHTTP Cookieパラメータを設定して参照することもできます。
XSQLサーブレットを使用して処理されるXSQLページでは、パラメータ値param
は次の順序で解決されます。
param
という名前の、ページのプライベート・パラメータの値(設定されている場合)
param
という名前のCookieの値(設定されている場合)
param
という名前のセッション変数の値(設定されている場合)
param
という名前のリクエスト・パラメータの値(指定されている場合)
現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparam
という名前の属性によって指定されているデフォルト値
前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列
この解決順序では、ユーザーがリクエストにパラメータ値を指定して、HTTPセッションで設定されている同じ名前のパラメータをオーバーライドすることはできません。また、ブラウザ・セッション中存続するCookieとして設定することもできません。
XSQLサーブレットがWebサーバー上に正しくインストールされている場合、次の基本手順でXSQLページにアクセスできます。
XSQLファイルをWebサーバーの仮想階層内のディレクトリにコピーします。例14-3に、サンプル・ページAvailableFlightsToday.xsql
を示します。
XSQLページを標準のJ2EE WARファイルでデプロイすることもできます。それには、Oracle JDeveloper 10gを使用してページを開発し、Oracle Application Serverにデプロイします。
ページをブラウザにロードします。たとえば、ルート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
に示す正規の<ROWSET>
および<ROW>出力が必要なXML形式ではない場合は、XSLTスタイルシートを任意のXSQLページ・テンプレートと関連付けることができます。また、このXMLデータグラムをサーバー内で変換してからデータを戻すことができます。
他のプログラムとデータを交換する場合は、通常、交換するXML形式を記述するDTDをとり決めておきます。flight-list.dtd
の定義が指定され、そのDTDに準拠した形式で到着フライトのリストを生成する必要があるとします。XML Authorityなどのビジュアル・ツールを使用して、図14-5に示すような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-3
のflight-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に、サンプル・ブラウザの表示を示します。
同じXMLデータを別のXML形式ではなくHTMLで戻すには、別のXSLTスタイルシートを使用します。たとえば、<flight-list>
や<flight>
などの要素を生成するのではなく、<table>
、<tr>
、<td>
などのHTML要素を生成するスタイルシートを記述できます。動的に問い合されたデータの結果は、図14-7に示すHTMLページの表示に類似しています。XSQLページは、未加工のXMLデータを戻すのではなく、サーバー側でのXSLTによる変換を使用して、ブラウザに送信するために情報をHTMLとしてフォーマットします。
例14-15
のflight-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
oracle.xml.xsql.XSQLRequest
クラスを使用すると、XSQL Page Processorを独自のJavaプログラム内で使用できます。XSQL Java APIを使用するには、次の基本手順に従います。
XSQLRequest
のインスタンスを作成し、処理するXSQLページを次のいずれかのオブジェクトとしてコンストラクタに渡します。
ページへのURLを含むString
ページのURL
オブジェクト
インメモリーのXMLDocument
次のオブジェクト・メソッドのどちらかを起動して、ページを処理します。
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()
メソッドで実行できます。
例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)); } }
この項の内容は次のとおりです。
マルチバイト名を持つHTTPパラメータ(漢字表記の名前を持つパラメータなど)は、<xsql:include-request-params>要素を使用してXSQLページに挿入すると、適切に処理されます。<xsql:query>タグの問合せ文内でマルチバイト名を持つパラメータの参照を試みると、パラメータの値に対して空の文字列が戻されます。
パラメータに非マルチバイト名を使用してください。このパラメータは、引き続きマルチバイト値を持つことができ、このマルチバイト値は正しく処理できます。
この項では、XSQLサーブレットのヒントを示します。
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ページに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>
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>
<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句に使用することもできます。
<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>
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ページからそのページの名前にアクセスする、一般的で効率的な方法があります。例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エラーに対処するためのヒントを示します。
データベースに接続できず、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
で指定されたローカル・ホスト・マシン上にない。
データベースのSID
がORCL
ではない。
TNSリスナー・ポートが1521
ではない。
この項では、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文の構文部分をパラメータ化する必要がある場合にのみ、字句パラメータを使用します。それ以外の場合は、バインド変数を使用することをお薦めします。バインド変数を使用すると、無効な値が渡された場合はエラーが生成され、予想外の結果が生成されることはありません。