ヘッダーをスキップ
Oracle Multimediaユーザーズ・ガイド
11gリリース1(11.1)
E05684-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2 アプリケーションの開発

従来のクライアント/サーバー・アプリケーションや2層アプリケーションのみでなく、マルチ階層のアプリケーションを開発できます。どちらの場合でも、Webアプリケーションを配置してアプリケーション・サーバー層で実行し、Oracle Databaseと密接に統合できます。ユーザーは、Webブラウザを介してデスクトップからそのアプリケーションにアクセスできます。

クラス・ライブラリ・インタフェースでサポートされている完全な開発フレームワークを使用して、本番環境で使用するための高機能なOracle Multimediaアプリケーションを作成できます。本番環境では、ユーザーがスタンドアロンのクライアント・インタフェースまたはWebブラウザを介して、アプリケーションと相互運用します。TCP/IP、HTTP、HTML、XML、XHTMLなどの標準に基づくWebアプリケーションの開発は、基礎となるテクノロジの急速な発展によって容易になっています。主要なソフトウェア・コンポーネントが密接に統合されるにつれて、管理者はWebアプリケーションの設計、作成および管理タスクをより短期間かつ簡単に実行できます。

Oracle Multimediaでは、オブジェクト型インタフェースまたはリレーショナル・インタフェースのいずれかを介して、Oracle Application ServerとOracle Databaseおよびオーサリング・ツールのインターネット・サポートが実現されます。これによって、Webブラウザに配信するマルチメディア・データをデータベースにアップロードしたり、データベースから取得したり、操作することができる、Webベースのアプリケーションを短期間で開発できます。

Oracle Multimediaは、次の方法でアプリケーション開発をサポートしています。

2.2項では、PL/SQL GatewayおよびPL/SQL Web Toolkitを使用して、PL/SQLのWebアプリケーションを開発する方法について説明しています。2.3項では、JavaおよびJDBCを使用して、Oracle Multimedia Java Classesを使用するメディア・リッチJavaクライアント・アプリケーションを開発する方法について説明しています。2.4項では、Oracle Multimedia Java APIおよびOracle Multimedia Servlets and JSP Java APIを使用して、JavaベースのWebアプリケーションを開発する方法について説明しています。

第3章の3.1項では、Webアプリケーションの例としてOracle Multimedia Photo Albumについて説明しています。この実装には、PL/SQL、Javaサーブレット、JavaServer Pages(JSP)およびMicrosoft Active Server Pages(ASP)/Visual Basic(VB)といった様々な技術が使用されています。このサンプル・アプリケーションでは、実際のWebアプリケーションに対して2.2項および2.4項で説明されている手順を使用し、データベースに格納されたメディア・データをアップロードおよび取得する方法を示しています。

第4章では、Oracle Multimedia Code Wizardアプリケーションについて説明します。このアプリケーションを使用すると、Oracle Multimediaのオブジェクト型を使用してデータベースに格納されたメディア・データをアップロードおよび取得するPL/SQL GatewayのPL/SQLストアド・プロシージャを作成できます。

第5章では、Java、JDBCおよびOracle Multimedia Java Classesを使用して実装するJavaサンプル・アプリケーション(IMExample)について説明しています。このサンプル・アプリケーションでは、実際のJavaアプリケーションに対して2.3項で説明されている手順を使用し、データベースに格納されたメディア・データをアップロードおよび取得する方法を示しています。

2.1 PL/SQL APIを使用したPL/SQLクライアント・アプリケーションの開発

PL/SQLは、SQLのデータ操作能力とプロシージャ言語のデータ処理能力が組み合された、完全に移植可能で高パフォーマンスのトランザクション処理言語です。

この項では、PL/SQL Application Programming Interface(API)を使用したOracle Multimediaデータベース・オブジェクトの操作方法を簡単に説明します。データベースにメディアを格納する際に使用可能なOracle Multimediaオブジェクト型は、次のとおりです。

2.1.1項では、PL/SQLでOracle Multimediaを使用するための環境設定について説明します。2.1.2項では、Oracle Multimediaオブジェクトに対する標準のSQL問合せについて説明します。2.1.3項では、PL/SQLアプリケーションでOracle Multimediaオブジェクトからメディア・データを取得する方法について説明します。2.1.4項では、PL/SQLアプリケーションでOracle Multimediaデータベース・オブジェクトへメディア・データをアップロードする方法について説明します。2.1.5項では、PL/SQLアプリケーションで例外を処理する方法について説明します。

この項に示すすべての例では、Oracleのインストール時に、デフォルトでインストールされるサンプル・スキーマが使用されています。これらのスキーマの作成方法および使用方法の詳細は、『Oracle Databaseサンプル・スキーマ』を参照してください。

Oracle Multimediaオブジェクト型およびPL/SQL APIで使用可能なメソッドの詳細は、『Oracle Multimediaリファレンス』を参照してください。

2.1.1 PL/SQLのための環境設定

PL/SQLを使用してファイルにアクセスするには、データベース・サーバーがアクセス可能なディレクトリを指すディレクトリ・オブジェクトをデータベース上に作成する必要があります。たとえば、次のコマンドで、サンプル・スキーマにMEDIA_DIRディレクトリを作成します。

CREATE DIRECTORY MEDIA_DIR AS
    'c:\oracle\product\10.2.0\db_1\demo\schema\product_media';

データベースから取得したメディア・データをファイルに書き込むには、適切なユーザーに、指定したディレクトリへの書込み権限を付与する必要があります。次に例を示します。

GRANT WRITE ON DIRECTORY MEDIA_DIR TO SCOTT;

ファイルからデータベースにメディア・データをアップロードするには、適切なユーザーに、指定したディレクトリへの読取り権限を付与する必要があります。次に例を示します。

GRANT READ ON DIRECTORY MEDIA_DIR TO SCOTT;

警告:

Oracleが提供するOracle Multimediaデータ型は、データベース・ユーザーORDSYS、ORDPLUGINSおよびSI_INFORMTN_SCHEMAの下にインストールされます。これらはデータベースのインストール中に作成されるユーザーで、将来のリリースで変更される可能性があります。

Oracle Multimediaが提供するファンクション、パッケージ、型およびビューは、Oracleによって予約されており、将来のリリースで変更される可能性があります。ORDSYSおよびSI_INFORMTN_SCHEMAユーザーとその内容を変更しないでください。これらのユーザーに接続したり、独自の表、ファンクション、パッケージ、型またはビューをこれらのユーザーに追加しないでください。また、Oracle Multimediaが提供するORDPLUGINSユーザーのパッケージを変更しないでください。これを変更すると、データベース管理システムで内部エラーおよびセキュリティ違反が発生することがあります。


2.1.2 PL/SQLを使用したメディアへの問合せ

