|
WebLogic Portal は、プロデューサとコンシューマ間のポートレット間通信 (IPC) に対応します。たとえば、プロデューサ アプリケーション内でデプロイされるリモート ポートレットは、コンシューマ内のローカル ポートレットにより開始される最小化イベントを処理できます。この章では、リモート ポートレットを使ったポートレット間通信の使用方法を説明する詳しい例を取り上げます。
WebLogic Portal は WSRP プロトコルに拡張を提供し、リモート ポートレットがライフサイクルの対話段階の間にイベントを開始できるようにします。連合ポートレットに対する WebLogic Portal IPC アーキテクチャの詳細については、「イベントによるポートレット間の通信」を参照してください。
コンシューマおよびプロデューサ アプリケーションでデプロイされるポートレット間の通信は双方向です。ローカル ポートレットにより開始されるイベントは、プロデューサにデプロイされているポートレットで処理でき、その逆も可能です。
この章の例は、連合ポータルでイベント処理を実装する 1 つの方法を示しています。この例では、イベント ハンドラがプロデューサのポートレットに追加されます。コンシューマ上のローカル ポートレットがイベントを開始するとき、プロデューサ上のリモート ポートレットはイベントを受信してそれを処理します (ポートレットに表示されるテキストを変更します)。
| 注意 : | 連合環境でイベント処理を実行するときは、コンシューマ側でプロキシ ポートレットを作成する前に、プロデューサ アプリケーションでポートレットにイベント ハンドラを追加する必要があります。イベント ハンドラの追加のように、プロデューサ ポートレットのメタデータを変更する場合、コンシューマはその変更について通知されません。適切な手順としては、コンシューマのリモート ポートレットを作成する前に、プロデューサのポートレットにイベント ハンドラを追加します。 |
WebLogic Portal における IPC の詳細については、『ポートレット開発ガイド』を参照してください。
この節では、リモート ポートレットでイベント処理を使用する方法を説明する詳しい例を取り上げます。この例では、コンシューマ側のリモート ポートレットが onMinimize イベントを開始します。onMinimize イベントは、ポートレットが最小化されるときに開始されます。イベントがコンシューマ側のローカル ポートレットから開始されるとき、イベントはプロデューサ側で処理されます。onMinimize イベントは WebLogic Portal フレームワークによりサポートされる標準イベントの 1 つです。標準イベントの詳細リストについては、『ポートレット開発ガイド』を参照してください。
この例では、ユーザがコンシューマ側のリモート ポートレットを最小化するとき、プロデューサがイベントを処理し、ポートレット内の一部のテキストを変更します。
| ヒント : | リモート ポートレットはカスタム イベントも処理できます。リモート ポートレットでのカスタム イベントの使用の詳細については、「カスタム イベントによるデータ転送」を参照してください。 |
この節で取り上げている例を試すには、Workshop for WebLogic を実行し、前提条件のタスクを実行して、その例の環境を設定する必要があります。
その例の環境を設定するには、表 7-1 に説明されている前提条件のタスクを実行します。このようなタスクの特定の手順に精通していない場合、WebLogic Portal チュートリアルの「ポータル開発環境の設定」にその詳細が説明されています。
図 7-1 は、前提条件タスクが完了した後のパッケージ エクスプローラを示しています。

このタスクでは、プロデューサ側に 2 つの JSP ファイルと、それぞれのファイルを表示するための JSP ポートレットを作成します。2 つのポートレット間の通信を完了するのに必要な指示を含むバッキング ファイルも作成し、ポートレットの 1 つにイベント ハンドラを追加します。ポートレットを作成して、バッキング ファイルを追加した後で、アプリケーションをブラウザでテストします。
プロデューサにデプロイされるポートレットが表示する JSP ファイルを作成するには、次の手順に従います。
Minimize Me! という文字列で置き換えます。 aPortlet.jsp という名前を付けて保存します。aPortlet.jsp を右クリックし、[ポートレットの生成] を選択します。
[ポートレットの詳細] ダイアログ ボックス (図 7-3) が表示されます。/aPortlet.jsp が [コンテンツ URI] フィールドに表示されていることを確認します。
パッケージ エクスプローラ内の producerWeb/WebContent フォルダに aPortlet.portlet ファイルが表示されます。
aPortlet.jsp のコピーを作成して、そのコピーである bPortlet.jsp を呼び出します。 bPortlet.jsp を開いて、コード リスト 7-1 から JSP にコードをコピーし、<netui:html> から </netui:html> まですべてを置き換えます。このコードは単に、後の手順で作成してポートレットに追加するバッキング ファイルにより要求内に配置されるテキストを表示します。<netui:html>
<% String event = (String)request.getAttribute("minimizeEvent");%>
<head>
<title>
Web Application Page
</title>
</head>
<body>
<p>
Listening for portlet A minimize event:<%=event%>
</p>
</body>
</netui:html>
図 7-4 は、エディタ内の完了した JSP ソースファイルを示しています。

