プライマリ・コンテンツに移動
Oracle® Fusion Middleware Forms Servicesデプロイメント・ガイド
12c (12.2.1.3.0)
E90224-02
目次へ移動
目次

前
次
次へ

6 Oracle FormsとJavaScriptの統合

JavaScriptをOracle Formsアプリケーションに統合する方法を学びます。例として、Oracle Formsによる外部イベントのコールおよびOracle FormsをコールするJavaScriptイベントを示します。formsweb.cfgおよび環境変数を構成することによって、JavaScriptの統合を有効化または無効化することもできます。

この章の構成は、次のとおりです。

6.1 Oracle Formsによる外部イベントのコールについて

以前のリリースのOracle Formsでは、Forms外部の限られた数のイベント型と対話するためにOLEおよびDDEを実装する必要がありました。その後のバージョンのFormsで、外部アプリケーション・ソースとのインタフェースを実現するためにweb.show_documentおよびJavaの統合が提供されました。

ただし、Formsが表示されるWebページへのコールに関しては、簡単なソリューションがありませんでした。また、HTMLフォームから取得した値を更新する場合などに、WebページからFormsをコールすることもできませんでした。

Oracle Forms 12cでは、JavaScriptの統合により、JavaScriptイベントからのFormsのコールやFormsによるJavaScriptイベントの実行が可能になっています。次の図は、JavaScriptとOracle Formsが連携する仕組みを示しています。図の左側で、FormsアプレットがホストされているページでJavaScriptが実行されます。Oracle Formsには、ネイティブのビルトインを使用してJavaScript機能をコールできる機能が加わりました。また、JavaScript機能は、提供されている新しいAPIを使用してOracle Formsトリガーを起動できるようになりました。

図6-1 Oracle FormsとJavaScript

図6-1の説明が続きます
「図6-1 Oracle FormsとJavaScript」の説明

web組込みパッケージには、次の2つの新しいコールが提供されています。

  • web.javascript_eval_expr

  • web.javascript_eval_function

最初のコールweb.javascript_eval_exprは、式とターゲットの2つの引数を使用するプロシージャです。引数のデータ型はどちらもvarchar2です。この有効なJavaScript式は、Formsアプレットが埋め込まれているWebページで解釈されます。この式は、ターゲット・ページで定義されている関数のコール、またはターゲット・ページで実行できる有効なJavaScript式(たとえばdocument.bgColor='red'.)です。この式は、LiveConnectのJSObject.eval()メソッドを使用して、ターゲット引数に指定されたページまたはフレームのコンテキストで実行されます。ターゲット引数がNullの場合は、Formsアプレットが埋め込まれているページまたはフレームで式が実行されます。

2番目のコールweb.javascript_eval_functionは関数であり、varchar2値を返します。web.javascript_eval_exprweb.javascript_eval_functionの機能は、javascript_eval_exprがFormsクライアントからForms Servicesに戻り値を送信しない点を除いて同じです。アプリケーションが戻り値を必要としない場合は、web.javascript_eval_exprを使用してください。FormsクライアントからForms Servicesに戻り値を渡す場合に必要となる余分なネットワーク送信を省くことができます。

IDがoutside_field_idであるHTMLテキスト項目の値を、insideというFormsフィールドの値に設定するには、次のPL/SQLコードを記述します。

web.javascript_eval_expr('
document.getElementById("outside_field_id").value='
||:inside
);

JavaScriptでは一重引用符と二重引用符を自由に使用できますが、PL/SQL文字列には一重引用符を使用する必要があるので注意してください。式の内部で二重引用符を使用する場合は、エスケープ・シーケンスを使用する必要はありません。Webページ内で関数を記述することもできます。

<SCRIPT>
    function set_field(field_id, myvalue){
        document.getElementById(field_id).value=myvalue;
    };
</SCRIPT>

outsideフィールドの値を取得してinsideフィールドに割り当てるには、次のPL/SQLコードを記述します。

