クライアント側の開発者向けガイド

     前  次    目次     
ここから内容

WLP Disc フレームワーク

この章では、Dynamic Interface SCripting (Disc) フレームワークについて説明します。Disc は WLP REST API と組み合わせて使用される場合があり、クライアント側の JavaScript API を提供し、リッチで対話的なポートレットとポータル アプリケーションの開発を支援します。Disc によって、リッチ、対話的なポータル Web アプリケーションの機能を有効にする AJAX 対応ポートレットを書き込むことができます。

この章では、次のトピックについて説明します。

 


Disc とは

Disc では、イベントを処理する、非同期でポートレットを更新する、およびポータル コンテキスト オブジェクトにアクセスするためにクライアント側の、JavaScript、オブジェクト指向プログラミング フレームワークが提供されます。Java ベースの WLP API の同様に、Disc コンテキスト オブジェクトは、プレースホルダ内でのポートレットの位置、タイトル、ラベルなどの説明的な情報をカプセル化します。コンテキスト オブジェクトに返された情報は、ポータルを変更するのに使用する REST コマンドのパラメータとして使用できます。たとえば、WLP の配置の動き (ポートレットのドラッグ アンド ドロップ) という機能は、Disc と REST 機能を使用して実装されます。(『ポータル開発ガイド』の「配置の動きの有効化」を参照)。

ヒント : Disc JavaScript API」に関するリファレンス ドキュメントは、e-docs で入手できます。

図 3-1 に示すように、非同期デスクトップ モードと DVT 機能の両方では Disc が使用されます。非同期デスクトップ モードまたはポータル デスクトップの DVT を有効にすると、Disc が暗黙的に有効にされます。

図 3-1 Disc に依存する機能

Disc に依存する機能

DVT フラグは、ポータル デスクトップの配置動作 (ポートレットのドラッグ アンド ドロップ) 機能を有効にします。デスクトップの非同期表示と配置できる動きは、「ポータル開発ガイド」で説明しています。

 


Disc の有効化

Disc をクライアント側のポータル コードに使用するには、まずそれを有効にする必要があります。Disc を Workshop for WebLogic または WebLogic Portal Administration Console で有効にすることができます。また、Disc はポータルのコンテキストの外側でも使用できます。

この節では、次のトピックについて説明します。

Disc の有効化とは

Disc が有効にされると、以下の WLP クライアント側の開発機能にアクセスできます。

Workshop for WebLogic での Disc の有効化

Workshop for WebLogic でポータルデスクトップ用の Disc を有効にするには、図 3-2 に示すように、[デスクトップ プロパティ] ビューでは [Disc を有効化] を true に設定します。

図 3-2 Workshop For Weblogic での disc の有効化 

Workshop For weblogic での Disc の有効化

注意 : 非同期モードまたは DVT を有効にすると、デスクトップ用の Disc が暗黙的に有効化されます。

Administration Console での Disc の有効化

Administration Console で Disc を有効にするには、以下の手順に従います。

  1. ポータル リソース ツリーで [ポータル] を選択し、デスクトップに移動します。
  2. [詳細] タブを選択します。
  3. [詳細プロパティ] をクリックし、(図 3-3) ダイアログを使用して [Disc を有効化] を true に設定します。
  4. 図 3-3 Disc の有効化


    Disc の有効化

注意 : 非同期モードまたは DVT を有効にすると、Disc が暗黙的に有効化されます。

ポータルの外側で Disc の使用

WLP ポートレットの公開機能は、Disc をポータルの外側で使用します。ポートレットの公開を使用して、ポートレットを任意の HTML ページに表示できます。 ポートレットの公開の詳細については、「ポートレットの公開」を参照してください。

 


ポータル対応の XMLHttpRequest を使用した非ポータル ソースからのデータの取得

Ajax 開発者に親しまれている標準 XMLHttpRequest オブジェクトは、ポートレット内の別個のデータを更新するために使用できます。Disc API クラスの bea.wlp.disc.io.XMLHttpRequest は、標準 XMLHttpRequest クラスの拡張です。WLP の XMLHttpRequest を使用して、ポータル サーバへの非同期で増分コールを実行でき、ポータル間通信や WSRP などのポータル機能をサポートできます。ただし、標準 XHR と同じようにポータル対応の XHR を使用できます。標準 XHR リクエストと同じようにポータル対応の XHR リクエストを、任意の JSP ポートレットから使用し、任意のデータを取得してポートレットに挿入できます。