アクセッサ・メソッド(getHeight、getWidth、getMimeTypeなど)を使用することにより、標準のSQL問合せにメディア属性(高さ、幅、MIMEタイプなど)を含めることができます。これらのアクセッサ・メソッドを使用して、イメージ、オーディオおよびビデオ・オブジェクトに対して1つ以上の属性を問い合せる方法を、それぞれ例2-1例2-2および例2-3に示します。

例2-1 イメージ問合せ(高さ、幅およびMimeType属性)

SELECT t.product_id                  id,
       t.product_photo.getHeight()   height,
       t.product_photo.getWidth()    width,
       t.product_photo.getMimeType() mimetype
  FROM pm.online_media t;

例2-2 オーディオ問合せ(MimeType属性)

SELECT t.product_id                  id,
       t.product_audio.getMimeType() mimetype
  FROM pm.online_media t;

例2-3 ビデオ問合せ(MimeType属性)

SELECT t.product_id                  id,
       t.product_video.getMimeType() mimetype
  FROM pm.online_media t;

2.1.3 PL/SQLを使用したメディアのダウンロード

データベースからファイル・システムのファイルへメディアをダウンロードするには、Oracle Multimediaオブジェクトのエクスポート・メソッドをコールします。次のコード例では、product_idが3117である行のイメージを、MEDIA_DIRディレクトリのファイル3117.jpgにエクスポートします。このコード例で、エクスポート操作を実行する部分を太字で強調表示しています。

DECLARE
  img ORDImage;
  ctx RAW(64) := NULL;
BEGIN
  SELECT  product_photo
    INTO  img
    FROM  pm.online_media
    WHERE product_id = 3117;
  img.export(ctx, 'FILE', 'MEDIA_DIR', '3117.jpg');
END;
/

2.1.4 PL/SQLを使用したメディアのアップロード

メディアのアップロードは、メディア・データをファイル・システムからデータベースの表領域にインポートすることを指します。次に、一般的な手順を示します。

  1. 表に新しい行を挿入し、Oracle Multimediaオブジェクト型のinitメソッドで新しいオブジェクトを作成します。

  2. Oracle Multimediaオブジェクトのインポート・メソッドをコールし、ファイル・システムのデータをデータベースにインポートします。

  3. Oracle MultimediaオブジェクトのsetPropertiesメソッドをコールし、オブジェクトの属性を判別および移入します。

  4. 表を更新し、前述の手順で抽出した属性値を表のOracle Multimediaオブジェクトに反映します。

次に、PM.ONLINE_MEDIA表に新しい行を挿入するPL/SQLコードの例を示します。

DECLARE
  img ORDImage;
  aud ORDAudio;
  vid ORDVideo;
  ctx RAW(64) := NULL;
BEGIN
  -- Insert a new row into the pm.online_media table.
  DELETE FROM pm.online_media WHERE product_id = 3003;
  INSERT INTO pm.online_media
         (product_id,
          product_photo,
          product_audio,
          product_video)
  VALUES (3003,
          ORDImage.init('FILE', 'MEDIA_DIR', 'laptop.jpg'),
          ORDAudio.init('FILE', 'MEDIA_DIR', 'laptop.mpa'),
          ORDVideo.init('FILE', 'MEDIA_DIR', 'laptop.rm'))
  RETURNING product_photo, product_audio, product_video
  INTO img, aud, vid;

  -- Bring the media into the database and populate the attributes.
  img.import(ctx);
  -- ORDImage.import also calls ORDImage.setProperties.

  aud.import(ctx);
  aud.setProperties(ctx);

  vid.import(ctx);
  vid.setProperties(ctx);

  -- Update the table with the properties we have extracted.
  UPDATE pm.online_media
  SET    product_photo = img,
         product_audio = aud,
         product_video = vid
  WHERE  product_id = 3003;

  COMMIT;
END;
/

2.1.5 PL/SQLでのOracle Multimedia例外の処理

実行時に発生する可能性があるエラーを、常にアプリケーションで処理する必要があります。これにより、実行時エラーが発生してもプログラムの動作を継続できます。また、プログラムの動作中に、ユーザーがエラーの原因を認識することもできるようになります。エラーを適切に処理することによって、可能であれば、アプリケーションの実行中に常にエラーからリカバリできるようになります。さらに、適切にエラーを処理することで、必要な情報が提供されるため、常にエラーの原因を認識できるようになります。

この項では、コード例を使用して適切なエラー処理について説明します。これらの例では、いくつかの一般的なOracle Multimediaエラーおよびその他のタイプのエラーをPL/SQLプログラムで処理する方法を示します。これらの例は、第3章および第4章に示すPL/SQLサンプル・アプリケーションから抜粋したものです。他の例については、『Oracle Multimediaリファレンス』を参照してください。

例外を処理する場合、PL/SQLでは例外ブロックを使用します。たとえば、PL/SQLの場合、次のように例外を処理します。

BEGIN
<some program logic>
EXCEPTION
     WHEN OTHERS THEN
     <some exception logic>
END;

独自に設計、コーディングおよびデバッグしたアプリケーションであれば、プログラム内のどの箇所でエラーが発生してプログラムの処理が停止する可能性があるかがわかります。そのような箇所に対しては、発生する可能性のあるエラーを処理するための例外処理ブロックを追加する必要があります。PL/SQL例外の処理の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

次の例では、Oracle Multimedia PL/SQL Web Toolkitフォト・アルバム・サンプル・アプリケーションでの例外処理について説明します。

2.1.5.1 不明なイメージ・フォーマットのプロパティ設定

プログラムで、(イメージ・データを読み取って、適切な属性フィールドに格納できるようにオブジェクト属性の値を取得するために)アップロードされたイメージのプロパティを設定する際にイメージ・フォーマットを認識できない場合、setProperties( )メソッドが正常に実行されない場合があります。この例外を捕捉して潜在的な問題を回避するには、アプリケーションで、次の例外ブロックを使用します。

BEGIN
   new_image.setProperties();
EXCEPTION
   WHEN OTHERS THEN
         new_image.contentLength := upload_size;
         new_image.mimeType := upload_mime_type;
END;

この例では、例外ハンドラによって、insert_new_photoプロシージャの先頭に記述されているアップロード済の表から値が取得され、その値に基づいて、イメージのMIMEタイプおよびコンテンツ長が設定されます。ファイルがアップロードされると、ブラウザによってMIMEタイプ・ヘッダーが設定されます。アプリケーションは、このヘッダーを読み取り、ORDImageフィールドに設定します。

2.1.5.2 不明なイメージ・フォーマットのイメージ処理

プログラムでイメージを処理する際にイメージ・フォーマットが不明な場合、processCopy( )メソッドは正常に実行されません。この潜在的な問題を回避するには、アプリケーションで、次の例外ブロックを使用します。

BEGIN
   new_image.processCopy( 'maxScale=50,50', new_thumb);