チェックポイント : この時点で、producerWeb/WebContent フォルダに次のファイルが作成されています。
この例では、プロデューサ内のポートレットに追加されたバッキング ファイルを使用して、コンシューマ側で開始された onMinimize イベントを処理します。
| ヒント : | バッキング ファイルの詳細については、『ポートレット開発ガイド』を参照してください。 |
| ヒント : | または、フォルダの代わりに Java パッケージを作成することもできます。 |
backing というフォルダを作成します。
図 7-5 に示すように、backing フォルダが producerWeb/src の下に表示されます。
Listening」と入力し、[終了] をクリックします。新しい Java クラスがエディタに表示されます。 Listening.java のデフォルトのコンテンツを削除し、コード リスト 7-2 のコードを Listening.java にコピーします。 package backing;
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
import com.bea.netuix.events.Event;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Listening extends AbstractJspBacking
{
static final long serialVersionUID=1L;
private static boolean minimizeEventHandled = false;public void handlePortalEvent(HttpServletRequest request,
HttpServletResponse response, Event event)
{
minimizeEventHandled = true;
}public boolean preRender(HttpServletRequest request, HttpServletResponse
response)
{
if (minimizeEventHandled){
request.setAttribute("minimizeEvent","minimize event handled");
}else{
request.setAttribute("minimizeEvent",null);
}// reset
minimizeEventHandled = false;
return true;
}
}
ソースは、図 7-6 のようになります。