使用例

使用例として、自動完全検索フォームを含むポートレットを書くことができます。ユーザが検索フィールドにテキストを入力すると、ポートレットによって、サーバにユーザのためのヒントを取得するポータル対応の XHR リクエストが送信されます。このプロセスでは、ポートレット UI はテキスト フィールドに表示されるヒントのみ更新します。

コード リスト 3-1 では、ポータル対応の XHR オブジェクトがインスタンス化され、非ポータル ソースからデータを非同期に取得するのに使用されます。このコードは、JSP ページに埋め込むのに適しています。

コード リスト 3-1 ポータル対応の XHR を使用した非ポータル ソースからのデータの取得
<script type="text/javascript">
var dataUrl = 'data.json';
var xmlhttp = new bea.wlp.disc.io.XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
var data = eval('(' + xmlhttp.responseText + ')');
var table = document.getElementById('data');
for (var i = 0; i < data.length; i++) {
// data[i] オブジェクトのプロパティを参照して「data」テーブルに行を
                // 挿入する。
}
}
}
xmlhttp.open('GET', dataUrl, true);
xmlhttp.send();
</script>

 


ポータル対応の XMLHttpRequest を使用したポートレットの更新

ポータル対応の XMLHttpRequest を使用して、クライアント側の JavaScript コードはポートレットに代わって、サーバ上のポータル フレームワークと対話することができます。サーバに対してポータル対応の XHR 呼び出しを実行すると、リクエストをどのように処理するかを決定するポータルによってリクエストが処理されます。ポータルは、指定のポートレットを呼び出し、ユーザ プロパティ、ポートレット プリファレンス、およびリクエストや応答オブジェクトなどのポートレットに適するコンテキストを提供することができます。ポータルにより、ポートレット間の依存関係が管理されるので、ポータル対応の XHR でポータル間通信が可能です。

使用例

以下に、ポータル対応の XHR の 2 つの使用例を示します。

開発者は、ポータル固有のコンテンツを更新するのに WLP-固有の XMLHttpRequest オブジェクト (bea.wlp.disc.io.XMLHttpRequest) も使用できます。このオブジェクトでリクエストを発行する場合、IPC や WSRP などの機能がサポートされます。ポータル対応の XHR クラスの詳細については、e-docs の「Disc API リファレンス マニュアル」を参照してください。

Workshop for WebLogic でポータル対応の XHR を有効にするには、「Workshop for WebLogic での Disc の有効化」節に示す手順に従います。

コード リスト 3-2 は、基本的にはコード リスト 3-1 と同じです。異なるのは、コード リスト 3-2 は、ポートレットをデータ ソースとして参照します。このサンプルコードは、JSP ページに直接埋め込むことが前提となります。

コード リスト 3-2   ポータル対応の XHR を使用したポートレットの更新
<%@ taglib prefix="render" uri="http://www.bea.com/servers/portal/tags/netuix/render" %>
<render:jspContentUrl contentUri="/path/to/portlet/data.jsp" forcedAmpForm="false" var="dataUrl"/>

<script type="text/javascript">
var dataUrl = '${dataUrl}';
var xmlhttp = new bea.wlp.disc.io.XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
var data = eval('(' + xmlhttp.responseText + ')');
var table = document.getElementById('data');
for (var i = 0; i < data.length; i++) {
// data[i] オブジェクトのプロパティを参照して「data」テーブルに行を
                // 挿入する。
}
}
}
xmlhttp.open('GET', dataUrl, true);
xmlhttp.send();
</script>

 


コンテキスト オブジェクトの使用

Disc では、JavaScript を使用して、クライアント側のポータルのコンテキスト オブジェクトを使用できます。コンテキスト オブジェクトは、ポータル コンポーネントに関する一部の情報をカプセル化したものです。コンテキスト オブジェクトには、以下のポータル コンポーネントに関する情報が含まれます。

