![]() ![]() ![]() ![]() |
IPC (ポートレット間通信) によって、複数のポートレットがデータを使用したり、データに反応できます。たとえば、注文 ID や顧客 ID などの共通データ要素が複数のプロジェクトにわたって使用される、セルフサービスまたはセールスの実装で IPC を使用します。WebLogic Portal がサポートするすべてのポートレット タイプは IPC を実装できます。IPC の例を以下に示します。
WebLogic Portal の IPC は、イベント ハンドラの使用に基づいています。イベント ハンドラは、ポータル内の他のポートレットに対して事前定義されたイベントをリスンし、そのイベントが発生したときにアクションを開始するオブジェクトです。Workshop for WebLogic インタフェース、または WebLogic Portal API を使用してポートレット間通信を設定できます。
この章には、初期状態のポータル イベント ハンドラを使用してポートレット間通信を確立するチュートリアル ベースの例 (IPC の基本的な例) が記載されています。この例を通じて、イベント ハンドラについて理解し、一般的な使用方法を学ぶことができます。
この例は、単一のポータル Web プロジェクト内でのポートレット間通信に特化しています。WSRP (連合ポータル) を使用した IPC の確立の詳細については、『連合ポータル ガイド』を参照してください。
注意 : | IPC はポートレットの非同期表示と互換性がありません。ただし、一部の状況においては双方を共存させるための解決策が存在します。詳細については、「コンテンツの非同期表示と IPC」を参照してください。 |
IPC の動作は、ポートレット定義ラベルに基づいています。つまり、同じ .portlet
ファイルのすべてのポートレット インスタンスは同じイベントに応答します。イベント ハンドラ オプション Only If Displayed および From Self Instance Only を使用して、同じ .portlet
ファイルのインスタンスを差別化できます。これらのオプションの詳細については、「ポートレット イベント ハンドラ ウィザード - [ハンドラを追加] フィールドの説明」を参照してください。
ポートレット イベント (ページ フロー イベントとは異なる) を使用すると、ポートレット間の通信が可能になります。一方のポートレットでイベントを作成し、他方のポートレットでそのイベントをリスンできます。ポートレット イベントは、ペイロードと呼ばれる付随データを伝達できます。ペイロードはシリアライズ可能な Java オブジェクトです。
イベント ハンドラは、サブスクライブしたポートレットで発生するイベントをリスンして、特定のイベントが検出されると 1 つ以上のアクションを開始します。イベント ハンドラ タグは、<portlet>
タグの子です。ポートレットは、イベントをいくつでも関連付けることができます。以下のイベント ハンドラは WebLogic Portal で利用できます。
他のポートレットに通知したり (カスタム イベントを発生させる)、バッキング ファイル コールバック メソッドを呼び出すなど、イベントに応答してアクションを実行するページ フロー イベント ハンドラを (そのポートレット上で) 定義できます。
カスタム イベント ハンドラはイベントによってトリガされ、開発者が定義したペイロードを渡したり、定義済みのアクションを開始したりできます。カスタム イベント ハンドラは、宣言によってトリガするか、バッキング ファイル内のメソッドの呼び出しに基づいて実行できます。バッキング ファイルのメソッドでイベントを処理するように指定することが可能です。
注意 : | Java Server Faces イベント ハンドラは、既存の宣言型イベント処理メカニズムを使用する初期状態の WebLogic Portal ではサポートされません。ただし、JSF コンテンツを含む <netuix:portlet/> とバッキング ファイルを関連付けできます。バッキング ファイルは、WebLogic Portal から適切な JSF Bean (「管理対象 Bean」) にイベントを変換できます。たとえばブレッドクラム スタイルのイベントの場合、JSF portlet_1 (バッキング ファイルを含む) には、一部のユーザ データが送信されるフォームがあります。JSF ポートレット 1 のバッキング ファイルは、リクエストからデータを取得して、JSF 管理対象 Bean 内のリストを更新する。次に、JSF portlet_2 は、JSF 管理対象 Bean のリストにバインドされた HTML テーブル (JSF タグを使用) データを通じて、このデータのリストを表示します。 |
注意 : | JSF から WebLogic Portal にイベントを送信するには、アクション段階で PortletBackingContext を使用して JSF アプリケーションから WebLogic Portal にイベントを送信することができます。このプロセスの詳細は、将来的なドキュメント リリースまたは dev2dev の記事で紹介します。 |
イベント属性値 myEvent の汎用イベント ハンドラは、以下の条件でトリガされます。
汎用イベント ハンドラを使用すると、ポータル設計をより効果的に分離できます。これは、アプリケーションがイベントのソースまたはタイプを把握しなくてもよいためです。イベントの処理方法に影響を与えずに、ポートレット タイプを変更できます (たとえば、ページ フロー ポートレットから JSP ポートレットに変更し、カスタム イベントを開始するバッキング ファイルを追加する)。
イベント アクションは、発生するイベントのタイプによって異なります。ポータル イベントを除くすべてのイベントは、ポートレット イベント ハンドラ ウィザードの [イベント] フィールドで指定できます。詳細については、「ポートレット イベント ハンドラ ウィザード リファレンス」を参照してください。表 7-1 に、ポータルのイベント ハンドラで使用可能なイベントを示します。
|
イベント ハンドラがホスト ポートレットでアクションを開始するのは、アプリケーションの別のポートレットでイベントを検出したときです (ページ フロー ポートレットの場合は同じポートレットの可能性もあります)。たとえば、ユーザが該当するポートレットを最小化すると、onMinimize というポータル イベントが発生し、イベントをリスンしているハンドラがアクションを開始して、ポートレットに追加されているバッキング ファイルを呼び出します。
表 7-2 に、ポートレットで使用可能なイベント アクションを示します。
Workshop for WebLogic に用意されているポートレット イベント ハンドラ ウィザードを使用すると、プログラムを記述しなくても各種のイベント ハンドラやアクションを実装できます。このウィザードを使用してイベント ハンドラを設定する手順の概要を次に示します。
以下の節では、ウィザードのダイアログと、ダイアログの各フィールドで指定する情報について説明します。
イベント ハンドラ ウィザードを使用する際の具体的な手順の例については、「IPC の基本的な例」を参照してください。
Workshop for WebLogic でポートレットを開き、プロパティ ビューの [イベント ハンドラ] の隣の省略記号ボタン をクリックするとウィザードが開きます。
注意 : | イベント ハンドラが追加されていない場合、[イベント ハンドラ] フィールドはその旨を通知します。イベント ハンドラが追加されている場合は、このフィールドには現在存在するイベント ハンドラ数が表示されます。 |
図 7-1 に示すように、ウィザードが表示されます。
[ハンドラを追加] をクリックすると、イベント ハンドラのドロップダウン メニューでハンドラを選択できます。アクションを追加するには、[アクションを追加] をクリックして、イベント アクションのドロップダウン メニューを開きます。
選択した項目に応じてダイアログ ボックスが展開して、ハンドラまたはアクションの設定に使用できるフィールドが追加表示されます。図 7-2 に、イベント ハンドラを追加するために展開したダイアログの例を示します。
表 7-3 には、[ハンドラを追加] ダイアログのフィールドと、選択した項目がどのようにイベントの動作に影響を及ぼすのかが記載されています。
アクションに関して利用できるフィールドは、選択したアクションのタイプによって異なります。表 7-4 には、展開する [アクションを追加] ダイアログのフィールドと、選択した項目がどのようにアクションの動作に影響を及ぼすのかが記載されています。
この章で説明するポートレット間通信を実践する前に、ドメイン、ポータル EAR プロジェクト、ポータル Web プロジェクト、Datasync プロジェクト、およびポータルから構成される既存のポータル開発環境を準備する必要があります。前提条件タスクを完了させるには、表 7-5 を使用して必要な値を入力し、『WebLogic Portal 入門』チュートリアルで説明するタスクを実行します。
図 7-3 は、前提条件タスクを完了させた後のワークベンチの状態を示しています。
この実習では、個々のページ フロー、ポートレット、JSP、およびバッキング ファイルを作成して、ポータル プロジェクト内のポートレット間通信を確立します。その後、作成したポートレットをポータルに追加し、プロジェクトをテストして、通信が正しく行われることを確認します。
この節では、Workshop for WebLogic のポータル イベント ハンドラ ウィザードを使用して、2 つのポートレット間にポーレット間通信を設定するプロセスについて説明します。1 つのポートレットを最小化すると、ポータルの別のポートレットでテキスト文字列が変更される単純な例を示します。
この例を実行するには、ポータル イベント ハンドラ ウィザードおよびバッキング ファイルについて理解する必要があります。ウィザードの詳細については、「ポートレット イベント ハンドラ ウィザード リファレンス」を参照してください。バッキング ファイルの詳細については、「バッキング ファイル」を参照してください。
この節では、2 つの JSP ファイルと、それぞれのファイルを表示するための JSP ポートレットを作成します。また、2 つのポートレット間の通信を実現するために必要な指示を含むバッキング ファイルも作成し、一方のポートレットにイベント ハンドラを追加します。ポートレットを作成して、バッキング ファイルを追加した後で、プロジェクトをブラウザでテストします。
注意 : | この手順を進める前に、Workshop for WebLogic が実行中であることと、ipcWebProject ノードが展開していることを確認します。 |
ポートレットによって表示する JSP ファイルを作成するには、次の手順に従います。
index.jsp
をダブルクリックします。
index.jsp
がワークベンチ エディタで開き、ソース コードが表示されます。
aPortlet.jsp
という名前を付けて保存します。aPortlet.jsp
を右クリックし、コンテキスト メニューから [ポートレットの生成] を選択します。
[ポートレットの詳細] ダイアログが表示されます (図 7-5)。[コンテンツ パス] フィールドに「aPortlet.jsp
」が入力されます。
aPortlet.portlet
が [パッケージ・エクスプローラ] ビューの ipcWebProject/WebContent
フォルダに表示されます。
bPortlet.jsp
に変更します。 bPortlet.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-6 の例のようになります。
bPortlet.jsp
ファイルからポートレットを生成します。
チェックポイント : この段階で ipcWebProject/WebContent
フォルダには、aPortlet.jsp
、aPortlet.portlet
、bPortlet.jsp
、および bPortlet.portlet
ファイルが含まれます。
ipcWebProject
で、[src
] フォルダを右クリックし、メニューから [新規|ポータル] を選択する。 backing
というフォルダを作成します。
図 7-7 のようにフォルダ backing
が ipcWebProject/src
の下に表示されます。
backing
] フォルダを右クリックし、[新規|その他] を選択する。
図 7-8 に示すように、[新規 Java クラス] ダイアログが表示されます。[ソース フォルダー] フィールドにデフォルト パスが自動的に入力されます。値を変更する必要はありません。[パッケージ] フィールドに backing
が自動的に入力されます。値を変更する必要はありません。
Listening
」と入力し、[終了] をクリックします。Listening.java
のデフォルトの内容をすべて削除して、コード リスト 7-10 のコードをファイルにコピーします。
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
import com.bea.netuix.servlets.controls.portlet.backing.PortletBackingContext;
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;
public void handlePortalEvent(HttpServletRequest request,
HttpServletResponse response, Event event)
{
String attributeId= this.getPortletInstanceLabel(request) + "_minimizeEventHandled";
// NB: Use the HttpSession to pass data between lifecycle phases
// (that is, to the pre-render phase). Passing data between
// backing file callback methods using the HttpRequest or static
// instance variables should be avoided.
// The portlet instance label is used to create a unique
// attribute name for the session attribute.
request.getSession().setAttribute(attributeId, "minimized!");
}
public boolean preRender(HttpServletRequest request, HttpServletResponse
response)
{
String attributeId= this.getPortletInstanceLabel(request) +
"_minimizeEventHandled";
if (request.getSession().getAttribute(attributeId) != null)
{
// Reset the session flag
request.getSession().removeAttribute(attributeId);
// Pass minimize event notification to the JSP via the request.
request.setAttribute("minimizeEvent", "Minimize event handled");
}
else
{
request.setAttribute("minimizeEvent", null);
}
private String getPortletInstanceLabel(HttpServletRequest request)
{
PortletBackingContext context=
PortletBackingContext.getPortletBackingContext(request);
return context.getInstanceLabel();
}
}
図 7-9 は、コードを貼り付けた後の Listening.java ファイルの上部の状態を示しています。
ここでは、前の節で作成したバッキング ファイルを bPortlet.portlet
に追加します。次の手順を実行します。
bPortlet.portlet
をダブルクリックして開きます。ヒント : | プロパティ ビューはポータル パースペクティブのデフォルト ビューです。表示されていない場合、[ウィンドウ|ビューの表示|プロパティ] を選択します。 |
backing.Listening
」と入力します。
ここでは、イベント ハンドラを bPortlet.portlet
に追加します。特定のポートレットのイベントをリスンし、イベントに反応してアクションを開始するように、このハンドラを設定します。イベント ハンドラを追加するには、次の手順に従います。
注意 : | bPortlet.portlet が Workshop for WebLogic エディタに表示されている必要があります。表示されていない場合は、アプリケーション パネルで producerWeb/WebContent フォルダを見つけてダブルクリックします。 |
図 7-14 に示すように、[ポートレット イベント ハンドラ] ダイアログ ボックスが展開して詳細を入力できるようになります。
aPortlet.portlet
をクリックして、[OK] をクリックします。
ダイアログ ボックスが閉じて、図 7-15 に示すように aPortlet_1 が [リスン先 (ポートレット):] リストおよび [ポートレット] フィールドに表示されます。ラベル aPortlet_1 は、イベント ハンドラがリスンするポートレットの定義ラベルです。
[BackingFile メソッドの呼び出し] 項目は、WebLogic Portal がバッキング ファイルを検出しない場合は表示されません。
このフィールドのドロップダウン メニューには、過去に入力した値を表示できます。
イベント ハンドラが追加されます。これで、[イベント ハンドラ] プロパティの [値] フィールドには [1 つのイベント ハンドラ
] と表示されます。
注意 : | 開始する前に、すべてのファイルを保存したことを確認します。 |
ipcPortal.portal
を選択して、ワークベンチ エディタで表示します。 aPortlet.portlet
および bPortlet.portlet
を [パッケージ・エクスプローラ] ビューからポータル レイアウトにドラッグします。ipcPortal.portal
を右クリックし、[実行|サーバで実行] を選択します。
サーバが起動してアプリケーションがサーバに公開されるまで待機します。ポータルがブラウザに表示されます (図 7-19)。
図 7-20 に示すように、bPortlet のコンテンツが変わる点に注意してください。
この例では、環境を設定し、ローカル ポータルに 2 つの JSP ポートレットを追加しました。1 つ目のポートレット aPortlet はごく単純ですが、2 つ目のポートレット bPortlet は、複雑な JSP ファイルを表示し、バッキング ファイルを利用し、ポータル イベント ハンドラを含みます。ポートレット間の通信テストでは、aPortlet でイベントが発生したときに bPortlet が変化する様子を確認しました。これは、ローカル ポートレット間通信と呼ばれます。
以下の節では、ポートレット間通信を実装する際の特別な考慮事項について説明します。
コンテンツの非同期表示が有効な場合は IPC はサポートされませんが、WebLogic Portal には、ポータル環境でのこれらの 2 つのメカニズムの共存を許可するいくつかの機能があります。また、「コンテンツの非同期表示と IPC」で説明するメカニズムを使用して、単一のリクエストの非同期表示を無効にできます。
WebLogic Portal WSRP を使用する場合は、汎用イベント ハンドラを使用します。[汎用イベントの処理] を選択して [アクションを追加] を選択し、[ウィンドウ モード|状態] を選択します。次に、onMinimize
など、イベント名を手動で入力します。
リスナ ポートレットを設定する際には、[リスン先] フィールドの設定に注意します。コンシューマで使用したポートレット定義は、WSRP ポートレットのポートレット定義と必ず一致させる必要があります。たとえば、「portlet_2」が「portlet_1」をリスンする場合、「portlet_1」に対応する WSRP ポートレット、つまり、コンシューマのプロキシでは、ポートレット定義ラベルを「portlet_1」に設定する必要があります。WSRP と IPC の使用の詳細については、『連合ポータル ガイド』を参照してください。
![]() ![]() ![]() |