ここでは、前の節で作成したバッキング ファイルを bPortlet.portlet に追加します。以下を実行する :
bPortlet.portlet をダブルクリックして開きます。| ヒント : | プロパティ ビューが表示されない場合は、[ウィンドウ|ビューの表示|プロパティー] を選択します。ポートレット プロパティの編集の詳細については、『ポートレット開発ガイド』を参照してください。 |
backing.Listening」と入力して、〔Enter〕を押します。 | ヒント : | 場合によっては、値の列を広げて、[ポートレット バッキング ファイル] フィールドにテキストを入力する必要があります。 |
ここでは、イベント ハンドラを bPortlet.portlet に追加します。ハンドラは別のポートレットにより開始されたイベントをリスンして、そのイベントに対応するアクションを実行するようにコンフィグレーションされます。イベント ハンドラを追加するには、次の手順に従います。
図 7-11 に示すように、[ポートレット イベント ハンドラ] ダイアログ ボックスが展開して、詳しい入力ができるようになります。
ダイアログ ボックスが閉じて、図 7-12 に示すように、aPortlet_1 が [リスン先] リストと [ポートレット] フィールドに表示されます。ラベル aPortlet_1 は、イベント ハンドラがリスンするポートレットの定義ラベルです。
| ヒント : | 定義ラベルはポートレットに対するユニークな識別子です。デフォルト値が自動的に入力されますが、その値を変更できます。各ポートレットはユニークな値である必要があります。詳細については、『ポートレット開発ガイド』を参照してください。 |
handlePortalEvent」と入力します。このメソッドは、bPortlet に追加されるバッキング ファイルで定義されます。バッキング ファイルに対するソース コードは、コード リスト 7-2 に示したとおりです。
イベント ハンドラが追加されます。これで、[イベント ハンドラ] プロパティの [値] フィールドには [1 つのイベント ハンドラ] と表示されます。
チェックポイント : バッキング ファイルとイベント ハンドラを bPortlet に追加しました。ポートレットが aPortlet により開始された onMinimize イベントを受信するとき、イベント ハンドラはバッキング ファイルで handlePortalEvent() メソッドを起動するようにコンフィグレーションされます。次のタスクで、アプリケーションをテストして、ローカル環境で正しくポートレットが機能していることを確認します。次に、コンシューマ アプリケーションでリモート ポートレットを作成して、連合ポータル環境でポートレット間通信をテストします。
次の手順に従って、ipcLocal.portal というプロデューサ アプリケーションでポータルを作成します。
を右クリックして、[新規|ポータル] を選択します。[新しいポータル] ダイアログが表示されます。ipcLocal.portal」と入力し、[終了] をクリックします。ポータルが作成され、エディタに表示されます。aPortlet.portlet および bPortlet.portlet の両方をパッケージ エクスプローラからポータル レイアウト上へドラッグします。
図 7-16 に示すように、デフォルトのブラウザでポータルが表示されます。
2 つのローカル ポートレットを含むポータルを作成しました。bPortlet というポートレットをコンフィグレーションして、aPortlet というポートレットから開始された onMinimize イベントに応答しました。onMinimize イベントは、すべての WebLogic Portal ポートレットが開始できる標準イベントです。bPortlet が onMinimize イベントを受信すると、ポートレットにより表示されるテキストを変更するバッキング ファイル メソッドが呼び出されます。
次の手順で、ポートレット間通信を使用する連合ポータルを作成します。
この節では、コンシューマ アプリケーションに JSP ポートレットとリモート ポートレットの 2 つのポートレットを作成します。リモート ポートレットは、プロデューサで作成したポートレットの bPortlet.portlet を使用します。
bPrime.portlet」と入力し、[終了] をクリックします。 | 注意 : | http://host:port/producerWeb/producer?wsdl |
| 注意 : | 次に例を示します。 |
| 注意 : | http://localhost:7001/producerWeb/producer?wsdl |
| ヒント : | WSDL は Web Services Description Language の略で、プロデューサが提供するサービスを記述するために使用されます。詳細については、「連合ポータルのアーキテクチャ」を参照してください。 |
数秒後、ダイアログ ボックスが更新されて、図 7-18 に示すように、[プロデューサの詳細] を表示します。
パッケージ エクスプローラ内の consumerWeb/WebContent フォルダに bPrime.portlet としてリモート ポートレットが表示されます。
bPrime に変更します。そのためには、図 7-20 に示すように、ポートレットのプロパティ ビューの [タイトル] フィールドを編集します。 | ヒント : | (producerWeb/WebContent フォルダ内の) bPortlet に対するプロパティ ビューで、[表示キャッシュ可能] プロパティは false に設定されます。 |
2 つのコンシューマ ポートレットが完成し、リモート ポートレットとローカル ポートレットのポートレット間の通信を実行するために必要なすべてのコンポーネントを作成したことになります。次の手順では、コンシューマのポートレットをコンシューマのポータルに追加し、1 つのポートレットでイベントを発生させることで、もう 1 つのポートレットで反応を引き起こします。
この手順では、コンシューマ アプリケーションをテストして、aPortlet の最小化により bPrime (リモート ポートレット) のコンテンツが変化することを確認します。ポータルを作成し、「コンシューマ ポートレットの作成」で作成した 2 つのポートレットを追加します。アプリケーションを構築し、ブラウザにポータルを表示します。
次の手順に従って、ipcConsumer.portal というコンシューマ アプリケーションでポータルを作成します。
を右クリックして、[新規|ポータル] を選択します。[新しいポータル] ダイアログが表示されます。 ipcConsumer.portal」と入力し、[終了] をクリックします。ポータルが作成され、エディタに表示されます。
ユーザ側から見ると、コンシューマ ポータルは、すべてのポートレットがローカルであるかのように機能します。ユーザは、bPrime が、プロデューサ アプリケーションにホストされているリモート ポートレットであることに気付きません。コンシューマ ポートレットをテストするには、aPortlet を最小化します。リモート ポートレットの bPrime は、それに応じて、表示するテキストを変更します。
コード リスト 7-3 は、この章で既述のように、リモート ポートレットに対する .portlet ファイルの XML コンテンツからの引用の bPrime.portlet を表示します。要素の dispatchToRemotePortlet が、handleEvent 定義の一部として追加されます。この要素は、コンシューマがこのイベントをプロデューサにディスパッチする必要があることを示します。
...
<netuix:handleEvent event="onMinimize" eventLabel="handlePortalEvent1"
fromSelfInstanceOnly="false" onlyIfDisplayed="true"
sourceDefinitionLabels="aPortlet_1"><netuix:dispatchToRemotePortlet/></netuix:handleEvent>
...
カスタム イベントは、コンシューマ アプリケーションでデプロイされるポートレットと、リモート プロデューサ アプリケーション内のポートレット間でデータを転送するための推奨されている方法です。この節では、カスタム イベントを使用して、コンシューマからプロデューサへデータを転送するのに利用可能な技術について概説します。
| ヒント : | カスタム イベントを使用して、連合ポートレット間で、シリアライズ可能な Java オブジェクトまたは、com.bea.wsrp.ext.holders.XmlPayload を拡張するオブジェクトを転送できます。XmlPayload は、コンシューマとプロデューサ間で XML データを転送できるようにする WebLogic Portal クラスです。詳細については、「XML データの転送」を参照してください。XmlPayload インタフェースの詳細については、「Javadoc」の説明を参照してください。 |
図 7-24 は、この節で説明されている例のコンフィグレーションを示しています。