Disc コンテンツ クラスは、サーバ側の PresentationContext クラスの代表であり、クライアント側プログラミングで同様の役目を果たします。bea.wlp.disc.context モジュールのコンテキスト オブジェクトのセットについては、e-docs の「Disc API リファレンス マニュアル」で説明します。

注意 : 目に見えるコンポーネント用のコンテキスト オブジェクトのみ利用可能です。現在のブックのピア ブック、または非表示のポートレットなどの目に見えないコンポーネントは Disc API で利用できません。

コンテキスト オブジェクトの使用

通常、Disc コンテキスト オブジェクトは HTML ページが全体ロードされた後利用可能になります。コンテキスト オブジェクトをインライン スクリプト ブロックから使用しないことが、ベスト プラクティスです。代わりに、コンテキスト オブジェクトとの対話を指定する onload ハンドラを登録します。たとえば、コード リスト 3-3 のコードが JSP ポートレット内にインラインで配置される場合、エラーが発生します。

コード リスト 3-3 コンテキスト オブジェクトにアクセスする間違った方法
//ポートレットは null になる
var portlet = bea.wlp.disc.context.Portlet.findByLabel("myPortletLabel");
var title = portlet.getTitle(); // エラー

ただし、同じコードを Dojo onload 関数に追加すると、コードが想定通りに機能します。

コード リスト 3-4 コンテキスト オブジェクトにアクセスする推奨方法
dojo.addOnLoad(function() {
    var portlet = bea.wlp.disc.context.Portlet.findByLabel("myPortletLabel");
    var title = portlet.getTitle();
});

コード リスト 3-5 はデバッグの簡単なサンプルを示します。ベスト プラクティスは、このコードを表示依存関係ファイルに配置することです。詳細については、「表示依存関係ファイルの作成」を参照してください。

コード リスト 3-5 デバッグの簡単なサンプル
dojo.addOnLoad(function() {
var portlets = bea.wlp.disc.context.Portlet.getAll();
for (var i = 0; i < portlets.length; i++) {
bea.wlp.disc.Console.debug(portlets[i]);
}
});

コード リスト 3-6 は、コンテキスト オブジェクトを使用する他の例を示します。

ポートレット用の表示依存関係ファイルのリソースは、モードや状態に関係なく、常に含まれます (最小化を除きます。これは、特殊なケースです)。ポートレットには、表示依存関係ファイル (たとえば、ハンドラに追加されている。) からロードされる場合、常に実行され、ポートレットにコンテンツを追加する関数がある場合は、ポートレットは通常表示モードにあるときのみコンテンツの追加を試みる必要があります。コード リスト 3-6 は、表示依存関係ファイルからロードされるものです。

コード リスト 3-6 Disc を使用したポートレットの状態の決定
function createDataTables(label) {
    var portlet = bea.wlp.disc.context.Portlet.findByLabel(label);
    if (portlet.getWindowMode() == "view") {
        // データを取得して、対応するテーブルを作成する...
        if (portlet.getWindowState() == "maximized") {
            // 拡張詳細でテーブルを作成する
        }
        else {
            // 一般な詳細でテーブルを作成する
        }
    }
}

 


XMLHttpRequest 対話エンジン

Disc モジュール bea.wlp.disc.xie は Disc の XMLHttpRequest 対話エンジン (XIE) のためにパブリック API を定義します。XIE は、WebLogic Portal との Ajax-起動型の対話用のクライアント側の基盤です。また、XIE は以下を含む他の様々な Ajax ベースのパブリック Disc API を実装するプラットフォームです。

XIE API は、2 つの主要な領域に分割されます。

この節で説明したクラスの詳細については、e-docs の「Disc API ドキュメント」を参照してください。

 


イベント処理