EXCEPTION
   WHEN OTHERS THEN
      new_thumb.deleteContent();
      new_thumb.contentLength := 0;
END;

このOracle Multimedia PL/SQL Web Toolkitフォト・アルバム・アプリケーションの例では、イメージ・フォーマットが不明で縮小イメージを作成できない場合に、例外ハンドラによって、縮小イメージのコンテンツが削除され、コンテンツ長が0(ゼロ)に設定されます。

2.2 PL/SQL Webアプリケーションの開発

データベースに精通したSQL開発者は、PL/SQL開発環境を使用して、Oracle Application ServerとOracle Databaseのみを使用するWebアプリケーションを開発できます。開発者は、PL/SQL開発環境を使用すると迅速にPL/SQLベースのWebアプリケーションを開発できます。

PL/SQLを使用してWebアプリケーションを開発するには、HTTPを介してWebブラウザと対話する一連のストアド・プロシージャで構成されるPL/SQLパッケージを開発します。ストアド・プロシージャは次の方法で実行できます。

タグ付けされたHTMLテキストなどのストアド・プロシージャの情報は、WebページとしてWebブラウザに表示されます。これらの動的なWebページは、データベース・コンテンツおよびストアド・プロシージャに渡された入力パラメータに基づいて、データベースで生成されます。PL/SQLストアド・プロシージャは、特に動的なWebページ・コンテンツの生成に使用すると効率的かつ強力です。

PL/SQLからHTML出力を生成するには、次の2つの方法があります。

イメージ、オーディオ、ビデオ、これら3つの組合せなどのメディア・データを、Oracle Multimediaオブジェクト型およびそれぞれの一連のメソッドを使用してデータベース表にアップロードしたりデータベース表から取得する場合に、Oracle Multimediaを使用します。

最初に、メディアをアップロードするプロシージャによってSQL INSERT操作が実行され、メディア表にデータの行が挿入されます。これと同時に、空のBLOBを持つそれぞれのOracle Multimediaオブジェクト列のインスタンスが初期化されます。次に、SQL SELECT FOR UPDATE操作で更新するオブジェクト列が選択されます。最後に、SQL UPDATE操作でそれぞれの列のメディア・オブジェクトが更新されます。Oracle Multimediaメソッドがコールされ、次の操作が実行されます。

メディアの取得操作では、次のタスクが実行されます。

Oracle Multimediaメソッドをコールすると、メディア・オブジェクトの最終更新時刻が取得され、メディアがデータベース、BFILEまたはURL位置のどこにローカルに格納されているかが判断され、メディア・オブジェクトのMIMEタイプが取得されて、最後にメディア・データが取得されます。

2.2.1 PL/SQL GatewayおよびPL/SQL Web Toolkitの使用

Oracle Application ServerおよびOracle Databaseでは、クライアントのWebブラウザと直接通信するPL/SQL Gatewayを含むApache HTTPサーバーによって動作するOracle HTTP Serverがインストールされます。

Oracle HTTP Serverは、Webアプリケーションで使用される静的なHTMLファイルやイメージなどを主に提供します。Oracle HTTP Serverは通常、インストール先のファイル・システムに配置されます。Oracle HTTP Serverには、機能を拡張するモジュールまたはプラグインが含まれます。Oracleが提供するこれらのモジュールの1つに、mod_plsqlモジュールがあります。これはPL/SQL Gatewayとも呼ばれます。PL/SQL Gatewayは、PL/SQLストアド・プロシージャをコールして、データベースからWebブラウザにデータを動的に提供します。PL/SQL Gatewayは、Webブラウザからのリクエストを、PL/SQLストアド・プロシージャのコールにマップされたPL/SQLサーブレットまたはPL/SQL Server Pagesのフォームで受信します。PL/SQLストアド・プロシージャがデータベースからデータを取得し、PL/SQL Web Toolkitからのデータおよびコードを含むHTTPレスポンスを生成して、生成したWebページをWebブラウザに表示します。PL/SQL Web Toolkitには、htphtfおよびowaという一連のパッケージが含まれています。これらのパッケージをストアド・プロシージャで使用すると、リクエストに関する情報を取得し、HTMLタグを構成して、クライアントのWebブラウザにヘッダー情報を戻すことができます。

図2-1に、PL/SQL開発環境の主要コンポーネントであるOracle HTTP Server(Oracle Application ServerおよびOracle Databaseのコンポーネント)、Webブラウザおよびデータベースを示します。クライアントのWebブラウザからのリクエストが、PL/SQLプロシージャの実行によってWebページのレスポンスに変わる手順を次に説明します。

  1. クライアントのWebブラウザが、PL/SQL Server PagesまたはサーブレットのリクエストをOracle HTTP Serverに送信します。

  2. Oracle HTTP Serverは、リクエストをPL/SQL Gateway(mod_plsql)にルーティングします。

  3. PL/SQL Gatewayが、データベース・アクセス記述子(DAD)に格納された構成情報を使用してデータベースにそのリクエストを転送し、データベースに接続します。

  4. PL/SQL Gatewayがコール・パラメータを準備し、アプリケーションのPL/SQLパッケージおよびPL/SQLストアド・プロシージャを起動します。

  5. PL/SQLプロシージャが、データベースのデータおよびデータベースからアクセスしたPL/SQL Web Toolkitの特殊なパッケージを使用してHTMLページを生成します。PL/SQL Web Toolkitには、htphtfおよびowaという一連のパッケージが含まれます。これらのパッケージをストアド・プロシージャで使用すると、リクエストに関する情報を取得し、HTMLタグを構成して、PL/SQL Gatewayに戻すレスポンスとしてクライアントのWebブラウザにヘッダー情報を戻します。

  6. PL/SQL GatewayがOracle HTTP Serverにレスポンスを送信します。

  7. Oracle HTTP Serverが、クライアントのWebブラウザに、フォーマットされたWebページとして表示するレスポンスを送信します。

図2-1 PL/SQL開発環境のコンポーネント

図2-1の説明
「図2-1 PL/SQL開発環境のコンポーネント」の説明

通常、フォーマットして戻されたWebページには1つ以上の追加リンクが含まれ、各リンクが選択されると、PL/SQL Gatewayを介して別のリクエストがデータベースに送信され、1つ以上のストアド・プロシージャが実行されます。生成されたレスポンスによって、クライアントのWebページのデータ(通常、追加リンクを含む)が表示されます。この追加リンクが選択されると、別のフォーマットされたWebページとして表示する生成済レスポンスを戻す多くのストアド・プロシージャが実行されます。PL/SQL開発環境のPL/SQLアプリケーションは、このように動作するように設計されています。

