Oracle FormsとJavaScriptの統合
この章の構成は、次のとおりです。
Oracle Formsによる外部イベントのコールについて
以前のリリースのOracle Formsでは、Forms外部の限られた数のイベント型と対話するためにOLEおよびDDEを実装する必要がありました。その後のバージョンのFormsで、外部アプリケーション・ソースとのインタフェースを実現するためにweb.show_document
およびJavaの統合が提供されました。
ただし、Formsが表示されるWebページへのコールに関しては、簡単なソリューションがありませんでした。また、HTMLフォームから取得した値を更新する場合などに、WebページからFormsをコールすることもできませんでした。
JavaScriptの統合により、JavaScriptイベントからのFormsのコールやFormsによるJavaScriptイベントの実行が可能になっています。次の図は、JavaScriptとOracle Formsが連携する仕組みを示しています。図の左側で、FormsアプレットがホストされているページでJavaScriptが実行されます。Oracle Formsには、ネイティブのビルトインを使用してJavaScript機能をコールできる機能が加わりました。また、JavaScript機能は、提供されている新しいAPIを使用してOracle Formsトリガーを起動できるようになりました。
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_expr
とweb.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 ');
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_value
とsystem.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つのイベントを認識します。それ以外の名前は無視されます。
JavaScriptとOracle Formsの統合
この項では、Oracle FormsアプリケーションでJavaScriptを統合する例について説明します。
ノート:
-
Forms Builderのオンライン・ヘルプも参照してください
Oracle FormsアプリケーションでJavaScriptを統合するには、次のステップを実行します。
- JavaScriptイベントを使用するFormsアプリケーションを構築します。
WHEN-CUSTOM-JAVASCRIPT-EVENT
トリガーで:system.javascript_event_name
および:system.javascript_event_value
を使用します。このモジュールをコンパイルします。 - Oracle Formsアプリケーションの起動で使用するHTMLページを生成するときにFormsサーブレットがテンプレートとして使用するhtmlファイルを作成します(
test.html
など)。このファイルを、Formsの構成ディレクトリ$ORACLE_INSTANCE/config/FormsComponent/forms/server
にコピーします。 - イメージ、htmlファイル、JavaScriptファイル、cssファイルなどの必要なファイルをすべて
$DOMAIN_HOME/servers/WLS_FORMS/tmp/_WL_user/formsapp_12.2.1/<random_string2>/war/
ディレクトリにコピーします - JavaScriptを使用してサーブレットのURLを呼び出すhtmlファイル(
js.html
など)を作成します。 - Enterprise Managerを使用し、新しい構成セクションを作成するか、既存の構成セクションを変更して、
enableJavascriptEvent
を有効にします。baseHTMLjpiをtest.html
に設定します。 - Enterprise Managerを使用し、
default.env
ファイルを編集して、Formsアプリケーションを保存したディレクトリを環境変数FORMS_PATH
に追加します。 - ブラウザでURLに
http://<localhost>:9001/forms/js.html
を指定して、アプリケーションを実行します。
Java Web StartおよびFormsスタンドアロン・ランチャのためのFormsとJavaScriptの統合
Java Web StartまたはFormsスタンドアロン・ランチャを使用している場合は、Forms Websocket JavaScript統合(WJSI)を使用してJavaScriptと統合できます。
JavaScriptを使用してFormsアプリケーションをWebページを統合する機能は、Oracle Forms 11g R2で導入されました。この機能を使用すると、開発者はFormsアプリケーションとHTMLベースのWebアプリケーションを調和することができました。FormsアプリケーションがHTMLページと通信できるため、アプリケーションの設計がよりクリエイティブになりました。12.2.1.3以前のリリースでは、Java Web StartまたはFormsスタンドアロン・ランチャを使用している場合、JavaScriptを使用した統合の機能は使用できませんでした。これは、その構成に親ブラウザが含まれておらず、したがって、2つのテクノロジ間をつなぐ方法が公開されていないためです。
きわめて軽量なWebリスナーであるEclipse/Jettyを利用して、Java Web StartまたはFormsスタンドアロン・ランチャを使用して実行されているFormsアプリケーションでは、WebSocket接続を介してWebページと通信できます。
この機能には、EclipseからのJetty jarファイル(jetty-all-9.4.5.v20170502-uber.jar以降)のダウンロードおよび署名が必要となります。maven.orgにあるjetty-allディレクトリからjarファイルをダウンロードします。
Jettyの詳細は、EclipseのWebサイトを参照してください。
Webページとフォーム・アプリケーションの統合を容易にするために、EclipseまたはJettyの使用に加えて、統合する各Webページには、WebページのBODYに次のHTMLが含まれている必要があります。
<script src="/forms/java/frmwebsocketjsi.js"></script>
ノート:
frmwebsocketjsi.jsのコンテンツの変更はサポートされていないか、推奨されていません。また、このファイルはデフォルトの場所から移動しないことをお薦めします。これを行うと、パッチによって必要に応じてファイルを正しく更新できなくなります。JavaScript統合用のWeb構成
Formsアプリケーションの管理者は、formsweb.cfg
のパラメータenableJavascriptEvent
をtrueまたはfalseに設定することによってJavaScript統合を有効または無効にすることができます。
enableJavascriptEvent
がtrueに設定されていない場合、JavaScriptからのコールは無視されます。document.<applet_name>を介してFormsアプレットを参照するには、applet_nameパラメータをHTML開発者によって使用される値に設定する必要があります。
また、管理者はformsweb.cfg
のJavaScriptBlocksHeartBeat
(デフォルト値: false)をtrueに設定する必要があります。これにより、JavaScriptの実行中にFormのHEARTBEAT
がブロックされます。FORMS_TIMEOUTの時間内にJavaScriptが実行全体をコールする場合、JavaScriptBlocksHeartBeatをtrueに設定すると追加のネットワーク・メッセージを回避でき、パフォーマンスが向上します。
JavaScriptBlocksHeartBeatをtrueに設定した場合は、JavaScriptの実行に要する時間がFORMS_TIMEOUTの値を超えるとFormsが異常終了します。
websocketJSILogging
websocketJSIServerTimeout
websocketJSISessionTimeout
環境変数の構成
default.env
内のFORMS_ALLOW_JAVASCRIPT_EVENTS
という名前の環境変数を使用して、JavaScript統合を有効または無効にすることもできます。
デフォルトでは、この変数の値はtrueです。この変数をfalseに設定すると、formsweb.cfg
でenableJavascriptEvent
に設定されている値に関係なく、default.env
のインスタンスを使用するすべてのFormsアプリケーションでJavaScript統合が無効になります。
FORMS_WJSI_OVERRIDE_TIMEOUT
環境変数は、前述の項で説明したWJSI構成でオプションとして使用できます。この環境変数の使用方法の詳細は、「環境変数」を参照してください。