bea.wlp.disc.xie.Events オブジェクトには、XIE の対話ライフサイクル中に発生するパブリック、グローバル イベントのセットが含まれます。対話ライフサイクルには、WLP サーバに Ajax リクエストを設定して実施する、および応答を受信して、処理することが含まれます。WLP Ajax 応答は、内部 JSON 形式でエンコード (これらのフォームは確保され、変わることがある) されます。XIE は、これらの応答の本体の評価と処理を管理します。パブリック XIE イベントの一式は、このライフサイクルの間、主な段階まで一般なユーザのアクセスを提供します。また、リスン コードはこのイベント フックを使用することで、対話に応答でき、さらに対話の結果に影響を与えることもできます。このクラスの詳細については、e-docs の「Disc API ドキュメント」を参照してください。

  1. OnPrepareUpdate – このイベントは、対話が開始され、リクエストがまだ実行されていないとき、開始されます。このイベントをキャンセルすることができます。キャンセルすると、元のリクエストをせずに対話が終了されます。
  2. OnHandleUpdate – このイベントは、XIE は応答を受信し、処理をまだ開始しないとき、開始されます。
  3. OnRedirectUpdate – サーバがクライアントにリダイレクトを実行させると、このイベントは開始されます。処理はできるだけ早く完了され、クライアント側のリダイレクトが実行されます。
  4. サーバによって返された各応答マークアップに対して、以下のイベントが開始されます。
    1. OnPrepareMarkup – 応答マークアップ断片を DOM サブツリーに変換する前に開始されます。このイベントは、応答で返されたマークアップ断片ごとに一回開始されます。
    2. OnPrepareContent – 応答マークアップ断片が DOM サブツリーに変換されたとたん、追加の処理 (hrefs アンカやフォーム アクションの書き換えなど) を実行する前に、このイベントが開始されます。このイベントは、応答で返されたマークアップ断片ごとに一回開始されます。
    3. OnInjectContent – 完全に処理した (たとえば、書き換えした) DOM サブツリーをドキュメントに追加するとすぐに、しかしそのコンテンツに関連付けられているスクリプトを実行する前に、このイベントが開始されます。このイベントは、応答で返されたマークアップ断片ごとに一回開始されます。
  5. OnCompleteUpdate – Fired after XIE によって、対話に対するすべての応答の処理が完了された後、このイベントが開始されます。これには、対話の間に更新されたマークアップによって定義されたスクリプトの実行が含まれます。
  6. OnError – 対話処理の間にエラーが発生したときはいつも、このイベントが開始されます。OnError イベントが開始されたら、処理は中止される場合があります。

イベントが開始されると、各イベントによって、リスナにペイロード オブジェクトが提供されます。各ペイロード オブジェクトのタイプと機能はイベントによって異なります。特定のイベント ペイロードの詳細については、e-docs の「Disc API ドキュメント」にある個別イベントのドキュメントを参照してください。

 


ロギング

ロギングを実施する方法の 1 つは、Firebug ロギング モデルを使用することです。このモデルの詳細については、「http://getfirebug.com/logging.html」を参照してください。Firebug と Firebug Lite 両方では、ロギング出力をモニタするのに使用できるグローバル Console オブジェクトが提供されます。

Disc では、Firebug Console オブジェクトで見つかれた API をレプリケートする Console オブジェクト (bea.wlp.disc.Console) が提供されます。Disc が利用可能であるときはいつでもこのオブジェクトを使用できます。Disc Console オブジェクトの詳細については、e-docs の「Disc API ドキュメント」にある bea.wlp.disc.Console を参照してください。

コード リスト 3-7 は、リスナを設定し、Console オブジェクトを介してメッセージを送信する方法の簡単なサンプルを示します。Console でログされるすべてのメッセージがオブジェクト上の各リスナに渡されます。デバッグを呼び出すとき、リスナの機能に以下の引数を渡すことができます。

op
“debug”
args
[“label=”, “myPortlet”]

このコンフィグレーションによって、myConsoleOutput と呼ばれる div に次の HTML テキストが出力されます。この div は、ページであらかじめ定義される必要があります。

DEBUG: label=myPortlet
コード リスト 3-7 Console リスナの設定の単純な例
bea.wlp.disc.Console.addListener(function(op, args) {
    var output = document.getElementById("myConsoleOutput");
    output.appendChild(document.createElement("br"));
    output.appendChild(document.createTextNode(op.toUpperCase() + ": " +     args.join(",")));
});
// 後で、myPortlet.getLabel() は「myPortlet」を返すと仮定する
bea.wlp.disc.Console.debug("label=", myPortlet.getLabel());

  ページの先頭       前  次