PL/SQL開発環境を使用するWebアプリケーション開発者は、アプリケーションを構成するプロシージャとファンクションを記述するPL/SQLパッケージの仕様部および本体を作成します。パッケージ仕様部では、アプリケーションで使用するプロシージャとファンクションを定義します。パッケージ本体は、各プロシージャとファンクションの実装です。すべてのパッケージはコンパイルされ、データベースに格納されて、データベース内のデータにアクセスしたり、Webページ表示用のHTML出力をフォーマットするための特定の操作を実行します。これらのPL/SQLストアド・プロシージャを起動するには、Webアプリケーション開発者は、リクエスト/レスポンス型のPL/SQLサーブレットおよびPL/SQL Server Pages(PSP)を使用して、Webブラウザのクライアントによるリクエストの送信およびHTTPを使用したレスポンスの取得を許可する必要があります。

Oracle HTTP Serverは、ブラウザに入力されたURLを、データベースに格納された特定のPL/SQLプロシージャにマップします。Oracle HTTP Serverは、各ストアド・プロシージャのDADを使用して固有の構成情報を格納することでこれを行います。そのため、各DADには、Webサーバーがデータベース接続に入力されたURLを変換してストアド・プロシージャをコールするために必要なデータベース接続情報が含まれます。

Oracle HTTP Serverがリクエストをリスニングし、そのリクエストをPL/SQL Gatewayにルーティングすると、PL/SQL Gatewayがデータベースにそのリクエストを転送します。DADに格納された構成情報の値によって、使用するデータベース別名、リモート・アクセスに使用する接続文字列、ドキュメントのアップロードまたはダウンロードに使用するプロシージャ、およびデータベースへのアクセスを許可するユーザー名とパスワード情報が決まります。ユーザーは、WebブラウザからPL/SQL Gatewayを起動するURLを指定します。URLには、すべての必須およびオプションのパラメータを指定するフォーマットが定義されており、DADの場所および実行するPL/SQLストアド・プロシージャの名前を含める必要があります(例2-4を参照)。

例2-4 Webブラウザでのmod_plsqlの起動に必要なURLフォーマット

protocol://hostname[:port number]/DAD-name/[[!][schema name.][package name.]procedure_name[?query_string]]

使用可能な各パラメータおよびオプションの詳細は、『Oracle HTTP Server mod_plsqlユーザーズ・ガイド』を参照してください。ただし、3.1項で説明されているOracle MultimediaおよびPL/SQL Web Toolkitでフォト・アルバム・アプリケーションを使用する場合は、例2-5に示す形式にURLを簡略化できます。

図2-5 フォト・アルバム・アプリケーションのWebブラウザでのmod_plsqlの起動に必要なURLフォーマット

protocol://<hostname>[:<port-number>]/DAD-name/]procedure_name

WebブラウザにURLを入力する際は、プロトコル(HTTPまたはHTTPS)、ホストWebサーバー名およびホストWebサーバーがリクエストをリスニングして処理するポート番号を含めます。次に、指定する仮想パスに/pls/<DAD-name>を含めてWebサーバーがmod_plsqlを起動するように構成されていること、およびWebサーバー上のDADの場所を示します。

例2-4の最後の5つのパラメータには、感嘆符(!)、スキーマ名、パッケージ名、プロシージャ名および問合せ文字列が含まれています。構文の感嘆符、スキーマ名、パッケージ名および問合せ文字列のパラメータはオプションです。プロシージャ名のみが必須のパラメータです。

感嘆符は、柔軟なパラメータの引渡しが使用されていることを示します。スキーマ名を省略した場合、ユーザー名に基づいて解決されます。パッケージ名を省略した場合、プロシージャがスタンドアロンであることを意味します。問合せ文字列のパラメータはストアド・プロシージャ用であり、特殊なフォーマットで指定します。これらの5つのパラメータのうち、プロシージャ名はDADとURLの両方に指定する必要があります。他の4つのパラメータは、アプリケーションに応じてDADまたはURLのいずれか一方に指定します(あるいはどちらにも指定しません)。

URLを入力すると、指定したDADのホームページが表示されます。Webブラウザ・ページのアドレス・フィールドにURLを入力すると、指定したDADの場所のみ、指定したDADの場所とプロシージャ名、または指定したDADの場所とschema.package.procedure名のいずれかが起動されます。レスポンスはHTMLページとして戻されます。HTMLページには、リクエストされたデータおよびクライアントのWebブラウザに表示される他の指定コードが含まれます。動作方法については、第4章のCode Wizardの説明を参照してください。たとえば、Code Wizardの管理URLを起動するには、第4章に示すURLを次のように入力します。

http://<hostname>:<port-number>/pls/ordcwadmin

仮想パスにplsを含めてWebサーバーがmod_plsqlを起動するように構成されていることを示し、続けてCode Wizard管理者が使用するDADの名前ordcwadminを含めます。

HTMLページが表示されると、次のCode Wizard管理者のURLに解決されます。

http://<hostname>:<port-number>/pls/ordcwadmin/ORDCWPKG.menu

ORDCWPKG.menupackage.procedure名を表します。この名前はordcwadmin DADのデフォルトのホームページとして指定されています。

起動したPL/SQL Gatewayではステートレス・モデルが使用され、複数のHTTPリクエスト間をトランザクションがまたがることはできません。このステートレス・モデルでは通常、HTTP Cookieを使用するか、HTML FormパッケージのHTML form要素としてhidden HTMLフィールドを使用するか、または問合せ用にデータベース表の重要な情報のストレージを使用することによって、アプリケーションが状態を保持するセッションを作成できます。詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

2.3 JDBCを使用したJavaクライアント・アプリケーションの開発

JavaおよびJava Database Connectivity(JDBC)に精通した開発者は、Oracle Multimedia Java APIを使用するメディア・リッチJavaアプリケーションを記述できます。Oracle Multimedia Java APIに含まれるクラスは、Oracle Multimediaデータベース・オブジェクト用のJavaプロキシ・クラスです。Javaアプリケーションでは、これらのJavaクラスでJDBCを介して、Oracle Multimediaデータベース・オブジェクトにアクセスします。

Oracle Multimedia Java APIのJavaクラスは、oracle.ord.im.*パッケージに含まれています。これらのJavaクラスの名前は、Oracle Multimediaデータベース・オブジェクトの名前と似ています。また、Javaの標準ネーミング規則にも従っています。

2.3.1項では、Oracle Multimedia Java APIを使用するための環境設定について説明します。2.3.2項では、JavaアプリケーションでOracle Multimediaオブジェクトからメディア・データを取得する方法について説明します。2.3.3項では、JavaアプリケーションでOracle Multimediaデータベース・オブジェクトへメディア・データをアップロードする方法について説明します。2.3.4項では、Javaアプリケーションで例外を処理する方法について説明します。

この項に示すすべての例では、Oracleのインストール時に、デフォルトでインストールされるサンプル・スキーマが使用されています。これらのスキーマの作成方法および使用方法の詳細は、『Oracle Databaseサンプル・スキーマ』を参照してください。

これらのクラスで使用可能なメソッドの詳細は、『Oracle Multimedia Java API Reference』を参照してください。

