ポートレット間通信の確立
![]() |
![]() |
![]() |
![]() |
「IPC の確立 : 単純な例」では、ポータル フレームワーク イベントを使用してポートレット間通信を確立する非常に基本的な例を示しました。通常、アプリケーションでは、もっと複雑な IPC を確立します。たとえば、「カスタム」イベントと呼ばれる、WebLogic Portal に事前に定義されていないイベントや、「ページ フロー」イベントと呼ばれる、ページ フロー アクションから生じるイベントを使用することもできます。WebLogic Portal 8.1 Service Pack 4 以降では、イベント ハンドラを使用してこの 2 つのタイプのポートレット間通信を確立できます。
カスタム イベントは、開発者がアプリケーションに定義するイベントです。つまり、すぐに利用できる状態で WebLogic Portal 8.1 で提供されているイベントではありません。カスタム イベントを使用して、開発者が定義したペイロードを渡したり、その他の定義済みのアクションを実行したりできます。カスタム イベントは、宣言によって実行するか、バッキング ファイル内のメソッドの呼び出しに基づいて実行できます。ユーザは、バッキング ファイルのメソッドでイベントを処理するように指定できます。
ページ フロー イベントは、ページ フローのライフサイクル中に発生し、別のポートレットでアクションを開始できるイベントです。たとえば、ページ フローを使用するログイン ポートレットを介してユーザが認証情報を送信すると、ログイン フォームの送信を合図として、リスン中の他のポートレットがさまざまなデータベースにクエリを実行し、その認証済みユーザとそのポートレットに固有の情報が返されます。
次の実習では、カスタム イベントとページ フロー イベントを使用するポータル デスクトップを作成して、ポートレット間通信を確立します。実習が完了すると、ポータル内に次の 3 つのポートレットが作成されます。
完成したポータルを実行すると、図 4-1 のような画面が最初に表示されます。
顧客ルックアップ ポートレットから顧客名を送信すると、ポータルの表示は図 4-2 のようになります。
この実習では、3 つのポートレットのすべてがバッキング ファイルを使用してアクションを開始して、ポートレット間の通信を確立および実行します。ポートレットにバッキング ファイルを追加すると、イベント ハンドラ ツールで [BackingFile メソッドの呼び出し] アクションを選択できるようになります。[BackingFile メソッドの呼び出し] アクションを選択したら、[メソッド] ドロップダウン リストで、バッキング ファイルの適切なメソッドを選択します。リスン中のカスタム イベントがポートレットで検出されると、追加されたバッキング ファイルが呼び出され、指定されたメソッドが実行されます。バッキング ファイルには複数のメソッドを定義でき、イベント ハンドラからこれらのすべてのメソッドを使用できます。
バッキング ファイルとは、com.bea.netuix.servlets.controls.content.backing.JspBacking インタフェースの実装または com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking
インタフェース抽象クラスの拡張を行う、Java クラスです。このファイルを使用すると、ポートレットにプログラミングによる機能を追加でき、ポータル コントロールを表示する前の事前処理 (認証など) が可能になる。この演習を始める前に、「バッキング ファイルについて」を参照することをお勧めします。
開発環境を設定していない場合は、「サンプルの設定」を参照して、次の手順に従ってください。
上記の手順を実行すると、ipcDomain というポータル ドメインと、ipcTest というポータル アプリケーションが作成されます。
この実習で入力する多くのテキストは、IPC を確立するためのさまざまな JPF、JSP、およびバッキング ファイル内の大文字と小文字が区別される名前を参照するため、すべてのテキストを手順で表示されたとおりに正確に入力してください。
次に、ファイル ツリーにいくつかの追加のフォルダを作成する必要があります。これらのディレクトリには、IPC を正しく確立するために必要なポートレットとそのコンポーネント (JSP やページ フロー ファイルなど) が保存されます。
注意 : ポータルごとに別々のフォルダを作成するかどうかは任意ですが、個別のフォルダを作成すると、アプリケーションを効率的に整理し、アプリケーション ルートでの混乱が軽減されるという効果があるので、ベスト プラクティスとして推奨されています。
アプリケーションに必要なフォルダを作成するには、次の手順に従います。
[新しいフォルダの作成] ダイアログ ボックス (図 4-4) が表示されます。
ファイル ツリーのプロジェクト ルートに、Customer_Lookup フォルダが表示されます (図 4-5)。
図 4-5 Customer_Lookup フォルダが追加されたファイル ツリー
フォルダの作成が完了すると、プロジェクト ルートは図 4-6 の例のようになります。
backing
フォルダを作成します。このフォルダに、これから作成するバッキング ファイルを保存します。バッキング フォルダを作成するには、ipcTest/WEB-INF/src
フォルダを開いて、1 と 2 の手順を繰り返します (図 4-7)。図 4-7 ipcTest/WEB-INF/src フォルダを開く
ファイル ツリーの WEB-INF/src
の下に、backing フォルダが表示されます (図 4-8)。
図 4-8 backing フォルダが追加されたファイル ツリー
手順 2 の完了によって、アプリケーションに必要なすべての新しいフォルダが追加されました。後の手順でページ フローを作成すると、ページ フローが保存されたフォルダの下に、各ページ フローの追加のフォルダが作成されます。
バッキング ファイルは、JspBacking インタフェースを実装する簡単な Java クラスです。バッキング ファイルは、JSP と連動して動作します。JSP を使用してプレゼンテーション ロジックをコード化し、バッキング ファイルを使用して簡単なビジネス ロジックをコード化します。JSP が実行される前に、常にバッキング ファイルが実行されます。バッキング ファイルのライフサイクルでは、すべてのオブジェクトに対して 4 つのメソッドが順番に実行されます。BackingContext から基になるオブジェクトを生じることができます。バッキング ファイルから BackingContext を使用し、JSP から PresentationContext を使用します。前に説明したように、バッキング ファイルは WEB-INF/src/backing
に格納する必要があります。
この手順では、アプリケーションの各ポートレット用に 1 つずつ、合わせて 3 つのバッキング ファイルを作成します。ファイルを作成する時間を節約するために、このドキュメントには必要なコードがあらかじめ準備されています。オンラインで参照中の場合は、コードを切り取って適切な空のファイルに貼り付けることができます。このドキュメントの印刷版または PDF バージョンを使用しているためオンライン (HTML) コピーを取得できない場合は、コード サンプルに表示されているとおりに正確にコードを入力してください。
この実習のバッキング ファイルを作成するには、次の手順に従います。
[新しいファイル] ダイアログ ボックス (図 4-10) が表示されます。
注意 : 左側のペインで [Common] が選択され、右側のペインで [Java Class] が選択されている必要があります。選択されていない場合は、ここで選択します。
図 4-10 [Common] と [Java Class] が選択された [新しいファイル] ダイアログ ボックス
WEB-INF/src/backing
の下に、FindCustomerBacking.java
が表示されます (図 4-11)。
図 4-11 WEB-INF/src/backing の下の FindCustomerBacking.java
WebLogic Workshop にファイル エディタが表示されます (図 4-12)。
図 4-12 ファイル エディタのバッキング ファイル テンプレート
コード リスト 4-1 FindCustomerBacking.java サンプル コード
package backing;
import com.bea.netuix.servlets.controls.content.backing.JspBacking;
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
import com.bea.netuix.events.Event;
import com.bea.netuix.events.GenericEvent;
import com.bea.netuix.events.PageFlowEvent;
import com.bea.netuix.servlets.controls.portlet.backing.PortletBackingContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FindCustomerBacking extends AbstractJspBacking
{
public void foundCustomer(HttpServletRequest request, HttpServletResponse
response, Event event)
{
// フォームの送信から結果を取得し、リモート IPC の中に挿入します
PortletBackingContext context =
PortletBackingContext.getPortletBackingContext(request);
String message = request.getParameter(context.getInstanceLabel() +
"{actionForm.name}");
context.fireCustomEvent("myCustomEvent", message);
}
}
コード リスト 4-2 ListenCustomerName.java コード サンプル
package backing;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bea.netuix.events.Event;
import com.bea.netuix.events.CustomEvent;
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
public class ListenCustomerName extends AbstractJspBacking
{
public void listenCustomerName( HttpServletRequest request,
HttpServletResponse response, Event event)
{
CustomEvent customEvent = (CustomEvent) event;
String message = (String) customEvent.getPayload();
HttpSession mySession = request.getSession();
mySession.setAttribute("customerName", message);
}
}
コード リスト 4-3 ReceiveCustomerInfo.java コード サンプル
package backing;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bea.netuix.events.Event;
import com.bea.netuix.events.CustomEvent;
import com.bea.netuix.servlets.controls.content.backing.AbstractJspBacking;
public class ReceiveCustomerInfo extends AbstractJspBacking
{
public void listenCustomerName( HttpServletRequest request,
HttpServletResponse response, Event event)
{
CustomEvent customEvent = (CustomEvent) event;
String message = (String) customEvent.getPayload();
HttpSession mySession = request.getSession();
mySession.setAttribute("customerName", message);
}
}
手順 3 の完了によって、必要なバッキング ファイルが作成され、WEB-INF/src/backing
フォルダに保存されました。フォルダは、図 4-13 の例のようになっているはずです。
図 4-13 バッキング ファイルがすべて作成済みの WEB-INF/src/backing
この手順では、3 つのポートレットのうち最初の 1 つを作成します。このポートレットは、顧客ルックアップ ポートレットをリスンし、特定のイベント (この場合は、送信された顧客名) を受信すると、イベントに応じてアクションを開始します (この場合は、要求された顧客の情報を返します)。
このポートレットを作成するには、ファイルを 4 つ作成します。ページ フロー ファイルを 1 つ、JSP ファイルを 2 つ、および .portlet
ファイルです。.portlet
ファイルは、他の 3 つのファイルのコンテナにすぎません。ただし、このファイルには重要なプロパティ、具体的には、バッキング ファイルとイベント ハンドラが設定されます。
注意 : 時間の節約およびファイル作成時の入力ミスの可能性をなくすため、このドキュメントでは必要なコードがあらかじめ準備されています。オンライン (HTML) で参照中の場合は、コードを切り取って適切な空のファイルに貼り付けることができます。このドキュメントの印刷版または PDF バージョンを使用しているためオンライン コピーを取得できない場合は、コード サンプルに表示されているとおりに正確にコードを入力してください。
FindCustomer ページ フロー (FindCustomerController.jpf
) は、顧客ルックアップ結果ポートレットで表示されるページの順序を設定します。このページ フローは、顧客ルックアップ ポートレットで名前が送信された後に実行されます。
FindCustomer ページ フローを作成するには、次の手順に従います (この手順では、WebLogic Workshop が実行中であることを前提とします)。
ページ フロー ウィザード (図 4-15) が表示されます。
[ページ フロー タイプを選択] ダイアログ ボックスが表示されます (図 4-16)。
図 4-16 [ページ フロー タイプを選択] ダイアログ ボックス
ページ フロー デザイナに、ページ フローの基本設計が表示されます (図 4-17)。
図 4-17 ページ フロー デザイナの FindCustomerController.jpf - フロー ビュー
また、ファイル ツリーに、FindCustomerController.jpf
(図 4-18) が表示されます。このページ フローを作成すると、Customer_Lookup
フォルダに、ページ フロー名 (findCustomer) を持つ新しいフォルダが表示され (図 4-18)、追加の JSP、index.jsp
が作成されます。findCustomer
フォルダはこのポートレットを構成するファイルをホストし、index.jsp
は result.jsp
ファイルのテンプレートとしての役割を果たします。
図 4-18 findCustomer フォルダの FindCustomerController.jpf
ページ フロー デザイナのビューが、図 4-19 のように変更されます。
図 4-19 ソース ビューのデフォルトのページ フロー コード
コード リスト 4-4 FindCustomerController.jpf コード サンプル
package Customer_Lookup.findCustomer;
import com.bea.wlw.netui.pageflow.FormData;
import com.bea.wlw.netui.pageflow.Forward;
import com.bea.wlw.netui.pageflow.PageFlowController;
/**
* @jpf:controller
* @jpf:view-properties view-properties::
* <!-- このデータは自動生成されたものです。このセクションを編集することはお勧めしません。
* -->
* <view-properties>
* <pageflow-object id="pageflow:/Customer_Lookup/findCustomer/
* FindCustomerController.jpf"/>
* <pageflow-object id="action:begin.do">
* <property value="80" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="action:findCustomerInfo.do#Customer_Lookup.
* findCustomer.FindCustomerController.FindCustomerInfoForm">
* <property value="680" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="action-call:@page:findCustomer.jsp@#@action:
* findCustomerInfo.do#Customer_Lookup.findCustomer.FindCustomerController.
* FindCustomerInfoForm@">
* <property value="276,460,460,644" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* </pageflow-object>
* <pageflow-object id="page:findCustomer.jsp">
* <property value="240" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="page:result.jsp">
* <property value="560" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="forward:path#success#findCustomer.
* jsp#@action:begin.do@">
* <property value="116,160,160,204" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* <property value="success" name="label"/>
* </pageflow-object>
* <pageflow-object
* id="forward:path#success#result.jsp#@action:
* findCustomerInfo.do#Customer_Lookup.findCustomer.FindCustomerController.
* FindCustomerInfoForm@">
* <property value="644,620,620,596" name="elbowsX"/>
* <property value="81,81,81,81" name="elbowsY"/>
* <property value="West_0" name="fromPort"/>
* <property value="East_0" name="toPort"/>
* <property value="success" name="label"/>
* </pageflow-object>
* <pageflow-object id="formbeanprop:Customer_Lookup.findCustomer.
* FindCustomerController.FindCustomerInfoForm#name#java.lang.String"/>
* <pageflow-object id="formbean:Customer_Lookup.findCustomer.
* FindCustomerController.FindCustomerInfoForm"/>
* <pageflow-object id="action-call:@page:result.jsp@#@action:
* findCustomerInfo.do#Customer_Lookup.findCustomer.FindCustomerController.
* FindCustomerInfoForm@">
* <property value="596,620,620,644" name="elbowsX"/>
* <property value="92,92,81,81" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_0" name="toPort"/>
* </pageflow-object>
* </view-properties>
* ::
*/
public class FindCustomerController extends PageFlowController
{
// Global.app にアクセスするには、この宣言のコメントを解除します。
//
// protected global.Global globalApp;
//
// ページ フローの例外処理の例については、{project}/WEB-INF/src/global/Global.app の「catch」および「exception-handler」の例の注釈
// を参照してください。
/**
* このメソッドはページ フローへのエントリ ポイントを示します
* @jpf:action
* @jpf:forward name="success" path="findCustomer.jsp"
*/
protected Forward begin()
{
return new Forward("success");
}
/**
* @jpf:action
* @jpf:forward name="success" path="result.jsp"
*/
protected Forward findCustomerInfo(FindCustomerInfoForm form)
{
return new Forward("success");
}
/**
* FormData の get および set メソッドは、フォーム Bean エディタで上書きできます。
*/
public static class FindCustomerInfoForm extends FormData
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
}
}
注意 : ページ フロー デザイナで、「ファイルが見つかりません」という警告が 2 つ表示される場合があります (緑の波線で表示)。これらは次の 2 つの手順で作成するファイルの参照であるため、無視してかまいません。
findCustomer.jsp
を作成するには、次の手順に従います。
[新しいファイル] ダイアログ ボックス (図 4-21) が表示されます。
図 4-21 JSP ファイルが選択された [新しいファイル] ダイアログ ボックス
ファイルが作成され、JSP Designer に新しい JSP テンプレートが表示されます (図 4-22)。
また、findCustomer
フォルダに新しいファイルが表示されます (図 4-23)。
図 4-23 findCustomer フォルダの findCustomer.jsp ファイル
コード リスト 4-5 findCustomer.jsp サンプル コード
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<body>
<p> Find Support Information </p>
<netui:form action="findCustomerInfo">
<div>
Name:
<netui:textBox dataSource="{actionForm.name}" defaultValue=
""></netui:textBox>
<br/>
</div>
<netui:button value="Find Support Info" type="submit"/>
</netui:form>
</body>
</netui:html>
result.jsp
には、findCustomer ページ フロー (findCustomerController.jpf
) が正常に実行された場合の最終ページについてのプレゼンテーション ロジックが保存されます 。顧客ルックアップ ポートレットで送信した名前が認証されると、このページが表示されて、指定された顧客のデータが提示されます。
Customer_Lookup/findCustomer
の下の index.jsp
を探し、右クリックして、ファイルのコンテキスト メニューを開きます (図 4-24)。index.jsp
を result.jsp に変更します (
図 4-25)
。図 4-25 index.jsp
が result.jsp
に置換されたファイル ツリー
コード リスト 4-6 result.jsp のコード サンプル
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<body>
<p>
Support Case Information
</p>
Customer Name:
<%=session.getAttribute("customerName")
%>
<%
session.setAttribute("customerName", "");
%>
<netui:form action="findCustomerInfo">
<netui:label value="{actionForm.name}"/>
</netui:form>
<div>
<br>
Support Case 001<br/>
Support Case 002<br/>
Support Case 003<br/>
Support Case 004<br/>
</div>
</body>
</netui:html>
注意 : JSP を両方とも保存した後に FindCustomerController.jpf
を再び開くと、コード リスト 4-4 の後の「注意」で説明している警告は表示されません。
顧客ルックアップ ポートレットは、作成したページ フローと JSP のコンテナです。このファイルにバッキング ファイルを追加し、ポートレット間通信の確立に必要なイベント ハンドラを実装します。
顧客ルックアップ ポートレットを作成するには、次の手順に従います。
図 4-26 FindCustomerController.jpf
のコンテキスト メニュー
[ポートレットの詳細] ダイアログ ボックス (図 4-27) が表示されます。
[タイトル] および [コンテンツ URI] は、ページ フローの名前に基づいてすでに入力されています (図 4-28)。
Customer_Lookup/findCustomer フォルダに、新しいポートレットが表示されます (図 4-29)。
図 4-29 ファイル ツリーの FindCustomerController ポートレット
ここでは、バッキング ファイル receiveCustomerInfo.java
をポートレット (FindCustomerController.portlet
) に追加します。「手順 2 : バッキング ファイルの作成」で説明しているように、このファイルに記述されたビジネス ロジックによって、顧客ルックアップ ポートレットで送信した名前を持つ顧客に関する情報が含まれたペイロードをフェッチします。
Portlet Designer にポートレットが表示されます (図 4-30)。
図 4-30 Portlet Designer のポートレット
テキスト入力を受け入れるためのフィールドが開きます (図 4-31)。
図 4-31 [バッキング ファイル] が選択されたプロパティ エディタ
注意 : ファイル タイプ (.java
) は入力しないでください。このフィールド内のドット区切り文字は、WebLogic Workshop でファイル パスの区切り文字として解釈されます。したがって、.java
を入力すると、backing/FindCustomerBacking
という存在しないフォルダの java
というファイルが検索されます。
最後に、このポートレットのイベント ハンドラを作成します。この手順では、イベント ハンドラのタイプを選択し、リスンするポートレットを指定し、設定されたイベントが検出されたときに実行するアクションを定義します。
図 4-32 編集用に開いた [イベント ハンドラ] プロパティ
イベント ハンドラ ツール (図 4-33) が表示されます。
使用可能なイベント ハンドラのメニューが表示されます (図 4-34)。
[イベント] の一覧に [カスタム イベントの処理] が表示され、ダイアログ ボックスに追加のフィールドが表示されます (図 4-35)。
図 4-35 [カスタム イベントの処理] が選択されたイベント ハンドラ ツール
アクションのリストが表示されます (図 4-36)。
注意 : このオプションは、ポートレットにバッキング ファイルを追加した場合にのみ表示されます。表示されない場合は、「バッキング ファイルの追加」が正しく完了していることを確認してください。
[イベント] リストに、[BackingFile メソッドの呼び出し] が表示され、ダイアログ ボックスの右側のペインが図 4-37 のように変化します。
図 4-37 [BackingFile メソッドの呼び出し] がアクションとして追加されたイベント ハンドラ
図 4-38 [BackingFile メソッドの呼び出し] で使用可能なメソッドのリスト
イベント ハンドラ ツールは、図 4-39 の例のようになっているはずです。
図 4-39 findCustomer ポートレット用のイベント ハンドラ ツールの完了
注文ルックアップ ポートレットは、顧客ルックアップ ポートレットで送信した顧客に関する注文の情報を表示します。このポートレットは、顧客ルックアップ ポートレットと同じ構造ですが、正しく実行するために数種の異なるデータが必要です。
注意 : 時間の節約およびファイル作成時の入力ミスの可能性をなくすため、このドキュメントでは必要なコードがあらかじめ準備されています。オンライン (HTML) で参照中の場合は、コードを切り取って適切な空のファイルに貼り付けることができます。このドキュメントの印刷版または PDF バージョンを使用しているためオンライン コピーを取得できない場合は、コード サンプルに表示されているとおりに正確にコードを入力してください。
FindOrder ページ フロー (FindOrderController.jpf
) は、注文ルックアップ ポートレットで表示されるページの順序を設定します。このページ フローは、顧客ルックアップ ポートレットで名前が送信された後に実行されます。注文検索ページ フロー (FindOrderController.jpf
) の作成は、「ページ フロー (FindCustomerController.jpf) の作成」で説明している顧客検索ページ フローの作成とまったく同じですが、含まれるデータが異なります。
FindOrderController.jpf を作成するには、次の手順に従います。
findOrder
というフォルダが Orders_LookUp
の下に表示される。FindOrderController.jpf
と index.jsp
という 2 つのファイルが Orders_LookUp/findOrder
の下に表示される。図 4-40 ページフロー デザイナのデフォルトのページ フロー図 - フロー ビュー
ページ フロー デザイナの下部で [ソース ビュー] をクリックします。
ページ フロー デザイナのソース ビューに、デフォルト ページ フローのコードが表示されます (図 4-41)。
図 4-41 ソース ビューのデフォルトのページ フロー コード
コード リスト 4-7 のコード サンプルをコピーし、ページ フロー デザイナのソース ビューに貼り付けます。
コード リスト 4-7 FindOrderController.jpf コード サンプル
package Orders_LookUp.findOrder;
import com.bea.wlw.netui.pageflow.FormData;
import com.bea.wlw.netui.pageflow.Forward;
import com.bea.wlw.netui.pageflow.PageFlowController;
/**
* @jpf:controller
* @jpf:view-properties view-properties::
* <!-- このデータは自動生成されたものです。このセクションを編集することはお勧めしません。
* -->
* <view-properties>
* <pageflow-object id="pageflow:/Orders_LookUp/findOrder/
* FindOrderController.jpf"/>
* <pageflow-object id="action:begin.do">
* <property value="80" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="action:findOrders.do#Orders_LookUp.findOrder.
* FindOrderController.FindOrdersForm">
* <property value="420" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="action-call:@page:findOrderForm.jsp@#@action:
* findOrders.do#Orders_LookUp.findOrder.FindOrderController.
* FindOrdersForm@">
* <property value="276,330,330,384" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* </pageflow-object>
* <pageflow-object id="page:findOrderForm.jsp">
* <property value="240" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="page:orderResults.jsp">
* <property value="600" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="forward:path#success#findOrderForm.jsp#@action:
* begin.do@">
* <property value="116,160,160,204" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* <property value="success" name="label"/>
* </pageflow-object>
* <pageflow-object id="forward:path#success#orderResults.jsp#@action:
* findOrders.do#Orders_LookUp.findOrder.FindOrderController.
* FindOrdersForm@">
* <property value="456,510,510,564" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* <property value="success" name="label"/>
* </pageflow-object>
* <pageflow-object id="formbeanprop:Orders_LookUp.findOrder.
* FindOrderController.FindOrdersForm#customer_name#java.lang.String"/>
* <pageflow-object id="formbeanprop:Orders_LookUp.findOrder.
* FindOrderController.FindOrdersForm#order_id#java.lang.String"/>
* <pageflow-object id="formbean:Orders_LookUp.findOrder.FindOrderController.
* FindOrdersForm"/>
* <pageflow-object id="action-call:@page:orderResults.jsp@#@action:findOrders.
* do#Orders_LookUp.findOrder.FindOrderController.FindOrdersForm@">
* <property value="564,510,510,456" name="elbowsX"/>
* <property value="92,92,81,81" name="elbowsY"/>
* <property value="West_1" name="fromPort"/>
* <property value="East_0" name="toPort"/>
* </pageflow-object>
* </view-properties>
* ::
*/
public class FindOrderController extends PageFlowController
{
// Global.app にアクセスするには、この宣言のコメントを解除します。
//
// protected global.Global globalApp;
//
// ページ フローの例外処理の例については、{project}/WEB-INF/src/global/Global.app の
// 「catch」および「exception-handler」の例の注釈を
// 参照してください。
/**
* このメソッドはページ フローのエントリ ポイントを表します
* @jpf:action
* @jpf:forward name="success" path="findOrderForm.jsp"
*/
protected Forward begin()
{
return new Forward("success");
}
/**
* @jpf:action
* @jpf:forward name="success" path="orderResults.jsp"
*/
protected Forward findOrders(FindOrdersForm form)
{
return new Forward("success");
}
/**
* FormData の get および set メソッドは、フォーム Bean エディタで上書きできます。
*/
public static class FindOrdersForm extends FormData
{
private String order_id;
private String customer_name;
public void setCustomer_name(String customer_name)
{
this.customer_name = customer_name;
}
public String getCustomer_name()
{
return this.customer_name;
}
public void setOrder_id(String order_id)
{
this.order_id = order_id;
}
public String getOrder_id()
{
return this.order_id;
}
}
}
注意 : ページ フロー デザイナで、「ファイルが見つかりません」という警告が 2 つ表示される場合があります (緑の波線で表示)。これらは次の 2 つの手順で作成するファイルの参照であるため、無視してかまいません。
次に、ページ フローを正しく実行するために必要な 2 つの JSP のいずれかを作成する必要があります。findOrder.jsp
には、最初のポートレットを表示するためのプレゼンテーション ロジックが記述されます。顧客名を送信して、このポートレットからページ フローを起動できます。この例では、顧客ルックアップ ポートレットで送信された名前を注文ルックアップ ポートレットが受信したときにページ フローが起動されます。
findOrderForm.jsp
を作成するには、次の手順に従います。
Orders_LookUp/findOrders
の下に、findOrderForm.jsp
が表示される。図 4-42 JSP Designer の デザイン ビューでのデフォルト JSP の表示
コード リスト 4-8 findOrderForm.jsp
サンプル コード
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<head>
<title>
Find Order
</title>
</head>
<body>
<p> Find Order </p>
<%= //session.getAttribute("customerName")
%>
<netui:form action="findOrders">
<table>
<tr valign="top">
<td>Customer_name:</td>
<td>
<netui:textBox dataSource="{actionForm.customer_name}"/>
</td>
</tr>
<tr valign="top">
<td>Order_id:</td>
<td>
<netui:textBox dataSource="{actionForm.order_id}"/>
</td>
</tr>
</table>
<br/>
<netui:button value="Find Orders" type="submit"/>
</netui:form>
</body>
</netui:html>
作成する 2 番目の JSP は、orderResults.jsp
です。このファイルには、顧客名フィールドまたは注文 ID フィールドで指定した顧客について注文ルックアップの結果を表示するためのプレゼンテーション ロジックが記述されます。ただし、この例では、顧客ルックアップ ポートレットで送信した顧客名の注文情報が返されます。
orderResults.jsp を作成するには、次の手順に従います。
コード リスト 4-9 orderResults.jsp コード サンプル
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<head>
<title>
Web Application Page
</title>
</head>
<body>
<p>
Customer Name: <%=session.getAttribute("customerName")
%>
<%
session.setAttribute("customerName", "");
%>
<netui:form action="findOrders">
<netui:label value="{actionForm.customer_name}"/>
</netui:form>
<br>
Order 001<br>
Order 002<br>
Order 003<br>
Order 004<br>
<br>
</body>
</netui:html>
注意 : JSP を両方とも保存した後に FindCustomerController.jpf
を再び開くと、コード リスト 4-7 の後の「注意」で説明している警告は表示されません。
ポートレット ファイル FindOrderController.portlet
は、作成したページ フローおよび JSP のコンテナです。このファイルにバッキング ファイルを追加し、ポートレット間通信の確立に必要なイベント ハンドラを実装します。
注文ルックアップ ポートレットを作成するには、次の手順に従います。
FindOrderController.jpf
を右クリックしてコンテキスト メニューを開き、[ポートレットの生成] を選択します (図 4-43)。図 4-43 FindOrderController.portlet
の生成
ここでは、バッキング ファイル ListenCustomerName.java
をポートレット (FindOrderController.portlet
) に追加します。「手順 2 : バッキング ファイルの作成」で説明しているように、このファイルに記述されたビジネス ロジックによって、顧客ルックアップ ポートレットで送信した名前を持つ顧客の注文情報をフェッチします。
注意 : ファイル タイプ (.java
) は入力しないでください。このフィールド内のドット区切り文字は、WebLogic Workshop でファイル パスの区切り文字として解釈されます。したがって、.java
を入力すると、backing/FindCustomerBacking
という存在しないフォルダの java
というファイルが検索されます。
最後に、このポートレットのイベント ハンドラを作成します。この手順では、イベント ハンドラのタイプを選択し、リスンするポートレットを指定し、設定されたイベントが検出されたときに実行するアクションを定義します。
イベント ハンドラ ツール (図 4-45) が表示されます。
使用可能なイベント ハンドラのメニューが表示されます (図 4-46)。
[イベント] の一覧に [カスタム イベントの処理] が表示され、ダイアログ ボックスに追加のフィールドが表示されます (図 4-47)。
図 4-47 [カスタム イベントの処理] が選択されたイベント ハンドラ ツール
アクションのリストが表示されます (図 4-48)。
注意 : このオプションは、ポートレットにバッキング ファイルを追加した場合にのみ表示されます。表示されない場合は、「バッキング ファイルの追加」が正しく完了していることを確認してください。
[イベント] リストに、[BackingFile メソッドの呼び出し] が表示され、ダイアログ ボックスの右側のペインが図 4-49 のように変化します。
図 4-49 [BackingFile メソッドの呼び出し] がアクションとして追加されたイベント ハンドラ
イベント ハンドラ ツールは、図 4-50 の例のようになっているはずです。
図 4-50 findCustomer ポートレット用のイベント ハンドラ ツールの完了
この時点で、ipcText Web アプリケーションの注文ルックアップ ポートレットが完了しています。必要なすべてのファイルが作成されているかどうかを確認するには、ファイル ツリーの Orders_LookUp
フォルダと 図 4-51 を比較します。ファイル ツリーは、例の中のツリーと一致する必要があります。
図 4-51 注文ルックアップ ポートレットが完了した Orders_LookUp
フォルダ
顧客ルックアップ ポートレットは、この実習で作成する最後のポートレットです。このポートレットにユーザが顧客名を入力し、システムに送信します。この送信によって作成されるイベントを「手順 3 : 顧客ルックアップ結果ポートレットの作成」および「手順 4 : 注文ルックアップ ポートレットの作成」で作成したポートレットが受信し、適切なアクションを開始します。
注意 : 時間の節約およびファイル作成時の入力ミスの可能性をなくすため、このドキュメントでは必要なコードがあらかじめ準備されています。オンライン (HTML) で参照中の場合は、コードを切り取って適切な空のファイルに貼り付けることができます。このドキュメントの印刷版または PDF バージョンを使用しているためオンライン コピーを取得できない場合は、コード サンプルに表示されているとおりに正確にコードを入力してください。
FindCustomerController.jpf
は、顧客ルックアップ ポートレットで表示されるページの順序を設定します。このページ フローは、このポートレットで名前が送信された後に実行されます。顧客ルックアップ ページ フローの作成は、この実習の他のページ フローの作成とまったく同じですが、含まれるデータが異なります。
注意 : この FindCustomerController.jpf
を「手順 3 : 顧客ルックアップ結果ポートレットの作成」で作成した FindCustomerController.jpf
と混同しないでください。同一の名前は、このデモンストレーションの特質です。
FindCustomerController.jpf を作成するには、次の手順に従います。
portlets
の下に、findCustomer
というフォルダが表示される。portlets/findCustomer
の下に、FindCustomerController.jpf
とindex.jsp
の 2 つのファイルが表示される。コード リスト 4-10 FindCustomerController.jpf コード サンプル (第 2 バージョン)
package portlets.findCustomer;
import com.bea.wlw.netui.pageflow.FormData;
import com.bea.wlw.netui.pageflow.Forward;
import com.bea.wlw.netui.pageflow.PageFlowController;
/**
* @jpf:controller
* @jpf:view-properties view-properties::
* <!-- このデータは自動生成されたものです。このセクションを編集することはお勧めしません。
* -->
* <view-properties>
* <pageflow-object id="pageflow:/portlets/findCustomer/
* FindCustomerController.jpf"/>
* <pageflow-object id="action:begin.do">
* <property value="80" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="page:index.jsp">
* <property value="240" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="forward:path#success#index.jsp#@action:begin.do@">
* <property value="116,160,160,204" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* <property value="success" name="label"/>
* </pageflow-object>
* <pageflow-object id="page:result.jsp">
* <property value="580" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="action:findCustomer.do#portlets.findCustomer.
* FindCustomerController.FindCustomerForm">
* <property value="420" name="x"/>
* <property value="100" name="y"/>
* </pageflow-object>
* <pageflow-object id="forward:path#success#result.jsp#@action:findCustomer.
* do#portlets.findCustomer.FindCustomerController.FindCustomerForm@">
* <property value="456,500,500,544" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* <property value="success" name="label"/>
* </pageflow-object>
* <pageflow-object id="formbean:portlets.findCustomer.FindCustomerController.
* FindCustomerForm"/>
* <pageflow-object id="formbeanprop:portlets.findCustomer.
* FindCustomerController.FindCustomerForm#name#java.lang.String"/>
* <pageflow-object id="formbeanprop:portlets.findCustomer.
* FindCustomerController.FindCustomerForm#company#java.lang.String"/>
* <pageflow-object id="action-call:@page:index.jsp@#@action:findCustomer.
* do#portlets.findCustomer.FindCustomerController.FindCustomerForm@">
* <property value="276,330,330,384" name="elbowsX"/>
* <property value="92,92,92,92" name="elbowsY"/>
* <property value="East_1" name="fromPort"/>
* <property value="West_1" name="toPort"/>
* </pageflow-object>
* </view-properties>
* ::
*/
public class FindCustomerController extends PageFlowController
{
// Global.app にアクセスするには、この宣言のコメントを解除します。
//
// protected global.Global globalApp;
//
// ページ フローの例外処理の例については、{project}/WEB-INF/src/global/Global.app の
// 「catch」および「exception-handler」の例の注釈を
// 参照してください。
/**
* このメソッドは、ページ フローへのエントリ ポイントを表します
* @jpf:action
* @jpf:forward name="success" path="index.jsp"
*/
protected Forward begin()
{
return new Forward("success");
}
/**
* @jpf:action
* @jpf:forward name="success" path="result.jsp"
*/
protected Forward findCustomer(FindCustomerForm form)
{
return new Forward("success");
}
/**
* FormData の get メソッドと set メソッドは、フォーム Bean エディタで上書きできます。
*/
public static class FindCustomerForm extends FormData
{
private String company;
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setCompany(String company)
{
this.company = company;
}
public String getCompany()
{
return this.company;
}
}
}
注意 : ページ フロー デザイナで、「ファイルが見つかりません」という警告が表示される場合があります (緑の波線で表示)。これは「result.jsp の作成」で作成するファイル result.jsp
の参照であるため、この警告は無視してかまいません。
これは Web アプリケーションの 3 つのページ フローの「起動パッド」であるため (つまり、このポートレットで名前を送信すると、ポートレット間通信を通じて、この手順で作成しているポートレットのほか、「手順 3 : 顧客ルックアップ結果ポートレットの作成」および 手順 4 : 注文ルックアップ ポートレットの作成」で作成したポートレットでページ フロー アクションが発生する)、この実習ではベスト プラクティスに従って、このページ フローを index.jsp
ファイルから始めます。
この JSP は、顧客名を送信する前の顧客ルックアップ ポートレットのプレゼンテーション ロジックとなります。名前を送信すると、このロジックの代わりに、次の手順で作成する result.jsp
のプレゼンテーション ロジックが使用されます。「ページ フロー (FindCustomerController.jpf) の作成」でページ フローを作成したとき、index.jsp
のテンプレートが作成され、portlets/findCustomer
に保存されました。
コード リスト 4-11 のコード サンプルをコピーし、JSP Designer に貼り付けます。
コード リスト 4-11 index.jsp コード サンプル
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<head>
<title>
Web Application Page
</title>
</head>
<body>
<p> New Web Application Page </p>
<netui:form action="findCustomer">
<table>
<tr valign="top">
<td>Company:</td>
<td>
<netui:textBox dataSource="{actionForm.company}"/>
</td>
</tr>
<tr valign="top">
<td>Name:</td>
<td>
<netui:textBox dataSource="{actionForm.name}"/>
</td>
</tr>
</table>
<br/>
<netui:button value="findCustomer" type="submit"/>
</netui:form>
</body>
</netui:html>
次に、result.jsp
ファイルを作成します。このファイルには、FindCustomerController ページ フローが正しく表示された後、このポートレットに返される情報の表示を書式化するためのプレゼンテーション ロジックを記述します。このロジックは、index.jsp
のロジックより優先されます。
[新しいファイル] ダイアログ ボックスが表示されます。[Web User Interface] と [JSP ファイル] が選択されていることを確認します。選択されていない場合は、ここで選択します。
portlets/findCustomer
の下に result.jsp
が表示される。コード リスト 4-12 result.jsp コード サンプル
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<head>
<title>
Find Customer Result
</title>
</head>
<body>
<br>
Customer Information:
<br>
<br>
<netui:form action="findCustomer">
<b>Name: <netui:label value="{actionForm.name}"/>
<br>
Address: 4001 Discovery Drive<br>
City: Boulder<br>
State: CO<br></b>
</b>
</netui:form>
</body>
</netui:html>
注意 : result.jsp
を保存した後に FindCustomerController.jpf
を再び開くと、コード リスト 4-10 の後の「注意」で説明している警告は表示されません。
ポートレット ファイル FindOrderController.portlet
は、作成したページ フローおよび JSP のコンテナです。このファイルにバッキング ファイルを追加し、ポートレット間通信の確立に必要なイベント ハンドラを実装します。
顧客ルックアップ ポートレットを作成するには、次の手順に従います。
ここでは、バッキング ファイル FindCustomerBacking.java
をポートレット (FindCustomerController.portlet
) に追加します。
注意 : ファイル タイプ (.java
) は入力しないでください。このフィールド内のドット区切り文字は、WebLogic Workshop でファイル パスの区切り文字として解釈されます。したがって、.java
を入力すると、backing/FindCustomerBacking
という存在しないフォルダの java
というファイルが検索されます。
最後に、このポートレットのイベント ハンドラを作成します (「手順 3 : 顧客ルックアップ結果ポートレットの作成」および「手順 4 : 注文ルックアップ ポートレットの作成」で作成したポートレットとは異なり、このポートレットではイベント ハンドラを 1 つだけ使用します)。この手順では、イベント ハンドラのタイプを選択し、リスンするポートレットを指定し、設定されたイベントが検出されたときに実行するアクションを定義します。
イベント ハンドラ ツール (図 4-53) が表示されます。
使用可能なイベント ハンドラのメニューが表示されます (図 4-54)。
[イベント] の一覧に [PageFlow イベントの処理] が表示され、ダイアログ ボックスに追加のフィールドが表示されます (図 4-55)。
図 4-55 [PageFlow イベントの処理] が選択されたイベント ハンドラ ツール
|
|
アクションのリストが表示されます (図 4-56)。
注意 : このオプションは、ポートレットにバッキング ファイルを追加した場合にのみ表示されます。表示されない場合は、「バッキング ファイルの追加」が正しく完了していることを確認してください。
[イベント] リストに、[BackingFile メソッドの呼び出し] が表示され、ダイアログ ボックスの右側のペインが図 4-57 のように変化します。
図 4-57 [BackingFile メソッドの呼び出し] がアクションとして追加されたイベント ハンドラ
イベント ハンドラ ツールは、図 4-58 の例のようになっているはずです。
図 4-58 findCustomer ポートレット用のイベント ハンドラ ツールの完了
顧客ルックアップ ポートレットのイベント ハンドラの作成によって、この実習の 3 つのポートレットのすべてが作成されました。必要なファイルがすべて作成されていることを確認するには、現在のバージョンの WebLogic Workshop のファイル ツリーを 図 4-59 の例と比較してください。
図 4-59 すべてのポートレットの完了後のファイル ツリー
次は、「手順 6 : ポータル ファイルの作成とデータ入力」の説明に従って、作成した 3 つのポートレットをポータルに追加します。
この手順では、対話をするポートレットが含まれ、.portal
ファイルを特徴とするポータルを作成し、これらのポートレットをポータルに追加します。
[新しいファイル] ダイアログ ボックス (図 4-61) が表示されます。
図 4-61 新しいポータルの作成用にコンフィグレーションされた [新しいファイル] ダイアログ ボックス
実際のポータル アプリケーションの作成の最後の手順は、新しく作成したポートレットを新しく作成したポータルに追加することです。そのためには、次の手順に従います。
この最後の手順では、この実習で予定されたとおりにポートレット間通信が確立されたかどうかを確認します。WebLogic Server を起動し、ポータルを実行し、ユーザ名を送信します。名前を送信すると、ポートレット間で通信が行なわれ、特定のユーザのデータが返される必要があります。
注意 : WebLogic Workshop で AW.portal
が開いていることを確認します。
サーバを起動中であることを示す進捗状況メーターが表示されます (図 4-66)。
サーバが起動するまで少し時間がかかります。進捗状況メーターが表示されなくなると、サーバは実行中です。WebLogic Workshop の下部で、インジケータが緑色になり、「サーバが実行中です」と表示されます (図 4-67)。
注意 : このアイコンをクリックすると、ポータルが表示される前にデバッガが実行されます。
テスト ブラウザにポータルが表示されます (図 4-69)。
ポータルをテストする (つまり、IPC が正しく実行されることを示す) には、次の手順を実行します。
3 つのポートレットがすべてリフレッシュされて Bob Smith の顧客情報と注文情報が表示されます (図 4-70)。
図 4-70 顧客情報と注文情報が表示されたテスト ブラウザ
![]() ![]() |
![]() |
![]() |