この節では、プロデューサ側のポートレットが、ペイロードを含むカスタム イベントを処理するようにコンフィグレーションする方法を説明します。この場合、ポートレットは、コード リスト 7-4 に示されるクラスに関連する Java ポートレットです。
import java.io.IOException;
import javax.portlet.PortletException;
import javax.portlet.GenericPortlet;
import javax.portlet.RenderResponse;
import javax.portlet.RenderRequest;
import javax.portlet.ActionResponse;
import javax.portlet.ActionRequest;
import com.bea.netuix.events.Event;
import com.bea.netuix.events.CustomEvent;
public class JavaPortlet extends GenericPortlet {
public void getMessage(ActionRequest request, ActionResponse response,
Event event) {
CustomEvent customEvent = (CustomEvent) event;
String message = (String) customEvent.getPayload();
response.setRenderParameter("message0", message);
}
public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
String message = request.getParameter("message0");
if (message == null) message = "";
response.setContentType("text/html");
response.getWriter().write("<p><b>Message From Consumer: </b>" +
message + "</p>");
}
}
getMessage() メソッドはカスタム イベント オブジェクトを取得します。このオブジェクトには、コンシューマからプロデューサへ送信されるペイロードが含まれています。次の手順で、カスタム イベントをリスンし、このイベントが受信されるときに getMessage() メソッドを呼び出すイベント ハンドラを作成します。この場合、カスタム イベントがカスタム アプリケーションにデプロイされるポートレットにより開始されます。
プロデューサ ポートレットにイベント ハンドラをコンフィグレーションするには、次の手順に従います。
| ヒント : | [ポートレット イベント ハンドラ] ダイアログ ボックスにより、ポートレットに対するイベント ハンドラを作成し、コンフィグレーションできます。イベント ハンドラはイベントをリスンして、イベントを受信したときに特定のアクションを実行します。 |
messageCustomEvent などの名前を入力します。
図 7-27 は、入力が完了したダイアログを示しています。
getMessage」と入力して [OK] をクリックします。
Java ポートレットは messageCustomEvent というカスタム イベントを処理するようにコンフィグレーションされています。このイベントを受信すると、ハンドラは JavaPortlet クラスで getMessage() メソッドを呼び出します。このイベント ハンドラは、プロデューサ上のこのポートレットと、リモート コンシューマ上のポートレットなどのその他のポートレットとの、ポートレット間通信のメカニズムを提供します。
コンシューマ ポートレットは、カスタム イベントを開始し、次にプロデューサで処理されるようにコンフィグレーションできます。コード リスト 7-5 は、コンシューマ側のローカル ポートレットで、カスタム イベントを開始し、ぺイロードをイベントに追加するために使用できるコードを示しています。
PortletBackingContext context = PortletBackingContext.getPortletBackingContext(getRequest());
context.fireCustomEvent("messageCustomEvent", form.getMessage());
return new Forward("success");
fireCustomEvent() メソッドの詳細については、「Javadoc」を参照してください。ポートレット開発とイベント処理の詳細については、『ポートレット開発ガイド』を参照してください。
|