2.3.1 Javaのための環境設定

Oracle Multimedia Java APIを使用するには、Javaプログラムをコンパイルおよび実行するための環境を設定する必要があります。次の手順を実行します。

  1. 環境変数CLASSPATHを指定し、この環境変数に、Oracle Multimediaとその他の必要な機能に適したOracle Javaライブラリが含まれていることを確認します。

    次の表に、Javaライブラリの名前、そのライブラリを必要とするOracle Multimedia機能またはその他の機能、そのライブラリをサポートするJDKのバージョン、プラットフォーム、およびライブラリのJARファイルを取得できる<ORACLE_HOME>ディレクトリ下のパス名を、Javaライブラリごとに示します。

    Oracle Javaライブラリの名前 関連する機能 JDKバージョン、プラットフォームおよび場所
    Oracle JDBCライブラリ すべてのOracle Multimedia機能 JDK 5以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/jdbc/lib/ojdbc5.jar

    JDK 5以降、Windows上:

    <ORACLE_HOME>\jdbc\lib\ojdbc5.jar

    Oracle Multimedia Java Classesライブラリ すべてのOracle Multimedia機能 JDK 5以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/ordim.jar

    JDK 5以降、Windows上:

    <ORACLE_HOME>\ord\jlib\ordim.jar

    Oracle Multimedia DICOM Java Classesライブラリ DICOM機能 JDK 5以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/orddicom.jar

    JDK 5以降、Windows上:

    <ORACLE_HOME>\ord\jlib\orddicom.jar

    Oracle XDB Java Classesライブラリ DICOM機能

    Oracle Multimediaメタデータ抽出

    JDK 5以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/rdbms/jlib/xdb.jar

    JDK 5以降、Windows上:

    <ORACLE_HOME>\rdbms\jlib\xdb.jar

    Oracle Multimedia Java Classes for Servlets and JSPライブラリ JavaサーブレットおよびJSPアプリケーション JDK 5以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/ordhttp.jar

    JDK 5以降、Windows上:

    <ORACLE_HOME>\ord\jlib\ordhttp.jar

    NLSキャラクタ・セット変換ライブラリ(オプション)<ORACLEHOME>/jlib/orai18n.jar NLSキャラクタ・セット変換が必要脚注 1  JDK 5以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/jlib/orai18n.jar

    JDK 5以降、Windows上:

    <ORACLE_HOME>\jlib\orai18n.jar


    脚注 1 クライアント・アプリケーションとデータベースとの間でNLSキャラクタ・セット変換が必要な場合は、CLASSPATH変数にorai18n.jarファイルを含める必要があります。NLSキャラクタ・セット変換が必要であるのに適切なライブラリが指定されていないと、Oracle Multimediaオブジェクト型のキャラクタ・ベースの属性が16進にエンコードされた文字列として戻されることがあります。NLSキャラクタ・セット変換の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。


    注意:

    JDBC OCIドライバを使用している場合は、LD_LIBRARY_PATH(LinuxまたはUNIXの場合)またはPATH(Windowsの場合)のいずれかの変数に、JDBC OCI共有ライブラリの場所を指定する必要があります。

    使用するプラットフォームに応じて、次に示す<ORACLE_HOME>ディレクトリ下のいずれかの場所に、JDBC OCI共有ライブラリを格納します。


    <ORACLE_HOME>/lib(LinuxおよびUNIXのlibocijdbc11.soの場合)
    <ORACLE_HOME>\bin(Windowsのocijdbc11.dllの場合)

    このライブラリ・パスは共有されるため、SQL*Plusなどの他のクライアント・アプリケーションを使用可能にするために、すでに設定されている場合があります。


  2. Javaプログラムに、次のインポート文を1つ以上追加します。

    java.sqlパッケージに含まれている標準のJDBCクラスの他に、Oracle JDBC拡張クラスoracle.jdbc.OracleResultSetを次の手順でインポートする必要があります。

    import oracle.jdbc.OracleResultSet;
    

    Javaアプリケーションで処理するメディアによって、次のインポート文を1つ以上追加する必要があります。

    import oracle.ord.im.OrdAudio;
    import oracle.ord.im.OrdDoc;
    import oracle.ord.im.OrdImage;
    import oracle.ord.im.OrdVideo;
    

2.3.2 Javaでのメディアの取得

Oracle Multimediaオブジェクトは、Oracle Multimediaデータベース・オブジェクトに対するJavaプロキシ・オブジェクトとしてJavaアプリケーションに取得できます。この場合、そのままの名前(OrdAudio、OrdDoc、OrdImageおよびOrdVideo)を使用できます。JDBC接続の確立後、次の手順でOracle Multimedia Javaオブジェクトを取得します。

  1. データベースからOracle Multimediaオブジェクトを選択するためのJDBC文を作成します。

    String query = "select product_photo, product_audio,"+
      " product_video, product_testimonials from" +
      " pm.online_media where product_id=3117";
    PreparedStatement pstmt = conn.prepareStatement(query);
    
  2. 問合せを実行し、結果セットを取得します。

    OracleResultSet rset = (OracleResultSet)pstmt.executeQuery();
    
  3. 結果セットから、Oracle Multimedia Javaオブジェクトを取得します。

    if ( rset.next() )
    {
    
      OrdImage imgProxy = (OrdImage)rset.getORAData(
              "product_photo", OrdImage.getORADataFactory());
      OrdAudio audProxy = (OrdAudio)rset.getORAData(
              "product_audio", OrdAudio.getORADataFactory());
      OrdVideo vidProxy = (OrdVideo)rset.getORAData(
              "product_video", OrdVideo.getORADataFactory());
      OrdDoc docProxy = (OrdDoc)rset.getORAData(
              "product_testimonials",
              OrdDoc.getORADataFactory());
    }
    

    注意:

    Oracle Multimediaリリース8i およびリリース9i では、getCustomDatumメソッドでOracle Multimedia Javaオブジェクトを取得します。Oracle JDBCリリース10g では、getCustomDatumメソッドは廃止され、getORADataメソッドに変更されました。

    Javaプログラム環境で、同一バージョンのOracle Multimedia Javaクライアント・ライブラリ(ordim.jar)とOracle JDBCライブラリが使用されていることを確認してください。


  4. メディア属性の取得メディア属性は、Oracle Multimedia Javaオブジェクトから、直接取得できます。次に例を示します。

    int height = imgProxy.getHeight();
    int width = imgProxy.getWidth();
    String audFormat = audProxy.getFormat();
    String vidMimetype = vidProxy.getMimeType();
    

2.3.3 Javaでのメディアのアップロード