:inside:=web.javascript_eval_function('
     document.getElementById("outside_field_id").value
     ');

6.1.1 Oracle Formsの外部でイベントをコールする理由

Oracle Forms 12cでは、JavaScript機能によって、FormsとHTMLベースのアプリケーション・テクノロジをWebブラウザで統合できます。たとえば、HTMLフロントエンドに基づく新しい機能を備えたページ上でFormsベースのアプリケーションを統合する必要がある場合に、JavaScript統合を使用できます。

6.2 Oracle FormsをコールするJavaScriptイベントについて

FormsアプレットをホストするWebページでJavaScriptを使用して、JavaScriptからOracle Formsをコールすることもできます。

DOM (Document Object Model)ツリー内の埋め込まれたFormsオブジェクトに新しい機能が提供されています。JavaScriptを使用して次の処理を行います。

document.forms_applet.raiseEvent(event_name, payload);

ここでは、ID構成変数をforms_appletに設定していたことを前提としています。

周囲のWebページがこのJavaScriptコードを実行すると、Oracle FormsがWHEN-CUSTOM-JAVASCRIPT-EVENTという新しいタイプのトリガーを起動します。このトリガーには、system.javascript_event_valuesystem.javascript_event_nameの2つの有効なシステム変数があります。これらの変数に含まれているペイロードとイベント名は、raiseEventメソッドを通じてFormsに渡されたものです。raiseEventメソッドがコールされると、WHEN-CUSTOM-JAVASCRIPT-EVENTという名前のトリガーがサーバー側で起動されます。

declare
    event_val varchar2(300):= :system.javascript_event_value;
begin
    if (:system.javascript_event_name='show') then
        handleShowEvent(event_val);
    elsif(:system.javascript_event_name='grab') then
	  handleGrabEvent(event_val);
    else
        null;
    end if;
end;

このPL/SQLコードは、showとgrabの2つのイベントを認識します。それ以外の名前は無視されます。

6.2.1 イベント・コールをOracle Forms内で行う理由

HTMLベースのアプリケーションは、Javaベースであるかどうかにかかわらず、同じホスト元Webページ内のFormsベース・アプリケーションと同期できます。たとえば、HTMLベースのアプリケーションを使用してデータの問合せを行い、ユーザーが適切なアクセス権限を持っている場合にのみ、Formsを使用してそのデータを更新します。

6.3 JavaScriptとOracle Formsの統合

この項では、Oracle FormsアプリケーションでJavaScriptを統合する例について説明します。

注意:

JavaScriptイベントを使用してFormsアプリケーションを構築するには、次を参照してください

Oracle FormsアプリケーションでJavaScriptを統合するには、次の手順を実行します。

  1. JavaScriptイベントを使用するFormsアプリケーションを構築します。WHEN-CUSTOM-JAVASCRIPT-EVENTトリガーで:system.javascript_event_nameおよび:system.javascript_event_valueを使用します。このモジュールをコンパイルします。
  2. Oracle Formsアプリケーションの起動で使用するHTMLページを生成するときにFormsサーブレットがテンプレートとして使用するhtmlファイルを作成します(test.htmlなど)。このファイルを、Formsの構成ディレクトリ $ORACLE_INSTANCE/config/FormsComponent/forms/serverにコピーします。
  3. イメージ、htmlファイル、JavaScriptファイル、cssファイルなどの必要なファイルをすべて$DOMAIN_HOME/servers/WLS_FORMS/tmp/_WL_user/formsapp_12.2.1/<random_string2>/war/ディレクトリにコピーします
  4. JavaScriptを使用してサーブレットのURLを呼び出すhtmlファイル(js.htmlなど)を作成します。
  5. Enterprise Managerを使用し、新しい構成セクションを作成するか、既存の構成セクションを変更して、enableJavascriptEventを有効にします。baseHTMLjpiをtest.htmlに設定します。
  6. Enterprise Managerを使用し、default.envファイルを編集して、Formsアプリケーションを保存したディレクトリを環境変数FORMS_PATHに追加します。
  7. ブラウザでURLにhttp://<localhost>:9001/forms/js.htmlを指定して、アプリケーションを実行します。

6.4 Java Web StartおよびFormsスタンドアロン・ランチャのためのFormsとJavaScriptの統合

Java Web StartまたはFormsスタンドアロン・ランチャを使用している場合、JavaScriptを使用してOracle FormsアプリケーションをWebページと統合できるようになりました。

JavaScriptを使用してFormsアプリケーションをWebページを統合する機能は、Oracle Forms 11g R2で導入されました。この機能を使用すると、開発者はFormsアプリケーションとHTMLベースのWebアプリケーションを調和することができました。FormsアプリケーションがHTMLページと通信できるため、アプリケーションの設計がよりクリエイティブになりました。以前のOracle Forms 12cのリリースでは、Java Web StartまたはFormsスタンドアロン・ランチャを使用している場合、JavaScriptを使用した統合の機能は使用できませんでした。これは、その構成に親ブラウザが含まれておらず、したがって、2つのテクノロジ間をつなぐ方法が公開されていないためです。

Oracle Forms 12c (12.2.1.3.0)以降、Java Web StartまたはFormsスタンドアロン・ランチャを使用しているときに、実行中のFormsアプリケーションに親ブラウザが含まれていなくても、ブラウザのHTMLコンテンツと再度通信することが可能です。きわめて軽量なWebリスナーであるEclipse/Jettyを利用して、Formsアプリケーションでは、Webソケット接続を介してWebページと通信できるようになっています。

この機能には、EclipseからのJetty (9.4.5.v20170502)のダウンロードおよび署名が必要となります。jarファイルをMaven Centralからダウンロードします(http://central.maven.org/maven2/org/eclipse/jetty/aggregate/jetty-all/9.4.5.v20170502/jetty-all-9.4.5.v20170502-uber.jar)。

6.5 formsweb.cfgの構成

Formsアプリケーションの管理者は、formsweb.cfgのパラメータenableJavascriptEventをtrueまたはfalseに設定することによってJavaScript統合を有効または無効にすることができます。

enableJavascriptEventがtrueに設定されていない場合、JavaScriptからのコールは無視されます。document.<applet_name>を介してFormsアプレットを参照するには、applet_nameパラメータをHTML開発者によって使用される値に設定する必要があります。

また、管理者はformsweb.cfgJavaScriptBlocksHeartBeat(デフォルト値: false)をtrueに設定する必要があります。これにより、JavaScriptの実行中にFormのHEARTBEATがブロックされます。FORMS_TIMEOUTの時間内にJavaScriptが実行全体をコールする場合、JavaScriptBlocksHeartBeatをtrueに設定すると追加のネットワーク・メッセージを回避でき、パフォーマンスが向上します。

JavaScriptBlocksHeartBeatをtrueに設定した場合は、JavaScriptの実行に要する時間がFORMS_TIMEOUTの値を超えるとFormsが異常終了します。

6.6 環境変数の構成

default.env内のFORMS_ALLOW_JAVASCRIPT_EVENTSという名前の環境変数を使用して、JavaScript統合を有効または無効にすることもできます。

デフォルトでは、この変数の値はtrueです。この変数をfalseに設定すると、formsweb.cfgenableJavascriptEventに設定されている値に関係なく、default.envのインスタンスを使用するすべてのFormsアプリケーションでJavaScript統合が無効になります。