WebLogic Portal での WSRP の使用
![]() |
![]() |
![]() |
![]() |
WebLogic Portal 8.1 Service Pack 4 では、プロデューサとコンシューマの間のポートレット間通信 (IPC) がサポートされます。つまり、コンシューマのローカル ポートレットが、プロデューサの結合されたポートレットでのイベントに反応できます。逆方向も可能です。たとえば、ローカル ポートレットを最小化すると、最小化イベントをリスンしていたリモート ポートレットのコンテンツが変更されます。
このドキュメントでは、WebLogic Portal で使用される IPC モデルについて説明し、WSRP 準拠のポートレットに IPC モデルを適用する方法を示します。内容は以下のとおりです。
注意 : サポートされるポートレットのリストについては、「WSRP の概要」の「WSRP がサポートするポートレット タイプ」を参照してください。
WebLogic Portal の以前のバージョンでは、 listenTo()
メソッドまたはバッキング ファイルをページ フロー ポートレットに追加する方法により、ポートレット間通信を確立することができました。WebLogic Portal 8.1 Service Pack 4 では、イベント ハンドラに基づく新しい IPC モデルが導入されています。イベント ハンドラは、ポータル内の他のポートレットに対して事前定義されたイベントをリスンし、そのイベントが発生したときにアクションを開始する Java オブジェクトです。
イベント ハンドラは、サブスクライブしたポートレットで発生するイベントを「リスン」して、特定のイベントが検出されるとアクションを開始します。イベント ハンドラがリスンして反応できるのは、次のタイプのイベントです。
イベント アクションは、発生するイベントのタイプによって異なります。ポータル イベントを除くすべてのイベントは、イベント ハンドラ ツールの [イベント] フィールドで指定できます。ポータル イベント ハンドラで処理できるイベントを表 3-1 に示します。
イベント ハンドラがホスト ポートレットでアクションを開始するのは、アプリケーションの別のポートレットでイベントを検出したときです。たとえば、ユーザが該当のポートレットを最小化すると、onMinimize と呼ばれるポータル イベントが発生し、イベントをリスンしているハンドラがアクションを開始して、ポートレットに追加されているバッキング ファイルを呼び出します。
表 3-2 に、使用可能なイベント アクションを示します。
|
WebLogic Workshop に含まれる IPC ツールを使用すると、イベント ハンドラの実装は比較的容易になります。このツールを起動するには、次の手順に従います。
図 3-1 に示すようにツールが表示されます。
ダイアログ ボックスが展開して、ハンドラの設定に使用できるフィールドが追加表示されます (図 3-2)。
イベント ハンドラを設定するすべてのプロセスは、このツールで処理できます。次の操作が必要です。
この節では、BEA WebLogic Workshop でイベント ハンドラ ツールを使用して、コンシューマとプロデューサの間にポーレット間通信を設定するプロセスについて説明します。コンシューマのローカル ポートレットを最小化すると、プロデューサから結合したポートレットでテキスト文字列が変更される単純な例を示します。
注意 : 現在、プロデューサのメタデータが変更された場合、その変更はコンシューマに通知されません。たとえば、ポートレットのリモート プロキシを作成した後に、プロデューサのポートレットにイベント ハンドラを追加した場合、リモート ポートレットでは変更を認識できないため、イベントが起動されません。適切な手順としては、コンシューマのリモート ポートレットを作成する前に、プロデューサのポートレットにイベント ハンドラを追加します。これは Web サービス全般の基本的な制限です。
この手順では、ドメインとエンタープライズ アプリケーションを作成し、エンタープライズ アプリケーション内に 2 つの Web アプリケーション (Web プロジェクト) を作成します。
注意 : この実習では、ドメインのルート ディレクトリを BEA_HOME¥user_projects¥domains
、アプリケーションとアプリケーションのすべてのコンポーネントのルート ディレクトリを BEA_HOME¥user_projects¥applications
にしてください。これらは、BEA WebLogic Platform をインストールしたときに作成されるデフォルトのディレクトリです。
ポータル アプリケーションを作成するには、次の手順に従います。
config.xml
を選択します。アプリケーションが正常に作成されると、図 3-3 のように [アプリケーション] パネルに表示されます。
図 3-3 作成されたプロデューサ ポータル アプリケーション
プロデューサとコンシューマのポータル Web アプリケーション (プロジェクト) を ipcWsrpTest ポータル アプリケーションに作成します。次の手順に従います。
アプリケーション ツリーで producerWeb が ipcWsrpTest アプリケーションの下に表示されます (図 3-4)。
図 3-4 プロデューサに追加されたポータル Web アプリケーション (プロジェクト)
Web アプリケーションが正常に作成されると、図 3-5 のように [アプリケーション] パネルの ipcWsrpTest の下に表示されます。
図 3-5 ポータル アプリケーションに追加されたポータル Web アプリケーション (プロジェクト)
「手順 1 : 環境の設定」が終了した時点で、ドメイン、ポータル アプリケーション、2 つのポータル Web アプリケーション producerWeb (プロデューサ) および consumerWeb (コンシューマ) が作成されています。図 3-6 に示すようにファイル システムで BEA_HOME¥user_projects¥
を調べることで、これらのコンポーネントを確認できます。
図 3-6 ファイル システムでの新しいドメインとアプリケーションの表示
この手順では、プロデューサ側に 2 つの JSP ファイルと、それぞれのファイルを表示するための JSP ポートレットを作成します。また、2 つのポートレット間の通信を実現するために必要な指示を含むバッキング ファイルも作成し (バッキング ファイルの詳細については「バッキング ファイルについて」を参照)、一方のポートレットにイベント ハンドラを追加します。ポートレットを作成して、バッキング ファイルを追加した後で、アプリケーションをブラウザでテストします。
注意 : この手順を進める前に、WebLogic Workshop が実行中であることと、Web アプリケーション ノード [producerWeb] が展開していることを確認します。
プロデューサ ポートレットによって表示する JSP ファイルを作成するには、次の手順に従います。
JSP ファイルがデザイン ビューに表示されます (図 3-7)。
テキストの周囲にボックスが表示され、プロパティ エディタの [General] の下に [innerText] フィールドが表示されます (図 3-8)。
図 3-8 [プロパティ] メニューの [inner Text] フィールド
ダイアログ ボックスが閉じ、図 3-9 のように Minimize Me!!! が [innerText] フィールドとデザイン ビューに表示されます。
aPortlet.jsp
] を右クリックし、コンテキスト メニューから [ポートレットの生成...] を選択します (図 3-10)。[ポートレットの詳細] ダイアログ ボックス (図 3-11) が表示されます。/aPortlet.jsp
が [コンテンツ URI] フィールドに表示されていることを確認します。
図 3-11 aPortlet の [ポートレットの詳細] ダイアログ ボックス
JSP コードが表示されます (図 3-12)。
<netui:html>
から </netui:html>
までのコードを置換します。このコードによって、後の手順で作成して追加するバッキング ファイルのイベント処理が表示されます。コード リスト 3-1 bPortlet.jsp の新しい JSP コード
<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>
ソースは、図 3-13 の例のようになります。
図 3-14 のようにフォルダ backing
が WEB-INF/src
の下に表示されます。
図 3-14 WEB-INF/src の下の backing フォルダ
新しい Java クラスのソース ビューが表示されます (図 3-15)。
図 3-15 Listening.java ソース ファイル
Listening.java
にコピーします。 コード リスト 3-2 listening.java のバッキング ファイル コード
package backing;
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
import com.bea.netuix.events.Event;
import com.bea.netuix.events.GenericEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Listening extends AbstractJspBacking
{
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;
}
}
ソースは、図 3-16 のようになります。
図 3-16 バッキング ファイル コードが更新された Listening.java
ここでは、「バッキング ファイルの作成」で作成したバッキング ファイルを bPortlet に追加します。次の手順を実行します。
backing.Listening
と入力し、〔Tab〕を押します。図 3-17 プロパティ エディタでのバッキング ファイルの追加
ここでは、イベント ハンドラを bPortlet に追加します。特定のポートレットのイベントをリスンし、イベントに反応してアクションを開始するように、このハンドラを設定します。イベント ハンドラを追加するには、次の手順に従います。
注意 : bPortlet.portlet
が WebLogic Workshop に表示されている必要があります。表示されていない場合は、[アプリケーション] パネルで producerWeb の下にある bPortlet.portlet を見つけてダブルクリックします。
[ポートレット イベント ハンドラ] ダイアログ ボックス (図 3-18) が表示されます。
図 3-18 [ポートレット イベント ハンドラ] ダイアログ ボックス
[ポートレット イベント ハンドラ] ダイアログ ボックスが展開し、詳細を入力できるようになります (図 3-19)。
図 3-19 展開した [ポートレット イベント ハンドラ] ダイアログ ボックス
[開く] ダイアログ ボックスが閉じ、portlet_1 が [リスン先] リストと [ポートレット] フィールドに表示されます (図 3-20)。portlet_1 は、イベント ハンドラがリスンするポートレットの定義ラベルです。
図 3-23 のように [BackingFile メソッドの呼び出し] が [イベント] リストに [ポータル イベントの処理] の子として表示されます。
handlePortalEvent
を選択します (図 3-24)。注意 : 開始する前に、すべてのファイルを保存したことを確認します。
この手順では、「手順 1 : 環境の設定」で作成したポータル アプリケーション コンポーネントに、プロデューサで構築した 2 つの JSP ポートレットを追加しました。1 つ目のポートレット aPortlet はごく単純ですが、2 つ目のポートレット bPortlet は、複雑な JSP ファイルを表示し、バッキング ファイルを利用し、ポータル イベント ハンドラを含みます。プロデューサ アプリケーションのテストでは、aPortlet でイベントが発生したときに 2 つのポートレットが通信する様子を確認しました。これは、ローカル ポートレット間通信と呼ばれます。
この手順では、コンシューマに 2 つのポートレット (JSP ポートレットとリモート ポートレット) を作成します。「手順 2 : プロデューサ ポートレットの作成」と同じく、JSP ポートレットは aPortlet.jsp
ファイルを表示し、リモート ポートレットは「JSP ファイルとポートレットの作成」で作成した bPortlet を消費します。
aPortlet.jsp
を次のディレクトリの間でコピーします。
BEA_HOME¥user_projects¥applications¥ipcWsrpTest¥producerWeb
BEA_HOME¥user_projects¥applications¥ipcWsrpTest¥consumerWeb
注意 : WebLogic Workshop ではフォルダ間のファイルのコピーができないため、この手順は実習の効率を上げるために必要です。aPortlet.jsp
を producerWeb から consumerWeb にコピーしない場合は、「JSP ファイルとポートレットの作成」の手順に従ってファイルを最初から作成します。
/aPortlet.jsp
が [コンテンツ URI] フィールドにすでに入力された状態で [ポートレットの詳細] ダイアログ ボックスが表示されます (図 3-28)。
WebLogic Workshop が更新され、図 3-29 に示すように新しいポートレット レイアウトが表示されます。
このリモート ポートレットを作成するには、次の手順に従います。
ポートレット ウィザードが起動し、[ポートレット タイプの選択] ダイアログ ボックスが表示されます (図 3-30)。
図 3-30 [ポートレット タイプの選択] ダイアログ ボックス
[プロデューサの検索] または [プロデューサの選択] ダイアログ ボックスが表示されます (図 3-31)。
図 3-31 [プロデューサの検索] または [プロデューサの選択] ダイアログ ボックス
http://localhost:7001/producerWeb/producer?WSDL
[登録] ダイアログ ボックス (図 3-32) が表示されます。
[リストからポートレットを選択] ダイアログ ボックスが表示されます (図 3-33)。
図 3-33 [リストからポートレットを選択] ダイアログ ボックス
図 3-34 [表示キャッシュ可能] の [false] への設定
2 つのコンシューマ ポートレットが完成し、リモート ポートレットとローカル ポートレットのポートレット間通信を実行するために必要なすべてのコンポーネントを作成したことになります。次の手順では、コンシューマのポートレットをコンシューマのポータルに追加し、1 つのポートレットでイベントを発生させることで、もう 1 つのポートレットで反応を引き起こします。
この手順では、コンシューマ アプリケーションをテストして、aPortlet の最小化により bPrime のコンテンツが変化することを確認します。ポータルを作成し、「手順 3 : コンシューマ ポートレットの作成」で作成した 2 つのポートレットを追加します。このアプリケーションを構築し、ブラウザでポータルを表示することができます。
アプリケーションをテストするためのポータルを作成するには、次の手順に従います。
構築が終了したら、次の手順に従って、aPortlet のイベントが bPortlet のコンテンツに影響を及ぼすことを確認します。
ブラウザが開き、ipcConsumer ポータルが表示されます (図 3-36)。
図 3-36 ブラウザで表示した ipcConsumer ポータル
aPortlet が最小化され、図 3-37 に示すように bPortlet のコンテンツが変化します。
図 3-37 最小化イベント後のブラウザの ipcConsumer ポータル
1 つのイベントに、プロデューサで処理する必要がある 1 つ以上のイベントが含まれる場合 (たとえば、netuix:invokePageFlowAction
、netuix:invokeStrutsAction
、netuix:invokeJavaPortletMethod
、および netuix:invokeBackingFileMethod
)、プロデューサによって dispatchToRemotePortlet()
メソッドが追加されます。この要素は、コンシューマがこのイベントをプロデューサにディスパッチする必要があることを指示します。
「WSRP での IPC の実装 : 例」で作成したポータルでは、2 つのポートレット間の通信を実現するためにバッキング ファイルが使用されます。バッキング ファイルを使用すると、Java クラスを実装または拡張し、ポータル コントロールを表示する前の事前処理 (認証など) を可能にすることによって、ポートレットに対してプログラム的に機能を追加できます。
バッキング ファイルは、com.bea.netuix.servlets.controls.content.backing.JspBacking インタフェースの実装、または com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking インタフェース抽象クラスの拡張を行う単純な Java クラスです。インタフェースのメソッドは、コントロール ライフサイクル メソッド (「バッキング ファイルの実行方法」を参照) に類似しており、コントロール ライフサイクル メソッドの呼び出しと同時に呼び出されます。
現時点では、以下のコントロールがバッキング ファイルをサポートしています。
すべてのバッキング ファイルは、JSP 呼び出しの前後に実行されます。ライフサイクルの中で、各バッキング ファイルでは以下のメソッドが呼び出されます。
init()
メソッドが呼び出されます。このメソッドは、コントロール (ポータル、ページ、ブック、デスクトップ) がアクティブなページ上にあるかないかにかかわらず、呼び出されます。 handlePostbackData()
メソッドが呼び出されます。つまり、ポートレットがいずれかのページ上にあっても、その親ページがアクティブでない場合は、このメソッドは呼び出されません。バッキング ファイルの新しいインスタンスは要求ごとに作成されるため、スレッドの安全性の問題を心配する必要はありません。新しい Java VM は、有効期限が短いオブジェクト用に特別に調整されているため、以前のようなパフォーマンスの問題は発生しません。さらに、JspContent
コントロールでサポートされる特殊なバッキング ファイルを使用すると、バッキング ファイルがスレッド セーフかどうかを指定できます。この値を true
に設定すると、バッキング ファイルのインスタンスが 1 つだけ作成され、すべての要求で共有されます。
![]() ![]() |
![]() |
![]() |