次に、Javaアプリケーションで、メディア・データをOracle Multimediaデータベース・オブジェクトへアップロードするための手順を示します。

  1. 次の文を入力し、JDBC接続オブジェクトで自動コミット・フラグをfalseに設定可能にします。

    conn.setAutoCommit(false);
    
  2. 更新するOracle Multimedia Javaオブジェクトをデータベースから取得します。メディア・データは、表の既存のOracle Multimediaオブジェクトにロードしたり、または表に新しい行を作成することで、存在しないOracle Multimediaオブジェクトにロードすることができます。

    次に、表の既存のOracle Multimediaオブジェクトにメディア・データをロードするための問合せの例を示します。

    //"for update" is required in the query string
    //since we will update the row later.
    String query1 = "select product_photo," +
    " product_audio, product_video," +
    " product_testimonials from" +
    " pm.online_media where product_id=3106" +
    " for update";
    
    PreparedStatement pstmt = conn.prepareStatement(query1);
    
    OracleResultSet rset = (OracleResultSet)pstmt.executeQuery();
    
    if ( rset.next() )
    {
    
      OrdImage imgProxy = (OrdImage)rset.getORAData(
              "product_photo", OrdImage.getORADataFactory());
      OrdAudio audProxy = (OrdAudio)rset.getORAData(
              "product_audio", OrdAudio.getORADataFactory());
      OrdVideo vidProxy = (OrdVideo)rset.getORAData(
              "product_video", OrdVideo.getORADataFactory());
      OrdDoc docProxy = (OrdDoc)rset.getORAData(
              "product_testimonials",
              OrdDoc.getORADataFactory());
    }
    
    rset.close();
    pstmt.close();
    

    次に、表に新しい行を作成することで、存在しないOracle Multimediaオブジェクトにメディア・データをロードするための問合せの例を示します。


    注意:

    このコード部分では、pm.online_media表には、product_id=3106という行は存在しないと想定しています。

    String query2 =
      "begin insert into pm.online_media " +
      " (product_id, product_photo, product_audio," +
      " product_video, product_testimonials) values" +
      " (3106, ordimage.init()," +
      " ordaudio.init(), ordvideo.init()," +
      " orddoc.init()) returning product_photo," +
      " product_audio, product_video," +
      " product_testimonials into ?, ?, ?, ?;end;";
    
    OracleCallableStatement cstmt =
     (OracleCallableStatement) conn.prepareCall(query2);
    cstmt.registerOutParameter(1, OrdImage._SQL_TYPECODE,
                                   OrdImage._SQL_NAME);
    cstmt.registerOutParameter(2, OrdAudio._SQL_TYPECODE,
                                   OrdAudio._SQL_NAME);
    cstmt.registerOutParameter(3, OrdVideo._SQL_TYPECODE,
                                   OrdVideo._SQL_NAME);
    cstmt.registerOutParameter(4, OrdDoc._SQL_TYPECODE,
                                   OrdDoc._SQL_NAME);
    
    cstmt.execute();
    
    OrdImage imgProxy = (OrdImage)cstmt.getORAData(1,
                         OrdImage.getORADataFactory());
    OrdAudio audProxy = (OrdAudio)cstmt.getORAData(2,
                         OrdAudio.getORADataFactory());
    OrdVideo vidProxy = (OrdVideo)cstmt.getORAData(3,
                         OrdVideo.getORADataFactory());
    OrdDoc docProxy = (OrdDoc)cstmt.getORAData(4,
                         OrdDoc.getORADataFactory());
    
    cstmt.close();
    
  3. loadDataFromFileメソッドをコールし、メディア・データをファイルからOracle Multimedia Javaオブジェクトにロードします。

    String imageFileName = "laptop.jpg";
    String audioFileName = "laptop.mpa";
    String videoFileName = "laptop.rm";
    String docFileName = "laptop.jpg";
    imgProxy.loadDataFromFile(imageFileName);
    audProxy.loadDataFromFile(audioFileName);
    vidProxy.loadDataFromFile(videoFileName);
    docProxy.loadDataFromFile(docFileName);
    
  4. Javaオブジェクト・フィールドにメディア属性を移入し、Oracle Multimediaオブジェクトのプロパティを設定します(オプション)。

    imgProxy.setProperties();
    audProxy.setProperties(new byte[1][64]);
    vidProxy.setProperties(new byte[1][64]);
    docProxy.setProperties(new byte[1][64], true);
    

    注意:

    setPropertiesメソッドは、メディアのフォーマットを認識し、オブジェクト・フィールドにメディア情報(イメージの高さや幅、フォーマット、MIMEタイプなど)の移入を試みます。メディアのフォーマットが認識できない場合、java.sql.SQLExceptionエラーが発生します。

  5. すでにデータをロードしたOracle Multimedia Javaオブジェクトでデータベース表を更新します。

       String query3 = "update pm.online_media set" +
        " product_photo=?, product_audio=?," +
        " product_video=?, product_testimonials=?" +
        " where product_id=3106";
        OraclePreparedStatement pstmt =
     (OraclePreparedStatement)conn.prepareStatement(query3);
        pstmt.setORAData(1, imgProxy);
        pstmt.setORAData(2, audProxy);
        pstmt.setORAData(3, vidProxy);
        pstmt.setORAData(4, docProxy);
    
        pstmt.execute();
        pstmt.close();
    
  6. トランザクションをコミットします。

    conn.commit();
    

2.3.4 JavaでのOracle Multimedia例外の処理

実行時に発生する可能性があるエラーを、常にアプリケーションで処理する必要があります。これにより、実行時エラーが発生してもプログラムの動作を継続できます。また、プログラムの動作中に、ユーザーがエラーの原因を認識することもできるようになります。エラーを適切に処理することによって、可能であれば、アプリケーションの実行中に常にエラーからリカバリできるようになります。さらに、適切にエラーを処理することで、必要な情報が提供されるため、常にエラーの原因を認識できるようになります。

この項では、コード例を使用して適切なエラー処理について説明します。これらの例では、いくつかの一般的なOracle Multimediaエラーおよびその他のタイプのエラーをJavaプログラムで処理する方法を示します。これらの例は、第3章および第5章に示すJavaサンプル・アプリケーションから抜粋したものです。 他の例については、『Oracle Multimediaリファレンス』を参照してください。

例外を処理する場合、Javaではtry/catchブロックを使用します。たとえば、Javaの場合、次のように例外を処理します。

try {
    //<some program logic>)
}
catch (exceptionName a) {
//Exception logic
}
finally {
//Execute logic if try block is executed even if an exception is caught
}

独自に設計、コーディングおよびデバッグしたアプリケーションであれば、プログラム内のどの箇所でエラーが発生してプログラムの処理が停止する可能性があるかがわかります。そのような箇所に対しては、発生する可能性のあるエラーを処理するための例外処理ブロックを追加する必要があります。 Java例外の処理の詳細は、『Oracle Database Java開発者ガイド』および『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

次の例では、try/catchブロックを使用した例外処理について説明します。これらの例は、Oracle Multimedia IMExampleアプリケーションまたはOracle Multimedia Javaサーブレット・フォト・アルバム・アプリケーション(Oracle Multimedia JavaServer Pagesフォト・アルバム・アプリケーション)、あるいはその両方のアプリケーションにあります。

2.3.4.1 不明なイメージ・フォーマットのプロパティ設定

IMExampleと呼ばれるOracle Multimedia Javaサンプル・アプリケーションのIMUtilクラスには、一般的なイメージ機能用のユーティリティ・メソッドが含まれています。そのうちの1つが、setProperties( )メソッドです。このスタティック・メソッドは、入力パラメータとしてOrdImageオブジェクトをとり、そのオブジェクトに対しsetProperties( )メソッドをコールします。

static boolean setProperties(OrdImage img)
  {
    try
    {
      img.setProperties();
      return true;
    }
    catch (SQLException e)
    {
      return false;
    }
  }

例外が発生した場合、setProperties( )メソッドはfalseを戻します。それ以外の場合は、trueを戻します。

IMExampleアプリケーションの詳細およびJavaアプリケーションでのsetProperties( )メソッドの使用方法の詳細は、第5章を参照してください。

2.3.4.2 不明なイメージ・フォーマットのイメージ処理

Oracle Multimedia Javaサーブレット・フォト・アルバム・アプリケーションのPhotoAlbumServletクラスと、Oracle Multimedia JavaServer Pagesフォト・アルバム・アプリケーションのPhotoAlbumBeanクラスの両方で使用されているinsertNewPhoto( )メソッドは、新しい写真をフォト・アルバムに挿入し、同時に縮小イメージを作成します。アプリケーションでイメージを処理する際にイメージ・フォーマットが不明な場合、processCopy( )メソッドがコールされると、アプリケーションは正常に実行されません。この潜在的な問題を回避するには、アプリケーションで、次のtryブロックおよびcatchブロックを使用して、SQLのすべての例外を捕捉します。

        try
        {
            image.processCopy( "maxScale=50,50", thumb );
        }
        catch ( SQLException e )
        {
            thumb.deleteContent();
            thumb.setContentLength( 0 );
        }

この例では、イメージ・フォーマットが不明で縮小イメージを作成できない場合に、アプリケーションによってSQL例外が捕捉され、deleteContent( )メソッドがコールされて縮小イメージのコンテンツが削除されます。次に、setContentLength( )メソッドがコールされて、コンテンツ長が0(ゼロ)に設定されます。

2.4 JavaベースのWebアプリケーションの開発

Javaプラットフォームでは、Webアプリケーションは、Webサーバーの動的拡張です。JavaベースのWebアプリケーションは、JavaサーブレットまたはJSPページ(あるいはその両方)で構成されます。Javaサーブレットは、動的にHTTPリクエストを処理し、HTTPレスポンスを構築するJavaクラスです。JSPページは、サーブレットとして実行されるテキスト・ベースのドキュメントですが、より自然な形で静的コンテンツを作成できます。

Oracle Multimedia Servlets and JSP Java APIは、Oracle Multimedia Java APIに基づいています。Oracle Multimedia Servlets and JSP Java APIのクラスによって、JavaベースのWebアプリケーションにおけるOracle Databaseとの間でメディア・データの取得およびアップロードが容易になります。

Oracle Multimedia Servlets and JSP Java APIのJavaクラスは、oracle.ord.im.*パッケージに含まれています。含まれているクラスは、次のとおりです。

OrdHttpResponseHandlerクラスによって、Oracle Databaseからのメディア・データの取得、およびJavaサーブレットからHTTPクライアントへのメディア・データの配信が容易になります。OrdHttpJspResponseHandlerクラスによって、JSPページに同じ機能が提供されます。OrdHttpUploadFormData、OrdHttpUploadFile、OrdMultipartFilterおよびOrdMultipartWrapperクラスによっては、WebクライアントからOracle Databaseへのメディア・データのアップロードが容易になります。

2.4.1項では、JavaベースのWebアプリケーションでOracle Multimediaオブジェクトからメディア・データを取得する方法について説明します。2.4.2項では、JavaベースのWebアプリケーションで、データベースのOracle Multimediaオブジェクトへメディア・データをアップロードする方法について説明します。

Oracle Multimedia Servlets and JSP Java APIを使用するには、2.3.1項の手順1に従って、適切なJavaライブラリで環境を設定する必要があります。そのリストの項目に加え、CLASSPATH環境変数にOracle Multimedia Java Webライブラリ(<ORACLE_HOME>/ord/jlib/ordhttp.jar)を追加する必要があります。

これらのクラスで使用可能なメソッドの詳細は、『Oracle Multimedia Servlets and JSP Java API Reference』を参照してください。

2.4.1 JavaベースWebアプリケーションでのメディアの取得

通常、イメージを含むWebページをWebブラウザに表示するには、2回のHTTPラウンド・トリップが必要です。

1回目のラウンド・トリップでは、Webブラウザは、イメージを含むWebページのURLに対しHTTPリクエストを送信します。それに対し、Webサーバーからは、Webページのテキスト・コンテンツとメディア・コンテンツのURLが返されます。URLは、Webページの<img>タグのsrc属性です。

2回目のラウンド・トリップでは、Webブラウザは、<img>タグのURLに対し、イメージのバイナリ・データを取得するために別のHTTPリクエストを送信します。その後、ブラウザにイメージを表示します。

JavaベースのWebアプリケーションで、データベースからHTTPクライアント(Webブラウザ)にメディア・データを送信するには、適切なメディアのURL(1回目のHTTPレスポンスで生成)および適切なメディア配信コンポーネント(2回目のHTTPレスポンスのためのサーブレットまたはJSP)が必要です。

2.4.1.1 メディアのURL

メディア・データがWebサーバー上に静的ファイルとして格納されている場合、メディアのURLは、ファイル・システム上のメディア・ファイルへの相対パスまたは絶対パスになります。メディア・データがデータベースに格納されている場合、通常、メディアのURLはメディア配信コンポーネント(サーブレットまたはJSP)とメディア配信コンポーネントのパラメータで構成されます。メディア配信コンポーネントは、メディア・データを取得する2回目のHTTPリクエストのターゲットになります。メディア配信コンポーネントのパラメータは、メディア配信コンポーネントが、データベースにおけるメディア・データの位置を問い合せるために使用します。次に例を示します。

<img src="OrdGetMedia.jsp?id=1"/>

ここで、メディアURL("OrdGetMedia.jsp?id=1")内のOrdGetMedia.jspはメディア配信コンポーネントを示し、id=1はメディア配信コンポーネントに対するパラメータを示します。

2.4.1.2 メディア配信コンポーネント

メディア・データはOracle Multimediaオブジェクトとしてデータベースに格納されているため、メディア配信コンポーネントは、特定の問合せ条件に基づいて、メディア・データをJavaオブジェクト(2.3.2項を参照)として動的に取得する必要があります。これによって、Oracle Multimedia Servlets and JSP Java APIのOrdHttpResponseHandlerまたはOrdHttpJspResponsehandlerクラスを使用して、データをHTTPクライアント(Webブラウザ)に配信できます。

次に、メディア配信コンポーネントとしてJavaサーブレットを使用する例を示します。SQL文およびこの操作を実行しているコードの主な部分は、太字で強調表示しています。

import oracle.ord.im.OrdHttpResponseHandler;

protected void doGet(HttpServletRequest request,
 HttpServletResponse response)
  throws ServletException, java.io.IOException
{
// obtain oracle.ord.im.OrdImage object
// imgProxy follows the Section "Media Retrieval in Java"
 . . .

// deliver the image data to the browser
OrdHttpResponseHandler handler = 
new OrdHttpResponseHandler( request, response);
handler.sendImage(imgProxy);

 . . .
 }

次に、メディア配信コンポーネントとしてJSPページを使用する例を示します。SQL文およびこの操作を実行しているコードの主な部分は、太字で強調表示しています。

<%@ page 
import="oracle.ord.im.OrdHttpJspResponseHandler" 
%>

<jsp:useBean id = "handler" scope="page"
     class = "oracle.ord.im.OrdHttpJspResponseHandler"
/>

<%
// obtain oracle.ord.im.OrdImage object
// imgProxy follows the Section "Media Retrieval in Java"
. . .

// deliver the image data to the browser
   handler.setPageContext( pageContext );
   handler.sendImage(imgProxy);
   return;
%>

2.4.2 JavaベースWebアプリケーションでのメディアのアップロード

HTMLフォームによって、WebブラウザとWebサーバー間でデータの入力およびアップロードが可能になります。次に、ファイルをアップロードするHTMLフォームの例を示します。SQL文およびこの操作を実行しているコードの部分は、太字で強調表示しています。

<form action="uploadAction.jsp" method="post"
enctype="multipart/form-data">
id: <input type="text" name="id"/>
description: <input type="text" name="description"/>
Photo: <input type="file" name="photo"/>
</form>

前述のコード例で、<form>タグのenctype属性の値に「multipart/form-data」を設定した場合、アップロード・データに対し、multipart/form-dataフォーマットのエンコーディングが指定されます。<form>タグのaction属性の値は、アップロード・データを処理するJSPの名前を表します。

アップロード・データをJSPまたはサーブレットで処理するには、次の手順を実行します。

  1. アップロード・ファイルをデコードします。このファイルは、multipart/form-dataフォーマットでエンコードされているため、データの処理を続行するには、デコードする必要があります。エンコードされたHTTPリクエスト・データは、OrdHttpUploadFormDataクラスでデコードできます。この場合、アップロード・ファイルはOrdHttpUploadFileオブジェクトのインスタンスとして取得されます。デコードされたアップロード・ファイルを取得する場合、このクラスは、明示的または暗黙的に使用できます。

    次に、OrdHttpUploadFormDataクラスを明示的に使用してアップロード・ファイルを取得する例を示します。SQL文およびこの操作を実行しているコードの主な部分は、太字で強調表示しています。このメソッドは、アップロードのHTTPリクエストを処理するサーブレットまたはJSP内で使用します。

    //
    // Import OrdHttpUploadFormData and OrdHttpUploadFile class:
    // In a servlet:
    // import oracle.ord.im.OrdHttpUploadFormData;
    // import oracle.ord.im.OrdHttpUploadFile;
    // In a JSP:
    // <%@ page import="oracle.ord.im.OrdHttpUploadFormData" %>
    // <%@ page import="oracle.ord.im.OrdHttpUploadFile" %>
    //
    
    //
    // Following code snippets should be within <% %> if in a JSP.
    //
    
    // Create an OrdHttpUploadFormData object and use it to parse
    // the multipart/form-data message.
    //
    OrdHttpUploadFormData formData = new OrdHttpUploadFormData(
     request );
    formData.parseFormData();
    
    //
    // Get the description, location, and photo.
    //
    String id = formData.getParameter( "id" );
    String description = formData.getParameter( "description" );
    OrdHttpUploadFile photo = formData.getFileParameter( "photo" );
    
    //
    // Process the uploaded file.
    //
     ...
    
    //
    // Release the resources.
    //
    formData.release();
    

    アップロード・データを処理する各JSPまたはサーブレットで明示的にOrdHttpUploadFormDataクラスがインスタンス化または解放されるのを回避するには、OrdMultipartFilterクラスでWebアプリケーションを構成し、OrdHttpUploadFormDataクラスを暗黙的に使用します。OrdMultipartFilterクラスを使用すると、multipart/form-dataフォーマットでエンコードされているHTTPリクエストは、デコードされてから、そのリクエストを処理するJSPまたはサーブレットに渡されます。

    次の手順および例は、OrdHttpUploadFormDataクラスを暗黙的に使用してアップロード・ファイルを取得する方法を示します。このコード例では、SQL文およびこの操作を実行しているコードの部分は、太字で強調表示しています。

    1. Webアプリケーションのweb.xmlファイルに次のコードを追加し、フィルタを構成します。

      <filter>
          <filter-name>OrdMultipartFilter</filter-name>
          <filter-class>
      oracle.ord.im.OrdMultipartFilter
          </filter-class>
      </filter>
      <filter-mapping>
          <filter-name>OrdMultipartFilter</filter-name>
          <servlet-name>*.jsp</servlet-name>
      </filter-mapping>
      
    2. フィルタの構成後、JSPまたはサーブレットにあるフォーム・データおよびアップロード・ファイルを取得します。

      //
      // Get the id, description, and photo.
      //
      String id = request.getParameter( "id" );
      String description = request.getParameter( "description" );      oracle.ord.im.OrdHttpUploadFile photoFile =
       request.getFileParameter("photo");
      

      ここで、requestはJSPまたはサーブレットに渡されたHttpServletRequestオブジェクトを示します。

  2. データベースにアップロード・ファイルを保存します。OrdHttpUploadFormDataクラスを明示的または暗黙的に使用してOrdHttpUploadFileオブジェクトが取得された後、次の文を使用して、アップロード・ファイルをOracle Multimediaオブジェクトとしてデータベースにロードできるようになります。

    photoFile.loadImage(imgProxy);
    

    ここで、photoFileはOrdHttpUploadFileオブジェクトを示し、imgProxy2.3.3項の手順1で取得したOrdImageオブジェクトを示します。

    loadImageメソッドは、setPropertiesメソッドを暗黙的にコールし、オブジェクト・フィールドへの移入を実行します。

    Oracle Multimedia Javaオブジェクトへデータをロードした後、2.3.3項の手順4および5に従って、データベース表で対応するOracle Multimediaオブジェクトを更新できます。