BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

WebLogic Platform サンプル
アプリケーション
ツアー

 前 次 目次 PDFで表示  

企業消費者間 (B2C) ポータル ツアー

企業消費者間 (B2C) ポータル ツアーでは、Avitek Digital Imaging ポータルに実装された主な機能について説明します。このサイトでは、WebLogic Portal のポータル フレームワーク、WebLogic Workshop に組み込まれた 2 つの Web サービスの使用、さらに WebLogic Integration に備わっている在庫確認と注文管理など、製品のさまざまな機能を組み合わせて表示します。これらのコンポーネントはすべて、WebLogic Server の Web アプリケーション サーバ環境で動作します。

注意: このオンライン ブックに掲載されている情報は、アプリケーションの一部として実行される状況依存ツアー ガイド ポートレットでも入手できます。

この企業消費者間 (B2C) ポータル ツアーには、以下の節があります。

 


初期処理の概要

WebLogic Platform のサンプル アプリケーションを起動したとき、サーバが起動し、[はじめに] すなわち「スプラッシュ」ページが最初に表示されたのは、どういう仕組みによるのでしょうか。まず、サンプル アプリケーションを呼び出すにはいくつかの方法があり、WebLogic Platform Quick Start Application または Windows の [スタート] メニューから起動する方法や、startE2E スクリプトの実行という直接的な方法がありました。

どのオプションを使用したかに関わらず、startE2E.bat (Windows) または startE2E.sh (UNIX) スクリプトが呼び出されました。これで、アプリケーションの WebLogic Server インスタンスが起動されましたが、このアプリケーションは、e2eDomain というドメインで実行されるものです。(「e2e」とは、エンド ツー エンド (end-to-end) を略したもので、主要機能のすべての範囲を示すサンプルであることを意味しています)。「ドメイン」という言葉は、コンピュータ業界では、さまざまな意味を持っています。BEA 製品でドメインというとき、それは、サーバ、サービス、インタフェース、マシン、関連するリソース マネージャなど、すべて 1 つのコンフィグレーション ファイルで定義されるものの集合を表します。

startE2E スクリプトを実行すると、エンタープライズ アプリケーションの config.xml ファイルからコンフィグレーション情報が読み込まれます。デフォルトでは、このコンフィグレーション ファイルは、BEA 製品がインストールされている以下の BEA_HOME ディレクトリにあります。

weblogic700/samples/platform/e2eDomain

config.xml ファイルは以下のように定義され、そのドメインのデフォルト Web アプリケーションとして splashPage を設定しています。

<WebServer
	DefaultWebApp="splashPage"
LogFileName="./logs/access.log"
LoggingEnabled="true"
Name="e2eServer"
/>

e2eServer が稼動した状態で、http://localhost:7501 などの URL をブラウザで指定すると、以下のディレクトリにある splashPage Web アプリケーションが起動します (Web アプリケーションは「Webapp」と略称されることもあります)。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥splashPage

splashPage Web アプリケーションの web.xml コンフィグレーション ファイルでは、<welcome-file-list> 定義の中で index.jsp を指定します。この web.xml は、以下のディレクトリにあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥splashPage¥WEB-INF

スプラッシュ ページで [「Rachel Adams」として自動ログイン] ボタンのグラフィックをクリックして、この [My Avitek] ページを表示しました。このアクションの結果、スプラッシュ ページから、ポータル アプリケーションの URL と定義済みのログイン資格情報が渡されることになりました。

スプラッシュ ページは、b2cPortal または b2bPortal に自動的にログインできるようにする要求を設定します。これは、このサンプル アプリケーションを簡素化するために行われます。JSP ページにユーザ名とパスワードを組み込むようなことは、普通は行いません。ログイン資格情報の定義にスクリプトレットを使用しましたが、実際の Web アプリケーションにこの手法を用いることはお勧めしません。

注意: WebLogic Portal は、その他にも、ログイン認証コードと、Web アプリケーションによるデモグラフィック情報収集のテクニックを示すサンプルを提供します。詳細については、WebLogic Portal のドキュメントを参照してください。

b2cPortal アプリケーションについて、ブラウザに URL が渡されたとき、[My Avitek] ページが最初に表示されたのはなぜでしょうか。このデフォルト ページは、WebLogic Portal Administration Tools で定義しました。この設定の詳細と [My Avitek] ページのその他の特性については、次の節を参照してください。

 


[My Avitek] ページ

B2C ポータル ツアーは [My Avitek] ページから始まります。この [My Avitek] ページには、ログイン ユーザである Rachel Adams 向けにパーソナライズされたコンテンツが表示されます。WebLogic Portal ツールは、一連の情報をポートレットにまとめるために使われました。このページ上のパーソナライズされたコンテンツには、Rachel の現在のショッピング カートと注文履歴があり、[ログアウト] ボタンの横に Rachel の名前が一覧表示されています。

これが初めてのツアーで、共有サーバ インスタンスに Rachel Adams としてログインしているユーザが他にいない場合、ショッピング カートと注文履歴は空白です。次の画面は、すでに 2 つの注文を完了したユーザの [My Avitek] ページです。


 

[My Avitek] ページの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

[My Avitek] ポータル ページには、ログイン ユーザがサイトのパーソナライズ表示をできるようにするためのポートレットが数多く用意されています。[My Avitek] ページは、b2cPortal で 3 つのタブから構成されるページの 1 つです。WebLogic Platform をインストールした BEA_HOME ディレクトリの以下の場所に、e2eApp を構成するファイルがあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥... 
weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥... 

[My Avitek] ページには、以下のポートレットを追加することができます。

[My Avitek] ページを構成するすべてのポートレットは、以下のファイルで定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project
¥application-sync¥webapps¥b2cPortal¥b2cPortal.portal

例:

<page-name>My Avitek</page-name>
...
<portlet-pool>
<portlet-name>login</portlet-name>
<portlet-name>search</portlet-name>
<portlet-name>tourguide</portlet-name>
<portlet-name>subnav</portlet-name>
<portlet-name>summarycart</portlet-name>
<portlet-name>myavitek</portlet-name>
<portlet-name>orderhistory</portlet-name>
<portlet-name>mybanner</portlet-name>
<portlet-name>anonUser</portlet-name>
</portlet-pool>

これらのポートレットは、開発サイクル時に E-Business Control Center を使用して [My Avitek] ページに追加されました。EBCC は、Java クライアントベースのツールの集まりです。このツールには、ルールの定義、Webflow の編集、ポータルの作成と管理などの複雑な作業を簡単に行えるグラフィカル インタフェースが用意されています。E-Business Control Center のユーザは、ポイントアンドクリック方式のインタフェースで作業を行い、サーバと同期をとる XML ファイルを生成します。

EBCC の他にも、実行時のポータルの管理に、ブラウザベースの WebLogic Portal Administration Tools を使用しました。その処理の詳細については、『管理者ガイド』を参照してください。

開発者は、このサンプル アプリケーションを実行する際に、ブラウザに表示される前のポートレット JSP コードについて理解することが重要です。そのため、この節で使用されるコードの断片や [コードを表示] リンクでは、特定のポートレットのブラウザで表示する前の JSP ファイルについて説明します。

b2cPortal のポートレット JSP ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥...

この [My Avitek] ページでは、[コードを表示] リンクをクリックすると、¥orderhistory¥content.jsp ポートレット ファイルのソースが開きます。ここには、ログイン ユーザのパーソナライズされた注文履歴が表示されます。このポートレットのファイルは、上記のパスの下の orderhistory サブディレクトリにあります。

Order History ポートレットが ...¥e2eApp¥b2cPortal¥portlets¥orderhistory ディレクトリの content.jsp を使用していることはどうしてわかるのでしょうか。これは WebLogic Platform の E-Business Control Center で指定されました。この情報は次のファイルにも定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project
¥application-sync¥portlets¥orderhistory.portlet

この XML ファイルでは以下が定義されています。

<portlet-name>orderhistory</portlet-name>
...
<content-url>/portlets/orderhistory/content.jsp</content-url>

b2cPortal Web アプリケーションのルート ディレクトリからコンテンツ URL への相対パスに注意してください。デフォルトでは、インストール先のディレクトリとして以下の場所が指定されます。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal

デフォルト Webflow 内の位置

[My Avitek] ページのデフォルト Webflow について検討する前に、用語をいくつか定義しておきましょう。

Webflow とは、プレゼンテーション JSP で次ページの URL をハードコーディングせずに、Web サイトのフローを制御できるようにする開発者向けの BEA のテクノロジです。WebLogic Portal では、Webflow を使用して、アプリケーションがブラウザに表示する必要があるページ、および実行する必要があるビジネス ロジックを決定します。1 つまたは複数の Webflow ネームスペース ファイルを使用すると、特定の Web アプリケーションの Webflow をコンフィグレーションできます。

Webflow ネームスペース ファイルは、XML ファイルです。このファイルで、Web アプリケーションの Webflow のコンフィグレーション、サイトの Web ページが表示される順序の制御、およびこれらのページに関連付けられているビジネス ロジックの実行を開始します。Webflow ネームスペース ファイルは、BEA E-Business Control Center で入手できる Webflow エディタと Pipeline エディタを使って編集します。これらのエディタは、各 Web アプリケーションの Webflow を視覚的に作成、変更、検証するのに役立つグラフィカル ツールです。

Pipeline と入力プロセッサは、2 つの異なるタイプのプロセッサ ノードで、Webflow 実装のパッケージに同梱されています。

Pipeline とは、一連のサービスを 1 つの名前付きサービスにバインドできるようにする、開発者向けの BEA のテクノロジです。Pipeline を作成すると、ビジネス データの処理を管理できます。通常、Pipeline は、Webflow の結果として実行されるビジネス ロジックのフローを制御します。Pipeline は、トランザクション対応にすることもトランザクション非対応にすることもできます。たとえば、訪問者が Web サイトの別のページに移動してもその訪問者の情報をデータベースに維持したい場合は、Pipeline を使用します。Pipeline は、より規模の大きいエンタープライズ アプリケーション内の複数の Web アプリケーションに適用できるビジネス ロジックを含むため、エンタープライズ JavaBean (Enterprise JavaBeans: EJB) コンテナでロードされます。

Pipeline は、BEA E-Business Control Center で入手できる Webflow エディタと Pipeline エディタの Pipeline ノードとして表示されます。Webflow エディタと Pipline エディタによって、基本の Webflow ネームスペースと Pipeline ネームスペースの XML ファイルが生成されます。これは手動で編集しないでください。

b2cPortal アプリケーションでは、Webflow ネームスペース ファイルは以下のディレクトリにあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥application-sync¥webapps¥b2cPortal

入力プロセッサは、定義済みの特化した Java クラスで、Webflow メカニズムで呼び出されると、より複雑なタスクを実行します。入力プロセッサは、通常 HTML 形式のデータを検証するため、または Web ページ内に条件ブランチを入れるために使われます。たとえば、日付が正しい形式で入力されているかどうかを検証するコードが、フォーム フィールドを表示する同一の JSP 内に埋め込まれるのではなく、入力プロセッサに含まれていることがあります。入力プロセッサには、Web アプリケーションに固有のロジックが含まれるため、Web アプリケーションのコンテナによってロードされます。

Webflow テクノロジと Pipeline テクノロジ、およびそれらのエディタの詳細については、『開発者ガイド』「ポータル ナビゲーションのセットアップ」を参照してください。

ここには Webflow テクノロジの重要な定義も記載されています。それでは、[My Avitek] ページを見ていきましょう。[My Avitek] ページの 1 つ前のページで、以下のいずれかのアクションを行いました。

[My Avitek] ページのイベントの詳細については、次の節を参照してください。

[My Avitek] ページのイベント

顧客が JSP 上のリンクやボタンをクリックする度に、それが 1 つのイベントであると見なされます。イベントは、デフォルト Webflow 内の特定の応答をトリガし、顧客が処理を継続できるようにします。この応答から、別の JSP がロードされる場合もありますが、通常は、入力プロセッサや Pipeline が最初に呼び出された場合に行われます。

[Products] ページまたは [Shopping Cart] ページで、[My Avitek] タブをクリックすると、以下のような URL が表示されます (ここでは、見やすくするために何行かに改行してあります)。

http://<host>/<port>/b2cPortal/application?
origin=hnav_bar.jsp&event=bea.portal.framework.internal.refresh
&pageid=My+Avitek

更新イベントにより、最新データで更新されたページが再表示されます。[My Avitek] ページ上で、動的データ (My ショッピングカート、注文履歴、ツアー ガイド) が含まれるすべてのポートレットのデータが更新されます。

タブは、hnav_bar.jsp ファイルを介して提供されます。このファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥framework

hnav_bar.jsp ファイルによって、以下の 2 つの JSP タグ ライブラリがインポートされます。

<%@ taglib uri="webflow.tld" prefix="wf" %>
<%@ taglib uri="portal.tld" prefix="ptl" %>

アプリケーション内の別のページから [My Abitek] タブをクリックした場合は、hnav_bar.jsp は対象となるタブへの以下のリンクで JSP タグを使用しました。

<a href="<ptl:createPortalPageChangeURL pageName='<%= portalPageName %>'/>"><%=portalPageName%></a>

ポータルの ptl:createPortalPageChangeURL JSP タグは、ページ変更イベントの Webflow URL を生成します。

[My Avitek] ページでの動的データの表示

[My Avitek] ページで、動的ポートレットの 1 つ、summarycart を見てみます ([My Avitek] ページでは [My ショッピング カート] と表示されます)。

summarycart ポートレットの Webflow ネームスペース ファイルは、以下のとおりです。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥app
lication-sync¥webapps¥b2cPortal¥summarycartportlet.wf

ここには、以下のコードが含まれます。

    <presentation-origin node-name="step1" node-type="jsp">
<node-processor-info page-name="step1.jsp"
page-relative-path="/portlets/summarycart"/>
</presentation-origin>

step1.jsp ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥portlets¥summarycart¥step1.jsp

step1.jsp ファイルでは、Pipeline セッションから現在のショッピング カートを取得する Webflow タグと保存されたショッピング カートを取得する Webflow タグなど、JSP タグを組み合わせて使用します。

<webflow:getProperty id="shoppingCart"
property="<%=PipelineSessionConstants.SHOPPING_CART%>
"type="com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart"
scope="session" namespace="portal" />
<webflow:getProperty id="savedShoppingCart"
property="<%=PipelineSessionConstants.SAVED_SHOPPING_CART%>"
type="com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart"
scope="session" namespace="portal" />

デフォルトのポータル ページを指定する管理タスク

[My Avitek] の節で取り上げたプロパティのほとんどは、手動では編集せず、E-Business Control Center、および WebLogic Portal Administration Tools の [ポータル管理] 領域を使って定義しました。たとえば、[My Avitek] ページは、WebLogic Portal Administration Tools を使用することにより、b2cPortal アプリケーションのデフォルトの開始ページと指定されました。ここでは、このツールを起動する方法を説明し、デフォルトのページ設定のサンプル画面を示します。

  1. 新しいブラウザのウィンドウで以下の URL をポイントすると、WebLogic Portal Administration Tools が起動します。
    http://<host>:<port>/e2eAppTools/index.jsp

    これらの手順は、e2eDomain のサーバがまだ稼動中であると想定しています。e2eAppTools Web アプリケーションとサンプル アプリケーションは同時に実行できます。どちらの Web アプリケーションも同じ e2eApp エンタープライズ アプリケーションの一部であり、同じドメイン内で実行されます。

  2. ローカル マシン名 (localhost) またはリモート ホスト名、および WebLogic Server がリスンしているポート番号を置き換えます。WebLogic Portal アプリケーションでは、デフォルトのポート番号は 7501 です。URL の e2eAppTools 部分では大文字と小文字が区別されます。

  3. ユーザ名とパスワードの入力が要求されます。これらの値はサイトによって異なることがありますが、デフォルトは次のとおりです。
    Username: administrator
    Password: password

    ログイン値は、大文字と小文字が区別されます。これらの資格情報が機能しない場合は、管理者に問い合わせてください。サンプルのインストール後に、管理者アカウントのデフォルト値が変更された可能性があります。

  4. WebLogic Portal Administration Tools のメイン ページで、[ポータル管理] バナーのアイコンをクリックします。

  5. [ポータル管理ホーム] ページで b2cportal に対応する [Default Portal (Everyone)] をクリックします。

  6. [グループ ポータル管理ホーム] ページで [ページ&ポートレット] をクリックします。

  7. [ページおよびポートレット] ページで [ページの選択と順序設定] をクリックします。

    次の図はページの一部を示しています。


     

[My Avitek] ページが、どのようにしてデフォルトのホーム ページに指定されたかに留意してください。

WebLogic Portal Administration Tools の詳細については、『管理者ガイド』を参照してください。

WebLogic Portal Administration Tools を終了するには、ブラウザのウィンドウを閉じます。

次のステップ

ツアーを続けるには、バナーの [Products] タブを選択します。

 


[Products] ページ

[Products] タブをクリックすると、このページには中心となるポートレット catalog.jsp の製品カタログの最上位カテゴリがロードされます。カタログのテキストと画像は WebLogic Portal Administration Tools の [カタログ管理] 領域を使用して、すでに整理されています。ログイン ユーザの場合、[My ショッピング カート] と [注文履歴] の最新データが更新されました。

次の画面は、最初の [Products] ページのカテゴリを示しています。


 

[Products] ページの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

[Products] ページには [My Avitek] ページと同じポートレットの多くが組み込まれています。

さらに、この [Products] ページには catalog.jsp ポートレットが追加されています。このソース ファイルは、インストール済みディレクトリ BEA_HOME の下の、次のサブディレクトリにあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥portlets¥catalog

catalog.jsp ポートレットには、発生したカタログ イベントに応じて、さまざまなインクルード ファイルの JSP コードが組み込まれます。このことは、これ以降のページのカタログで各種アイテムを選択したときに確認できます。

catalog.jsp ポートレットの他に、これ以降の [Products] ページに表示される追加ポートレットは、商品評価と呼ばれます。このポートレットは、カテゴリの製品アイテムを 1 つまたは複数含むカタログ ページに表示されます。商品評価ポートレットは、WebLogic Workshop で作成された Web サービスを使って、選択された製品アイテムのコンシューマ レーティングを調べます。ポートレットのソース ファイル (evaluator.jsp、およびインクルード ファイル step1.jspstep2.jsp) は、インストール済みディレクトリ BEA_HOME の下の、次のサブディレクトリにあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥portlets¥evaluator

[Products] ページを構成するすべてのポートレットは、以下のファイルに定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥app
lication-sync¥webapps¥b2cPortal¥b2cPortal.portal

例:

 <page-name>Products</page-name
...
<portlet-pool>
<portlet-name>login</portlet-name>
<portlet-name>search</portlet-name>
<portlet-name>evaluator</portlet-name>
<portlet-name>summarycart</portlet-name>
<portlet-name>tourguide</portlet-name>
<portlet-name>catalog</portlet-name>
<portlet-name>subnav</portlet-name>
<portlet-name>orderhistory</portlet-name>
</portlet-pool>

デフォルト Webflow 内の位置

このアプリケーションの Webflow によって、[Products] タブを選択したときにこのカタログ ページが表示されました。

前の節で示したとおり、catalog.jsp ポートレットには、発生したカタログ イベントに応じて、さまざまなインクルード ファイルの JSP コードが組み込まれます。たとえば、以下の catalog.jspwebflow:getProperty タグは、Pipeline セッションから最後のカタログ イベントを取得します。

<webflow:getProperty
id="event"
type="java.lang.String"
property="<%= B2CPortalConstants.LAST_CATALOG_EVENT_ATTRIB %>"
scope="session"
namespace="portal" />

動的データの表示

6 つの製品カテゴリをロードした最初の [Products] ページでは、カタログ イベントは NULL でした。その結果、catalog_index.jsp ファイルが catalog.jsp ポートレットにインクルードされました。必要に応じて、catalog_index.jsp のコードを調べてください。このコードは、インストール済みディレクトリ BEA_HOME の下の、次のサブディレクトリにあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥portlets¥catalog

catalog_index.jsp ファイルには、カタログを繰り返し表示し、各カテゴリのプロパティを取り出すビュー イテレータがあります。まず、次のように webflow:getProperty JSP タグを使って、Pipeline セッションからカタログ カテゴリのビュー イテレータを取得します。

<webflow:getProperty
id="categories"
type="com.beasys.commerce.ebusiness.catalog.ViewIterator"
property="<%= PipelineSessionConstants.CATALOG_SEARCH_CATEGORIES%>"
scope="session"
namespace="portal" />

次にカテゴリの参照を繰り返し、各カテゴリを表示します。コーディングのサブセットを以下に示します。

<catalog:iterateViewIterator
id="category"
returnType="com.beasys.commerce.ebusiness.catalog.Category"
iterator="<%=categories%>">
<catalog:getProperty
id="categoryKey"
returnType="com.beasys.commerce.ebusiness.catalog.CategoryKey"
object="<%= category %>"
propertyName="key" />
<catalog:getProperty
id="largeImage"
returnType="com.beasys.commerce.ebusiness.catalog.ImageInfo"
object="<%= category %>"
propertyName="image"
getterArgument="<%= new Integer(Category.LARGE_IMAGE_INDEX ) %>" />
...

catalog_index.jsp の同じイテレータを使っている状態で、各テーブルのセルにはページのプロパティがいくつか表示されます。コーディングのサブセットを以下に示します。

<a href="<portlet:createWebflowURL namespace="catalogportlet"
event="link.category"extraParams="<%=linkParams +
java.net.URLEncoder.encode( categoryKey.getIdentifier())
%>"/>"><img src="<webflow:createResourceURL
resource='<%=largeImage.getUrl()%>'/>" width="180" height="136"
alt="<%=shortDesc%>" border="0"></a>

この処理によって、catalog.jsp ポートレットの最初の [Products] ページにカテゴリが表示されます。上記の HTML を見れば、カテゴリの画像をクリックした場合、次のページへの移行のために、link.category というイベントが生成されることがわかります。しかし、この最初の [Products] ページが表示される前にどんなイベントが発生したでしょうか。詳細については、次の節を参照してください。

最初の [Products] ページでのイベント

[Products] ページまたは [Shopping Cart] ページが表示されているときに、[My Avitek] タブをクリックすると、以下のような URL が表示されます (ここでは、見やすくするために何行かに改行してあります)。

http://<host>/<port>/b2cPortal/application?
origin=hnav_bar.jsp&event=bea.portal.framework.internal.refresh
&pageid=Products

更新イベントにより、最新データで更新されたページが再表示されます。動的データを含む [Products] ページ上のすべてのポートレットのデータが更新されます。更新されたこの [Products] ページには上位 6 レベルのカテゴリを示す最初のページが含まれます。

タブは、hnav_bar.jsp ファイルを介して提供されます。このファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥framework

hnav_bar.jsp ファイルによって、以下の 2 つの JSP タグ ライブラリがインポートされます。

<%@ taglib uri="webflow.tld" prefix="wf" %>
<%@ taglib uri="portal.tld" prefix="ptl" %>

アプリケーション内の別のページから [Products] タブをクリックした場合は、hnav_bar.jsp は対象となるタブへの以下のリンク内で JSP タグを使用しました。

<a href="<ptl:createPortalPageChangeURL pageName='<%= portalPageName %>'/>"><%=portalPageName%></a>

ポータルの ptl:createPortalPageChangeURL JSP タグは、ページ変更イベントの Webflow URL を生成します。

また、すでに示したとおり、この最初の [Products] ページでは、カタログ イベントは NULL です。この結果、catalog_index.jspcatalog.jsp ポートレットにロードされます。catalog.jsp ポートレットのコーディングは次のとおりです。

<webflow:getProperty
id="event"
type="java.lang.String"
property="<%= B2CPortalConstants.LAST_CATALOG_EVENT_ATTRIB %>"
scope="session"
namespace="portal" />
<%
if ( event == null )
{
%>
<jsp:include page="/portlets/catalog/catalog_index.jsp" flush="true" />

カテゴリ管理タスク

このサンプル アプリケーションのカタログでは、単純な 2 つのレベルのカテゴリ階層が使われています。最初のレベルはデフォルトのルート カテゴリで、2 番目のレベルは最初の [Products] ページに表示された 6 つのカテゴリで構成されています。ただし、WebLogic Portal カタログ機能では、WebLogic Portal のドキュメントで説明しているとおり、複数レベルの階層カテゴリがサポートされています。

このサンプル アプリケーションの 6 つのカテゴリは、ブラウザベースの WebLogic Portal Administration Tools の [カタログ管理] 領域で、前に定義したものです。必要に応じて、この節の指示に従って既存の定義を確認できます。

以下の手順は、e2eDomain のサーバがまだ稼動中であると想定しています。e2eAppTools Web アプリケーションとサンプル アプリケーションは同時に実行できます。どちらの Web アプリケーションも同じ e2eApp エンタープライズ アプリケーションの一部であり、同じドメイン内で実行されます。

  1. 新しいブラウザのウィンドウで以下の URL 形式を使うと、WebLogic Portal Administration Tools が起動します。
    http://<host>:<port>/e2eAppTools/index.jsp

    URL 内のローカル マシン名 (localhost) またはリモート ホスト名、および WebLogic Server がリスンしているポート番号を置き換えます。WebLogic Portal アプリケーションでは、デフォルトのポート番号は 7501 です。URL の e2eAppTools 部分では大文字と小文字が区別されます。

    例:

    http://localhost:7501/e2eAppTools/index.jsp

  2. ユーザ名とパスワードの入力が要求されます。これらの値はサイトによって異なることがありますが、デフォルトは次のとおりです。
    Username: administrator
    Password: password

    ログイン値は、大文字と小文字が区別されます。これらの資格情報が機能しない場合は、管理者に問い合わせてください。サンプルのインストール後に、管理者アカウントのデフォルト値が変更された可能性があります。

  3. WebLogic Portal Administration Tools のメイン ページで、[カタログ管理] バナーのアイコンをクリックします。

  4. [カタログ管理] ページで、下線付きの [カテゴリ] をクリックします。

    以下の画面が表示されます。


     

    下線付きのカテゴリを 1 つクリックします。たとえば、AviPix (0avipix) をクリックします(警告: 赤い X アイコンはクリックしないでください。カタログからそのカテゴリが削除されてしまいます。サンプル カタログ データの管理ページを使っていることを忘れないでください)。

  5. 表示された画面を下へスクロールして、そのカテゴリを表す画像の位置を確認します。

カタログ管理タスクの詳細については、WebLogic Portal のドキュメントを参照してください。

WebLogic Portal Administration Tools を終了するには、ブラウザのウィンドウを閉じます。

次のステップ

ツアーを続けるには、[AviPix Consumer Digital Cameras] カテゴリをクリックします。

 


Category ポートレット

この特定のカテゴリの製品アイテムはカタログからロードされ、このページに表示されます。たとえば、次のように表示されます。


 

[カテゴリ] ページの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

この特定のカテゴリの製品アイテムはカタログからロードされ、このページに表示されます。最上位のバナーには現在のカテゴリを強調表示したグラフィックがあります。ページの下部にある商品評価ポートレットには、ログイン ユーザ Rachel Adams がこのカテゴリの製品アイテムのレーティングを入手できるメニューがあります。

WebLogic イベントの処理によって、発生する link.category イベントが決定され、その結果、category.jsp ファイルが中心となる catalog.jsp ポートレットにロードされました。

現在のサンプル アプリケーションのページに結果として表示されたサンプルの URL は、以下のとおりです (ここでは、見やすくするために何行かに改行してあります)。

http://localhost:7501/b2cPortal/application
?origin=catalog_index.jsp
&event=bea.portal.framework.internal.portlet.event
&pageid=Products&portletid=catalog
&wfevent=link.category&wlcs_catalog_category_id=0avipix

サンプルの URL では、最初の状態は 2 番目、3 番目、4 番目の行に示されています。Webflow イベントは最後の行に示されています。link.category イベントが発生しています。このイベントの結果が、サンプル アプリケーションで表示されているページです。直前のページで選択されたカテゴリ 0avipix (この例の場
合) の製品アイテムが表示されます。番号 0 は 6 つの製品カテゴリのインデックスです。

デフォルト Webflow 内の位置

このアプリケーションの Webflow により、直前のページで選択されたカテゴリのデータがロードされました。catalog.jsp ポートレットには、発生したカタログ イベントに応じて、さまざまなインクルード ファイルの JSP コードが組み込まれます。たとえば、以下の catalog.jspwebflow:getProperty タグは、Pipeline セッションから最後のカタログ イベントを取得します。

<webflow:getProperty
id="event"
type="java.lang.String"
property="<%= B2CPortalConstants.LAST_CATALOG_EVENT_ATTRIB %>"
scope="session"
namespace="portal" />

catalog.jsp ポートレットでは、返されたイベント属性が、以下のようにチェックされます。

...
<%
}
else if ( ( event.equals( "link.category" ) ) ||
( event.equals( "button.category.buy" ) ) ||
( event.equals( "button.category.save") ) )
{
%>
...
<jsp:include page="/portlets/catalog/category.jsp" flush="true" />

この場合、link.category イベントが発生したために、category.jsp ファイルが catalog.jsp ポートレットに取り込まれます。

動的データの表示

category.jsp ファイルでは、直前のページで選択したカテゴリを Pipeline セッションから取得します。

<webflow:getProperty
id="category"
type="com.beasys.commerce.ebusiness.catalog.Category"
property="<%= PipelineSessionConstants.CATALOG_CATEGORY %>"
scope="session"
namespace="portal" />

次に、一連の JSP タグを使って、現在のカテゴリについてのプロパティを取得します。

例:

<catalog:getProperty
id="headerImage"
returnType="com.beasys.commerce.ebusiness.catalog.ImageInfo"
object="<%= category %>"
propertyName="image"
getterArgument="<%= new Integer( CatalogItem.SMALL_IMAGE_INDEX ) %>" />

次に、ビュー イテレータを使って、このカテゴリの製品アイテムを Pipeline セッションから取得します。

<webflow:getProperty
id="items"
type="com.beasys.commerce.ebusiness.catalog.ViewIterator"
property="<%= PipelineSessionConstants.CATALOG_ITEMS %>"
scope="session"
namespace="portal" />

次に製品アイテムを繰り返し参照して、catalog.jsp ポートレット内のそれぞれのプロパティを表示します。コーディングのサブセットを以下に示します。

<catalog:iterateViewIterator
id="item"
returnType="com.beasys.commerce.ebusiness.catalog.ProductItem"
iterator="<%= items %>">
<catalog:getProperty
id="itemImage"
returnType="com.beasys.commerce.ebusiness.catalog.ImageInfo"
object="<%= item %>"
propertyName="image"
getterArgument="<%= new Integer( CatalogItem.SMALL_IMAGE_INDEX ) %>" />
<catalog:getProperty
id="currentPrice"
returnType="com.beasys.commerce.axiom.units.Money"
object="<%= item %>"
propertyName="currentPrice" />
...

category.jsp には、数多くのボタン ([詳細]、[今すぐ購入]、[保留]) があるため、その他の作業も行います。たとえば、[詳細] リンクを作成するには、HTTP 要求パラメータを設定します。

<% 
String linkParams =
HttpRequestConstants.CATALOG_CATEGORY_ID + "=" +
java.net.URLEncoder.encode( categoryKey.getIdentifier()
) + "&" +
HttpRequestConstants.CATALOG_ITEM_SKU + "=" +
itemKey.getIdentifier();
%>

category.jsp 内の同じイテレータを使っている状態で、各テーブルのセルにはページのプロパティが表示されます。コーディングの小さなサブセットを以下に示します。追加コーディングについては、category.jsp 内のテーブルを参照してください。

<a href="<portlet:createWebflowURL namespace="catalogportlet" event="link.item"
extraParams="<%=linkParams%>" />"><img src="<webflow:createResourceURL
resource="<%=itemImage.getUrl()%>"/>" width="187" height="139" alt=""
border="0"></a>

上記に示したコードが使われるのは、ユーザがアイテムの画像または [詳細] ボタンのグラフィックをクリックした場合です。

上記の HTML サブセットを見れば、ユーザが製品アイテムの画像をクリックした場合、次のページへの移行のために、link.item というイベントが生成されることがわかります。しかし、この最初の [Products] ページが表示される前にどんなイベントが発生したでしょうか。詳細については、次の節を参照してください。

イベント

直前の [Products] ページでは、catalog_index.jsp ファイルが catalog.jsp ポートレットに取り込まれると、ポートレットの HTML テーブルに以下のコードがインクルードされます。

<a href="<portlet:createWebflowURL namespace="catalogportlet" event="link.category"
extraParams="<%=linkParams + java.net.URLEncoder.encode( categoryKey.getIdentifier() )%>"
/>"><img src="<webflow:createResourceURL resource='<%=largeImage.getUrl()%>'/>"
width="180" height="136" alt="<%=shortDesc%>" border="0"></a>

バナー グラフィックまたは (catalog_index.jsp ファイルを表示していた) catalog.jsp 内の特定のカテゴリをクリックすると、link.category Webflow イベントがトリガされました。これによって、category.jsp ファイルが catalog.jsp ポートレットにロードされ、次にこのポートレットに、選択したカテゴリを構成する製品アイテムが表示されました。

すべてのカタログ イベントは、catalog.jsp ポートレットの以下の Webflow ファイルに定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥app
lication-sync¥webapps¥b2cPortal¥catalogportlet.wf

catalogportlet.wf に定義されているイベントの 1 つは次のとおりです。

	<event event-name="link.category">
<destination namespace="catalogportlet"
node-name="getCategoryIP" node-type="inputprocessor"/>
</event>
...
<processor-origin node-name="getCategoryIP"
node-type="inputprocessor"><node-processor-info
class-name="examples.e2e.b2c.catalog.webflow.GetCategoryIP"/>
<event-list>
<event event-name="success">
<destination namespace="catalogportlet"
node-name="getCategory" node-type="pipeline"/>
</event>
</event-list>
</processor-origin>
...

link.category イベントでは、getCategoryIP という入力プロセッサが使用されます。これは Java プログラムで、HTTP 要求から Category ID String を取り出し、ID String を検証し、ID String に基づいて CategoryKey を作成し、これをセッション スコープ (有効範囲) の PipelineSession に追加します。この入力プロセッサのソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥WEB-INF¥src¥examples¥e2e¥b2c¥catalog¥webflow¥GetCategoryIP.java

カテゴリへのアイテムの割り当て

サンプル アプリケーションでは、ブラウザベースの WebLogic Portal Administration Tools の [カタログ管理] を使って、製品アイテムがカタログに割り当てられました。この節では、その基本手順を概説します。詳細については、WebLogic Portal のドキュメントを参照してください。

注意: カタログに何百というカテゴリと何千何万というアイテムがある場合、WebLogic Portal Administration Tools を使用した割り当ては、明らかに非現実的な作業です。このような場合は、WebLogic Portal Administration Tools の代わりに、WebLogic Portal の DBLoader ツールを使うことができます。

以下の手順は、e2eDomain のサーバがまだ稼動中であると想定しています。e2eAppTools Web アプリケーションとサンプル アプリケーションは同時に実行できます。どちらの Web アプリケーションも同じ e2eApp エンタープライズ アプリケーションの一部であり、同じドメイン内で実行されます。

  1. 新しいブラウザのウィンドウで以下の URL 形式を使うと、WebLogic Portal Administration Tools が起動します。
    http://<host>:<port>/e2eAppTools/index.jsp

    URL 内のローカル マシン名 (localhost) またはリモート ホスト名、および WebLogic Server がリスンしているポート番号を置き換えます。WebLogic Portal アプリケーションでは、デフォルトのポート番号は 7501 です。URL の「e2eAppTools」部分では大文字と小文字が区別されます。

    例:

    http://localhost:7501/e2eAppTools/index.jsp

  2. ユーザ名とパスワードの入力が要求されます。これらの値はサイトによって異なることがありますが、デフォルトは次のとおりです。
    Username: administrator
    Password: password

    ログイン値は、大文字と小文字が区別されます。これらの資格情報が機能しない場合は、管理者に問い合わせてください。サンプルのインストール後に、管理者アカウントのデフォルト値が変更された可能性があります。

  3. WebLogic Portal Administration Tools のメイン ページで、[カタログ管理] バナーのアイコンをクリックします。

  4. [カタログ管理] ページで、下線付きの [カテゴリ] をクリックします。

  5. [カタログ] 階層の表示画面で、アイテムの追加と削除を行うカテゴリやサブカテゴリをクリックします (このサンプル アプリケーションのカテゴリにはサブカテゴリがありません)。

  6. カテゴリが階層表示されたら、その下線付きのリンクをクリックします。たとえば、AviPro カテゴリをクリックしたとします。ページの上方に、以下のテキストが表示されていることがわかります。
カテゴリの編集: AviPro
必要な情報を入力して、 [save] アイコンをクリックしてください。
このカテゴリに割り当てられているアイテムを変更するには、ここをクリックしてください。

このページのテキスト「...ここ」のリンクをクリックします。

以下のような画面が表示されます。


 

[カテゴリに割り当てられたアイテム] テキスト ボックスには、すでにこのカテゴリにあるアイテムが表示されます。追加または削除するアイテムの検索は、キーワード、クエリ、非カテゴリ化アイテム (カテゴリに分けられていないアイテム) という 3 つのモードで実行できます。検索結果は左側のテキスト ボックスに表示されます。カテゴリにアイテムを追加するには、右矢印をクリックして右側のテキスト ボックスにアイテムを移動します。

詳細については、WebLogic Portal のドキュメントを参照してください。

WebLogic Portal Administration Tools を終了するには、ブラウザのウィンドウを閉じます。

次のステップ

ツアーを続けるには、カテゴリの AviPix 5000 製品アイテムの画像をクリックします。

 


Product Item ポートレット

製品アイテムの詳細は、カタログからロードされます。ここまでのプロセスで、設計チームは管理者と連携し、カタログの各アイテムについてより大きな画像と詳しい説明を決定しました。アイテムの詳細の指定には、WebLogic Portal Administration Tools の [カタログ管理] 領域を使用しました。その結果、ポートレットの画面は以下のようになります。


 

Product Item ポートレットの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

WebLogic イベントの処理によって、発生する link.item イベントが決定され、その結果、category.jsp ファイルが中心となる catalog.jsp ポートレットにロードされました。

現在のサンプル アプリケーションのページに結果として表示されたサンプルの URL は、以下のとおりです (ここでは、見やすくするために何行かに改行してあります)。別の製品アイテムを選択した場合、サンプル ページの URL は異なります。

http://blues:7501/b2cPortal/application
?origin=category.jsp
&event=bea.portal.framework.internal.portlet.event
&pageid=Products&portletid=catalog
&wfevent=link.item
&wlcs_catalog_category_id=0avipix&wlcs_catalog_item_sku=pix5000

サンプルの URL では、最初の状態は 2 番目、3 番目、4 番目の行に示されています。Webflow イベントは最後の行に示されています。link.item イベントが発生しています。このイベントの結果が、サンプル アプリケーションで表示されているページです。直前のページで選択されたカテゴリ 0avipix (この例の場
合) の製品アイテムが表示されます。番号 0 は 6 つの製品カテゴリのインデックスです。この例では、選択された特定のアイテムは AviPix 5000 で、その在庫商品識別番号 (SKU) は pix5000 です。

デフォルト Webflow 内の位置

このアプリケーションの Webflow により、直前のページで選択された特定の製品アイテムのデータがロードされました。catalog.jsp ポートレットには、発生したカタログ イベントに応じて、さまざまなインクルード ファイルの JSP コードが組み込まれます。たとえば、以下の catalog.jspwebflow:getProperty タグは、Pipeline セッションから最後のカタログ イベントを取得します。

<webflow:getProperty
id="event"
type="java.lang.String"
property="<%= B2CPortalConstants.LAST_CATALOG_EVENT_ATTRIB %>"
scope="session"
namespace="portal" />

catalog.jsp ポートレットでは、返されたイベント属性が、以下のようにチェックされます。

...
<%
}
else if ( ( event.equals( "link.item" ) ) ||
( event.equals( "button.item.buy" ) ) ||
( event.equals( "button.item.save") ) )
{
%>
...
<jsp:include page="/portlets/catalog/item.jsp" flush="true" />

この場合、link.item イベントが発生したために、item.jsp ファイルが catalog.jsp ポートレットに取り込まれます。

動的データの表示

item.jsp ファイルでは、Pipeline セッションからアイテムのカテゴリを取得します。次に、一連の JSP タグを使って、現在のカテゴリとその現在のアイテムについてのプロパティを取得します。以下の例は、2 つの JSP タグを示しています。

<catalog:getProperty
id="itemImage"
returnType="com.beasys.commerce.ebusiness.catalog.ImageInfo"
object="<%= item %>"
propertyName="image"
getterArgument="<%= new Integer( CatalogItem.LARGE_IMAGE_INDEX
%>" />
<catalog:getProperty
id="currentPrice"
returnType="com.beasys.commerce.axiom.units.Money"
object="<%= item %>"
propertyName="currentPrice" />

item.jsp には、数多くのボタン ([今すぐ購入]、[保留]) があるため、その他の作業も行います。たとえば、[今すぐ購入] リンクを作成するには、そのグラフィックの HTTP 要求パラメータを設定します。

<catalog:getProperty
id="itemKey"
returnType="com.beasys.commerce.ebusiness.catalog.ProductItemKey"
object="<%= item %>"
propertyName="key" />
<% 
String linkParams =
HttpRequestConstants.CATALOG_ITEM_SKU + "=" + itemKey.getIdentifier();
%>

item.jsp の以下のコードは、[今すぐ購入] ボタンのグラフィックをユーザがクリックすると、どのように URL が構成されるかを示しています。

<a href="<portlet:createWebflowURL namespace="catalogportlet" 
event="button.item.buy"
extraParams="<%= linkParams %>" />"><img src="<webflow:createResourceURL
resource='<%=imagesPath + "prod_step2_buynow.gif"%>'/>" width="63" height="18"
alt=""
border="0"></a>

また、item.jsp ファイルでは、アイテムの価格表示を準備するときに、国際化 (I18N) JSP タグを使って、カタログに定義される通貨タイプを取得します。

<i18n:getMessage bundleName="/commerce/currency"
messageName="<%=currentPrice.getCurrency()
%>"/><%=WebflowJSPHelper.priceFormat(
currentPrice.getValue() )%>

イベント

直前の [Products] ページで、特定の製品アイテムをクリックすると、link.item Webflow イベントがトリガされます。その結果、item.jsp ファイルが catalog.jsp ポートレットにロードされます。

すべてのカタログ イベントは、catalog.jsp ポートレットの以下の Webflow ファイルに定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project
¥application-sync¥webapps¥b2cPortal¥catalogportlet.wf

catalogportlet.wf に定義されているイベントの 1 つは次のとおりです。

<event event-name="link.item">
<destination namespace="catalogportlet"
node-name="getItemCategoryIP"
node-type="inputprocessor"/>
</event>
...

link.item イベントでは、getItemCategoryIP という入力プロセッサが使用されます。これは Java プログラムで、HTTP 要求から SKU 文字列を取り出し、SKU 文字列を検証し、SKU 文字列に基づいて ProductItemKey を作成し、これをセッション スコープ (有効範囲) の PipelineSession に追加します。この入力プロセッサのソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥
WEB-INF¥src¥examples¥e2e¥b2c¥catalog¥webflow¥GetItemCategoryIP.java

製品アイテム データの追加または変更

特定のアイテムのデータは、カタログ データをカタログに追加する場合と同様の方法で、WebLogic Portal Administration Tools を使って追加します。この管理タスクをまだ読んでいない場合は、カテゴリへのアイテムの割り当てを参照してください。

次のステップ

ツアーを続けるには、[Products] ページを下へスクロールして、商品評価ポートレットから AviPix 5000 を選択します。[Go] ボタンをクリックすると、レーティングが Web サービスから返され、ポートレットに表示されます。次の節をお読みください。

 


商品評価ポートレットと Web サービス

商品評価ポートレットで製品アイテムを選択し、[Go] ボタンをクリックした後、製品レーティングの Web サービスの結果を反映してポートレットが更新されました (サンプルでは、結果を表示するために画面を下にスクロールする必要があります)。

アプリケーションの設計と開発のサイクル時には、BEA WebLogic Workshop を使用して製品レーティングの Web サービスを作成しました。次に、Portlet Wizard を使ってこの Web サービスのインタフェースを生成しました。

最後に、インタフェース コードを商品評価ポートレットにインクルードし、グラフィック アーティストによる初期段階の設計プロトタイプ作業に基づいて、表示コーディングを完了しました。また、Web サービス ツアーの説明にあるように、Web サービスを e2eApp 内の Web アプリケーションとしてパッケージ化しました。

商品評価ポートレットの技術詳細

商品評価ポートレット evaluator.jsp は、[Products] ページの下の方に表示されます。まず、ポートレットはインクルード ファイル step1.jsp を介して、割引広告を表示します。[Products] ページが更新され、商品評価ポートレットが具体的な製品アイテムがロードされたと判断すると、step2.jsp ファイルがインクルードされて、ログイン ユーザが製品レーティングを取得できるようになります。製品レーティングを検索するために WebLogic Workshop で以前作成した Web サービスを使うという点で、これは興味深いポートレットです。

WebLogic Workshop は視覚的な開発環境で、アプリケーション開発者も J2EE の専門家も、エンタープライズクラスの Web サービスの構築とデプロイを簡単に行えます。製品は次の 2 つの主要コンポーネントで構成されています。

  1. 開発者が Java コードを記述して Web サービスを実装できる設計時ツール。

  2. Web サービス インフラストラクチャ、アプリケーションのテスト、デバッグ、デプロイ環境を提供する実行時フレームワーク。

設計時ツールと実行時フレームワークの接点は、Java Web Service (JWS) ファイルと関連する制御 (CTRL) ファイルです。JWS ファイルは、追加機能を表すために (Javadoc 構文を使用して) 注釈が付けられた標準の Java ファイルです。注釈を使用すると、Web サービスとそのプロパティをグラフィカルに表示できます。また、フレームワークは注釈を使用して、EJB および J2EE のコードを生成し、Web サービスを実行します。通常、制御ファイルには、メソッド定義の集まりが含まれます、この定義によって、データベースや別の Web サービスなどのリソースに簡単にアクセスできます。

もう 1 つの重要なファイルは、Web サービスを説明する Web サービス記述言語 (Web Services Description Language: WSDL) ファイルです。WSDL ファイルは、Web サービスが利用可能なプロトコルの他、Web サービスがエクスポーズするすべてのメソッドを (送受信可能な XML メッセージの形式で) 記述します。WSDL ファイルは、クライアント アプリケーションが Web サービスを使用するために必要な情報をすべて提供します。

開発では、WebLogic Workshop が提供するブラウザ ベースのテスト フォームを使用し、Web サービスから返される結果が予測どおりであるかを確認します。これをセット アップするために、e2eApp エンタープライズ アプリケーションの一部として、workshop Web アプリケーションをデプロイしました。Workshop の Web アプリケーションには、WebLogic Workshop で作成した productEvalWSCpaymentWS Web サービスが含まれます。結果的に、e2eDomain のサーバ インスタンスで、これらの Web サービスに WebLogic Workshop テスト ページを実行できます。テスト ページはブラウザベースです。たとえば、新しいブラウザ ウィンドウで、以下を開きます。

http://localhost:7501/workshop/productEvalWSC/EvalProduct.jws

URL の大文字と小文字は区別されます。Product Evaluator Web サービスの一連のテスト フォーム画面のツアーを完了するには、Web サービス ツアーを参照してください。以下のサンプル画面は、Web サービスと会話中のテスト フォームを 1 つだけ示しています。前回のテスト フォーム画面で、取得する評価データの productId (SKU) として、pix1000 を指定しました。次の画面は、getReliabilityRating メソッドのテストを実行した直後のものです。


 

Web サービスが整数の 2 を返していることがわかります。商品評価ポートレットでは、この結果、最高 5 つの星のうち 2 つの星が表示されます。たとえば、次のように表示されます。


 

WebLogic Workshop で Web サービスを作成した後、WebLogic Workshop に付属の Portlet Wizard を使用して WSDL ファイルを指定し、クライアント インタフェースを生成できます。この処理の説明については、Web サービス ツアーを参照してください。この説明は、サンプル アプリケーションの「はじめに」のページにも記載されています。

表示アイテムの決定

商品評価ポートレットの JSP ファイルは、次のとおりです。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥evaluator¥evaluator.jsp

まず、割引広告を表示する step1.jsp ファイルがインクルードされます。


 

[Products] ページ上の別のポートレットにあるイベントによって、商品評価ポートレットが具体的な製品アイテム データの存在を判断できる場合、商品評価ポートレットは製品レーティングを取得できる step2.jsp ファイルをインクルードします。step2.jsp ポートレットでは、最初にプルダウン メニューの項目が 1 つ以上表示されます。たとえば、次のように表示されます。


 

ポートレットのメニューからアイテムを選択し、[Go] ボタンをクリックすると、ポートレット内の step2.jsp ファイルは、Web サービスから返された結果で更新されます。たとえば、AviPix 5000 カメラを選択した場合、次のようになります。


 

evaluator.jsp ポートレットによって実行される最初のアクションは、Pipeline セッションから最後のカタログ イベントを取得することです。

<webflow:getProperty
id="event"
type="java.lang.String"
property="<%= B2CPortalConstants.LAST_CATALOG_EVENT_ATTRIB %>"
scope="session"
namespace="portal" />

カタログ イベントが NULL の場合、静的な割引広告が表示されます。

<jsp:include page="/portlets/evaluator/step1.jsp" flush="true" /> 

この jsp:include タグは、最初の [Products] ページの下部に表示されていたグラフィックを取り込みます。

カタログ イベントが NULL でない場合、どのイベント タイプが発生したかはユーザが決定します。イベントが link.categorybutton.category.buybutton.category.save のいずれかの場合、evalEvent を「browse」に設定しました。イベントが link.itembutton.item.buybutton.item.save のいずれかの場合、evalEvent を「detail」に設定しました。最後に、イベントが button.searchbutton.search.buybutton.search.save のいずれかの場合、evalEvent を「search」に設定しました。この値によって、どの項目 (複数可) を製品レーティングのプルダウン メニューに一覧表示するか、およびどのレーティング データを Web サービスから取得するかが決定されるため、ポートレットにはこの値が重要です。

evalEvent 値を Pipeline に渡すには、webflow:setProperty JSP タグを使います。

<webflow:setProperty
property="B2CPortalConstants.PRODUCT_EVAL_ATTRIB"
scope="request"
value="<%=evalEvent%>"
namespace="portal" />

Web サービスの使用

ここで、Evaluator.jspstep2.jsp ポートレットをインクルードします。商品評価ポートレットが、自らに転記する場合、要求された製品アイテムを対象とした選択リストと共に productEvalIP 入力プロセッサの結果が表示されます。自らに転記しない場合は、製品アイテムの未選択リストが表示され、レーティング情報は (まだ) 表示されません。

step2.jsp ファイルには、次の Web サービスが含まれます。

<%@ page import="org.openuri.www.* "%>
<%@ page import="org.openuri.www.x2002.x04.soap.conversation.* "%>
<%@ page import="java.io.IOException" %>
<%@ page import="java.rmi.RemoteException" %>
<%@ page import="productEvalWSC.EvalProduct_Impl" %>
<%@ page import="productEvalWSC.EvalProductSoap" %>

Pipeline セッションから evalEvent 値を取得します。

<webflow:getProperty
id="evalEvent"
type="java.lang.String"
property="B2CPortalConstants.PRODUCT_EVAL_ATTRIB"
scope="request"
namespace="portal" />

step2.jsp では、次にビュー イテレータを使用して、カテゴリを指定してアイテム (複数可) を取得するか、特定のアイテムを取得します。ユーザがアイテムを選択して [Go] ボタンをクリックした場合は、WebLogic Workshop で定義した EvalProduct.jws Web サービスを呼び出します。また、Portlet Wizard を使用して Web サービス インタフェース コードも作成しました。このコードには Web サービスの WSDL への参照が含まれています。

<%
if (request.getParameter("origin").equals("step2.jsp") &&
request.getParameter("wfevent").equals("button.evaluator.go"))
{
String productEvaluation = request.getParameter("productEvaluation");
%>
<!-- Portlet Wizard generated web services interfaces code -->
<%  
EvalProduct_Impl m_Proxy = null;
EvalProductSoap m_ProxySoap = null;
String m_conversationID = session.getId();
String comments = "";
int valueRating = 0;
int reliabilityRating = 0;
int overallRating = 0;
boolean webServiceAvail = true;
	String serverNamePort = "http://" + request.getServerName() + ":"
+ request.getServerPort() + "/";
	try
{
m_Proxy = new EvalProduct_Impl(serverNamePort +
"workshop/productEvalWSC/EvalProduct.jws?WSDL");
}
catch (IOException ex)
{
ex.printStackTrace();
webServiceAvail = false;
}
m_ProxySoap = m_Proxy.getEvalProductSoap();
	try
{
// Set up the header objects we'll need
StartHeader startHeader =
new StartHeader( m_conversationID,
serverNamePort
+ "workshop/productEvalWSC/EvalProduct.jws");
ContinueHeader continueHeader =
new ContinueHeader( m_conversationID );
// Start the conversation
GetEvaluation getEvaluation = new GetEvaluation(productEvaluation);

if (m_ProxySoap.getEvaluation(getEvaluation,
startHeader).getGetEvaluationResult().equals("SUCCESS"))
{
// Continue the conversation
comments = m_ProxySoap.getComments(null,
continueHeader).getGetCommentsResult();
			// Continue the conversation
reliabilityRating = m_ProxySoap.getReliabilityRating(null,
continueHeader).getGetReliabilityRatingResult();

// Continue the conversation
overallRating = m_ProxySoap.getOverallRating(null,
continueHeader).getGetOverallRatingResult();

// Continue the conversation
valueRating = m_ProxySoap.getValueRating(null,
continueHeader).getGetValueRatingResult();
}
...

エラー処理などの追加コーディングについては、step2.jsp コードを参照してください。Web サービスから製品レーティングを受け取った後、その結果を step2.jsp の作業の一部としてポートレットに表示します。

商品評価ポートレットの開発中、WebLogic Workshop、および Portlet Wizard をどのように使用したかについては、「Web サービス ツアー」を参照してください。これは、このサンプルの「はじめに」ページからも参照できます。

次のステップ

ツアーを続けるには、製品アイテム AviPix 5000 の隣に表示されている [今すぐ購入] ボタンをクリックします。

 


[今すぐ購入] ボタンと、WebLogic Integration AI を介した在庫チェック

[今すぐ購入] ボタンをクリックすると、更新されたページの summarycart ポートレット (My ショッピングカート) で [現在のアイテム] リストにアイテムを追加した Webflow イベントがトリガされます。同じ製品アイテムに対して [今すぐ購入] を 2 回以上クリックすると、数量カラムが更新されます。価格と割引情報を含む完全なショッピング カートは、[チェックアウト] ボタンまたは [Shopping Cart] タブをクリックするまで表示されません。次のサンプル画面では、AviPrint 200 カメラがすでに入っているカートに、AviPix 5000 カメラが追加されました。サンプル アプリケーションでは、カートの [現在のアイテム] リストと [保存されているアイテム] リストが異なる場合があります。


 

[今すぐ購入] ボタンの技術詳細

[今すぐ購入] ボタンは、ユーザがカテゴリ ページ、あるいはアイテムの詳細ページまたは検索結果ページを参照しているときに、特定のアイテムに対して選択できます。イベント タイプは、ページによって異なりますが、catalogportlet.wf Webflow ファイルに定義されているとおり、以下のいずれかとなります。

[今すぐ購入] ボタンを選択すると、アイテムがユーザのショッピング カートに追加される前に、注文を確実に履行できるように在庫チェックが実行されます。データベースには、製品アイテムについて、現在、最小、最大の在庫に関するデータを保存した在庫テーブルがあります。在庫テーブルには、WebLogic Integration の Application Integration (AI) コンポーネントから、読み込み専用モードでアクセスします。

たとえば、この b2cPortal の [Products] ページで、複数のポートレットに対して
[今すぐ購入] ボタンをクリックすると、このチェックが行われます。ショッピング カートにすでに入っているアイテムの数量を更新しようとして、ユーザがショッピング カートの ste1.jsp ポートレットに新しい値を入力して [再計算] ボタンをクリックした場合にも、在庫チェックが実行されます。

在庫チェックの実装について説明する前に、複数のポートレット ページで [今すぐ購入] リンクがセット アップされる方法を見てみましょう。たとえば、catalog.jsp ポートレットにインクルードされるアイテム jsp ファイルからは、次のように設定されます。

<a href="<portlet:createWebflowURL namespace="catalogportlet"
event="button.item.buy"
extraParams="<%= linkParams %>" />"><img src="<webflow:createResourceURL
resource='<%=imagesPath + "prod_step2_buynow.gif"%>'/>" width="63" height="18"
alt=""
border="0"></a>

上記の HTML サブセットでは、ユーザが [今すぐ購入] 画像をクリックした場合、次のページへの移行のために、button.item.buy というイベントが生成されます。linkParams パラメータには、特定のアイテムについての情報が含まれます。このデータは、一連の <catalog:getProperty...> JSP タグにより、item.jsp 処理ですでに収集されています。その後に以下の処理が行われます。

<% 
String linkParams =
HttpRequestConstants.CATALOG_ITEM_SKU + "=" + itemKey.getIdentifier();
%>

在庫チェック

在庫チェックは、CheckInventoryPC Pipeline コンポーネントで実装されます。このソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥
examples¥e2e¥b2c¥shoppingcart¥pipeline¥CheckInventoryPC.java

この Pipeline コンポーネントは、在庫をチェックし、追加の値を入れます。このサンプル アプリケーションでは、Pipeline コンポーネントはショッピング カートの内容が変更される度に呼び出されます。本番環境では、パフォーマンス上の理由からビジネス ロジックに基づいてこの動作を変更した方がよい場合があります。たとえば、在庫の実際の数量を保持し、在庫にある数量とショッピング カートにある数量との差に基づいてさまざまなメッセージを示すことで、アイテムがショッピング カートに初めて入れられたときにだけ在庫をチェックするようにします。

CheckInventoryPC Pipeline コンポーネントは、InventoryProvider SPI と連動します。このソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥common¥inventory¥spi¥*.java

この SPI は checkInventory リモート メソッドを含むステートレス セッション Bean です。このメソッドは、次の処理を行います。

次のステップ

ツアーを続けるには、製品カタログをブラウズし、カートの [現在のアイテム] リストと [保存されているアイテム] リストに、製品アイテムを 4 〜 5 個追加してください。カート内に多くのアイテムを入れると、[Shopping Cart] ページのさまざまなオプションを簡単に試すことができます。

その練習の一環として、Search ポートレットを使用してください。たとえば、キーワード camera を入力して、[Go] ボタンをクリックします。検索結果ページで、いくつかのアイテムを [現在のアイテム] リストと [保存されているアイテム] リストに追加します。次に、Search Results ポートレットについての以下の説明を読みます。

 


Search Results ポートレット

製品カタログに用意されている検索機能は、管理者が製品アイテムに割り当てたキーワードに基づいています。キーワードは WebLogic Portal Administration Tools の [カタログ管理] 領域を使って割り当てました。開発チームと管理者は協力して各アイテムに最も適したキーワードを決定できます。既存のキーワードについて、および検索の [Go] ボタンに関連付けられた Webflow イベントなどのイベントについては、この節をお読みください。次の画面は、「camera」と入力して [Go] をクリックした後の、Search Results ポートレットの表示の一部を示したものです。


 

Search Results ポートレットの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

search_results.jsp ポートレットには、製品アイテムについて、キーワードで検索した結果の情報が示されます。顧客は、この結果を参照できます。検索結果は、ポートレット、Webflow、カタログ、i18n (国際化) JSP タグの組み合わせでアセンブルされます。

一致が発生するには、すでに 1 つ以上の製品アイテムに関連付けられているキーワードを顧客が入力している必要があります。製品アイテムのキーワードは、Weblogic Portal Administration Tools の [カタログ管理] 領域で管理者が割り当てました。キーワードと WebLogic Portal Administration Tools の詳細については、後述します。

注意: WebLogic Portal コマース サービスでは、キーワード検索の他にクエリベースの検索を使用できます。このサンプル アプリケーションのスコープを簡素化するため、ここではキーワードベースの検索しか実装していません。クエリベースの検索の詳細については、WebLogic Portal のドキュメントを参照してください。

デフォルトでは、search_results.jsp ポートレットは以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥portlets¥catalog

検索入力ボックス、[Go] ボタンのグラフィック、および処理を提供する searchform.jsp ポートレットは、デフォルトでは以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥portlets¥search

開発者は、このサンプル アプリケーションを実行する際に、ブラウザに表示される前の JSP コードについて理解することが重要です。そのため、この節で使用されるコードの断片や [コードを表示] リンクでは、特定のポートレットのブラウザで表示する前の JSP ファイルについて説明し、これを示します。

デフォルト Webflow 内の位置

顧客が searchform.jsp ポートレットにキーワードを入力して [Go] ボタンをクリックすると、[Products] ページに search_results.jsp が表示されます。顧客は、search_results.jsp ポートレットから次の操作を実行できます。

WebLogic Platform は E-Business Control Center (EBCC) を備えています。これは、ルール定義、Webflow 編集、ポータルの作成および管理などの複雑なタスクを簡易化するグラフィック ツールです。EBCC の Webflow エディタと Pipeline エディタは、Webflow および Pipeline の XML コンフィグレーション ファイルの作成、変更、検証に役立つよう設計されています。必要に応じて、EBCC を起動し、e2eApps について、既存の Webflow 定義と Pipeline 定義を調べてください。

たとえば、以下の手順を行います。

  1. Windows システムで、[スタート] メニューをクリックし、[プログラム|BEA WebLogic Platform 7.0|WebLogic Portal 7.0|E-Business Control Center] を選択します。

  2. 画面の左上の [プロジェクトを開く] アイコンをクリックします。たとえば、次のように表示されます。


     

  3. [プロジェクトを開く] ダイアログ ウィンドウから、以下のディレクトリに移動します。
    weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project

  4. このディレクトリにインストールされているプロジェクト ファイル e2eApp-project.eaprj を選択して開きます。

  5. [エクスプローラ] ウィンドウで、下方の [サイト インフラストラクチャ] タブを選択します。次に [Webflow/Pipelines] アイコンをクリックします。このアイコンを表示するために、下へスクロールしなければならない場合もあります。EBCC によって次のような画面が表示されます。


     

  6. [b2cPortal] の横の正符号をクリックし、次に Webflow アイテムの searchportlet をダブルクリックします。searchportlet Webflow コンポーネントが、大きくグラフィック表示されます。コンポーネントを表示する画面スペースがもっと必要な場合は、隣接する [エクスプローラ] ウィンドウを閉じます。ここでは説明しませんが、Webflow エディタと Pipeline エディタには、多くのオプションがあります。『開発者ガイド』「ポータル ナビゲーションのセットアップ」で、エディタの詳細説明をお読みください。

イベント

検索結果表示の直前のページでは、ユーザが検索入力ボックスにキーワードを入力し、[Go] ボタンをクリックしました。これは searchform.jsp ポートレットで行われました (別の Webflow シナリオは、別のページで [Products] タブをクリックしてこの [Products] ページに戻り、[Products] ページが最新のカタログ イベントを反映して更新され、それが検索結果になるというものでした。いずれのイベントでも、ここでは、元の検索関連イベントについてのみ説明します)。ポートレットに定義されているフォームには、以下が含まれます。

検索入力ボックスを含むテーブルのセル。

<input name="<%=HttpRequestConstants.CATALOG_SEARCH_STRING%>" type="text" class="searchPortlet" size="27">

[Products] ページに結果を表示する追加 Webflow パラメータを定義し (検索は他のポータル ページからサブミットされるため)、検索ポートレットの Webflow を実行するスクリプトレット。

<%
String formParams=
PortalAppflowConstants.PORTLET_WEBFLOW_EVENT_PARAMETER + "=" + "button.search"
+ "&" +
PortalAppflowConstants.PAGE_PARAMETER + "=" +
B2CPortalConstants.PRODUCTS_PAGE_NAME + "&" +
PortalAppflowConstants.PORTLET_PARAMETER + "=" + "search" ;
%>

また、フォーム定義そのものは以下のとおりです。

<form method="POST" action="<webflow:createWebflowURL
event="bea.portal.framework.internal.portlet.event" origin="searchform.jsp"
extraParams="<%= formParams %>"/>" onsubmit="return ValidateSearchForm(this)" >

イベント button.search は、searchportlet ネームスペースの keywordSearchIP (入力プロセッサ) を使用して個別に定義されます。

これは、以下にある searchportlet.wf (Webflow) ファイルに格納されます。

BEA_HOME¥weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥application-sync¥webapps¥b2cPortal

KeywordSearchIP.java は、HTTP 要求からキーワード検索 String を取り出し、その検索 String を検証し、これに基づいて KeywordQuery を作成し、これをセッション スコープの PipelineSession に追加します。そして以前の検索結果の PipelineSession をクリアします。キーワード検索 String が入力されていない場合、以前にキャッシュされた検索結果がないか PipelineSession が調べられます。以前にキャッシュされた有効な検索結果がある場合は、その結果が PipelineSession に保持されます。

この入力プロセッサのソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥WEB-INF¥src¥examples¥e2e¥b2c¥catalog¥webflow¥KeywordSearchIP.java

検索結果が使用可能になると、search_results.jsp ポートレット ページが表示されます。動的データ表示の詳細については、次の節を参照してください。

ここで、今後の処理のために search_results.jsp 内に定義されているイベントについて説明します。

以下の (あらかじめブラウザでレンダリングされた) search_results.jsp の行は、ポートレットの [詳細] ボタンに設定されたコーディングを示しています。

<a href="<portlet:createWebflowURL namespace="catalogportlet" event="link.item" extraParams="<%=linkParams%
<" />"><img src="<webflow:createResourceURL resource='<%=imagesPath + "prod_step2_details.gif"%>'/>

上記の例では、href リンクは、webflow:createResourceURL JSP タグを使用して構成されています。Webflow ネームスペースが catalogportlet であることがわかります。以下の場所にある catalogportlet.wf (Webflow) ファイルを見てみましょう。

BEA_HOME¥weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥application-sync¥webapps¥b2cPortal

catalogportlet.wf では、link.item というイベントによって storeCatalogEventIP という入力プロセッサが識別されています。この入力プロセッサは、セッションスコープ化された Pipeline 属性として、現在のポートレット イベントを保存するために使用されます。ポートレットは、この情報を使用してカタログのどのビューを表示するかを決定します。

たとえば、Search Results ポートレット上で AviPix 1000 カメラの隣に表示されている [詳細] ボタンをクリックした場合、webflow:createResourceURL パラメータの値が、以下のコードでどのようになっているかに注目してください(ここでは、見やすくするために URL を何行かに改行してあります)。

http://localhost:7501/b2cPortal/application?origin=search_results.jsp
&event=bea.portal.framework.internal.portlet.event
&pageid=Products&portletid=catalog
&wfevent=link.item&wlcs_catalog_item_sku=pix1000

動的データの表示

search_results.jsp では、一致した結果がある場合、その結果が Pipeline セッションから取り出されます。

例:

<webflow:getProperty
id="searchResults"
type="com.beasys.commerce.ebusiness.catalog.ViewIterator"
property="<%= PipelineSessionConstants.CATALOG_SEARCH_RESULTS%>"
scope="session"
namespace="portal" />

次のように、検索結果があるかどうかをチェックします。

<% 
if ( ( searchResults != null ) && ( searchResults.size() > 0 ) )
{
%>

検索結果があれば、カタログを繰り返し参照して、各製品アイテムについてキーワードと一致する情報を取り出します。

例:

<catalog:iterateViewIterator
id="item"
returnType="com.beasys.commerce.ebusiness.catalog.ProductItem"
iterator="<%= searchResults %>">
	<catalog:getProperty
id="itemImage"
returnType="com.beasys.commerce.ebusiness.catalog.ImageInfo"
object="<%= item %>"
propertyName="image"
getterArgument="<%= new Integer(CatalogItem.SMALL_IMAGE_INDEX
) %>" />

そのカタログで、以下に示す他のデータも製品アイテムごとに同じように取り出されます。currentPrice、(簡単な) descriptionproductItemKey (SKU)。

次に、このアイテムの詳細リンク用に HTTP 要求パラメータを設定します。

一致した製品アイテムそれぞれのデータが、アイテムがなくなるまでビュー イテレータで繰り返されます。また、ポートレットが更新される場合は、検索結果のビュー イテレータをリセットします。

searchform.jsp に入力されたキーワードと一致するものが見つからない場合は、search_results.jsp で、Webflow Portal の i18n:getMessage JSP タグを使います。I18N とは国際化を略したもので、英語を母国語としない顧客向けにメッセージ テキストをカスタマイズするために、言語固有のファイルを追加または修正できるように、アプリケーション コードをセット アップするプロセスを指します。たとえば、search_results.jsp には、以下のコードが用意されています。

<i18n:getMessage messageName="noResults" bundleName="search_results" /> 

search_results.jsp と同じディレクトリにある search_results.properties ファイルには、以下が含まれます。

noResults=No matches found. 

キーワードベース検索の管理タスク

このサンプル アプリケーションの検索機能では、WebLogic Portal Administration Tools の [カタログ管理] 領域で定義したキーワードが使われます。この節では、アイテムのキーワードを設定する方法について説明します。

以下の手順は、e2eDomain のサーバがまだ稼動中であると想定しています。e2eAppTools Web アプリケーションとサンプル アプリケーションは同時に実行できます。どちらの Web アプリケーションも同じ e2eApp エンタープライズ アプリケーションの一部であり、同じドメイン内で実行されます。

  1. 新しいブラウザのウィンドウで以下の URL 形式を使うと、WebLogic Portal Administration Tools が起動します。
    http://<host>:<port>/e2eAppTools/index.jsp

    URL 内のローカル マシン名 (localhost) またはリモート ホスト名、および WebLogic Server がリスンしているポート番号を置き換えます。WebLogic Portal アプリケーションでは、デフォルトのポート番号は 7501 です。URL の e2eAppTools 部分では大文字と小文字が区別されます。

    例:

    http://localhost:7501/e2eAppTools/index.jsp

  2. ユーザ名とパスワードの入力が要求されます。これらの値はサイトによって異なることがありますが、デフォルトは次のとおりです。
    Username: administrator
    Password: password

    ログイン値は、大文字と小文字が区別されます。これらの資格情報が機能しない場合は、管理者に問い合わせてください。サンプルのインストール後に、管理者アカウントのデフォルト値が変更された可能性があります。

  3. WebLogic Portal Administration Tools のメイン ページで、[カタログ管理] バナーのアイコンをクリックします。

  4. [カタログ管理] ページで、下線付きの [アイテム] をクリックします。

  5. [キーワード] 入力ボックスに、camera をキーワードとして入力します。

  6. 下線付きの検索結果を 1 つクリックします。たとえば、AviPix 5000 をクリックします (警告: 赤い X アイコンはクリックしないでください。カタログからそのアイテムが削除されてしまいます。カタログ データの管理ページを使っていることを忘れないでください)。

  7. 表示されたページで、「アイテムの主な属性」と同じ行にある [Edit] アイコンをクリックします。

サンプル アプリケーションのカタログに目を通していれば、[アイテム情報の編集] ページの値のいくつかは見慣れた値です。たとえば、簡単な説明や詳しい説明の値に注目してください。また、どのように大小グラフィックの場所が指定されたかにも注目してください (ページの下部)。まず、データ レコードはスクリプトから、または WebLogic Portal の DBloader プログラムを使ってロードされました。これらのカタログ管理ページには、値を操作するためのビューが用意されており、必要に応じて後で値を変更することができます (ほとんどの組織では、値を変更する際に、WebLogic Portal Administration Tools を使わずにカタログ データ スクリプトをもう一度実行します)。

検索キーワードは、この [アイテム情報の編集] ページで表示または変更できます。サンプル アプリケーションでは、カタログの各製品アイテムに対して一連のキーワードを定義しました。[キーワード] 入力ボックスと一連の既存のキーワードを確認するには、ページを下にスクロールします。

次のグラフィックはページの一部を示しています。


 

既存のキーワードは、affordable、avipix、camera、cameras、cheap、consumer、digital、pix です。

管理者は開発チームと協力して、サイトの訪問者が製品アイテムを見つけやすくなるように、キーワードをさらに決定して追加できます。

詳細については、WebLogic Portal のドキュメントを参照してください。

WebLogic Portal Administration Tools を終了するには、ブラウザのウィンドウを閉じます。

次のステップ

「一致するものが見つかりませんでした」が返された場合は、検索入力ボックスに camera など、既存の検索キーワードを 1 つ入力してください。ここでも、既存のキーワードは、affordable、avipix、camera、cameras、cheap、consumer、digital、pix です。次に [Go] ボタンをクリックします。

ツアーを続けるには、検索結果の中からアイテムをいくつかカートに追加します。次の節に進む前に、最後のイベントとして、アイテムの [保留] ボタンをクリックします。

 


[保留] ボタン

[保留] ボタンをクリックすると、更新されたページの summarycart ポートレット (My ショッピングカート) で [保存されているアイテム] リストにアイテムを追加した Webflow イベントがトリガされます。


 

[保留]ボタン イベントの技術説明

[保留] ボタンは、ユーザがカテゴリ ページ、アイテムの詳細ページ、検索結果ページのいずれかを参照しているときに、特定のアイテムに対して選択できます。イベント タイプは、ページによって異なりますが、catalogportlet.wf Webflow ファイルに定義されているとおり、以下のいずれかとなります。

[保留] ボタンを選択すると、製品アイテムがユーザの [保存されているアイテム] リストに移されます。複数のポートレット ページでは、以下の方法で [保
留] リンクが設定されます。たとえば、catalog.jsp ポートレットに含まれる item.jsp ファイルからは、次のように設定されます。

<a href="<a href="<portlet:createWebflowURL namespace="catalogportlet"
event="button.item.save" extraParams="<%= linkParams %>" />">
<img src="<webflow:createResourceURL resource='<%=imagesPath
+ "prod_step2_savelater.gif"%>'/>" width="72" height="18" alt="" border="0"></a>

上記の HTML サブセットでは、ユーザが [保留] 画像をクリックした場合、次のページへの移行のために、button.item.save というイベントが生成されます。linkParams パラメータには、特定のアイテムについての情報が含まれます。このデータは、一連の <catalog:getProperty...> JSP タグにより、item.jsp 処理ですでに収集されています。その後に以下の処理が行われます。

<% 
String linkParams =
HttpRequestConstants.CATALOG_ITEM_SKU + "=" + itemKey.getIdentifier();
%>

[Products] ページで [保留] をクリックしても、在庫チェックは実行されません。ただし、現在 [Saved List] にあるアイテムについて [カートに追加] をクリックすると、ショッピング カートのページで在庫チェックが実行されます。

次のステップ

ツアーを続けるには、[チェックアウト] ボタンをクリックして My ショッピング カート step1.jsp ポートレットに進みます。

 


My ショッピング カート ポートレット、Step1.jsp

[Products] ページの summarycart ポートレットの [チェックアウト] ボタンをクリックした場合、ポートレットのアプリケーションの Webflow によって、[Shopping Cart] ページに step1.jsp チェックアウト ポートレットが表示されます。顧客が注文調達プロセスのどの段階にいるのか把握できるように、グラフィック check_step1_header.gif がロードされました。カート内にアイテムがある場合は、その注文の価格と割引情報が表示されます。表示されるのは、単価、単価からの 10% 割引 (AviPix Consumer Cameras のみ)、10,000 円を超える注文合計からの 15% 割引、合計額です。カートにアイテムがなければ、文字列「ショッピング カートに入っているアイテムはありません。」が表示されます。


 

Step1.jsp ポートレットの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

ショッピング カートのページには、顧客がチェックアウトし、注文を完了できる一連のポートレットが表示されます。チェックアウト処理中にユーザのショッピング カートが変更された場合は、在庫チェックが実行されます。この在庫チェックでは、InventoryProvider SPI と連動する CheckInventoryPC Pipeline コンポーネントが使われています。InventoryProvider SPI では、注文が確実に完了できるように WebLogic Integration の Application Integration (AI) コンポーネントが使用されます。

以降のショッピング カートのページでは、注文が発行されると、Pipeline コンポーネントが Payment Web サービスを呼び出して、クレジット カード購入を認可します。Web サービスは、WebLogic Workshop を使用してすでに作成済みです。

確定された注文がデータベースに保持された後で、別の Pipeline コンポーネントはその注文を XML 表示に変換し、これを Java Message Service (JMS) キューに置きます。WebLogic Integration Business Process Management (BPM) イベント プロセッサは、注文をキューから削除し、これを処理します。

ショッピング カートや チェックアウト ポートレットは以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥checkout¥*

在庫チェックと割引を含む Step1.jsp プロセス

step1.jsp My ショッピング カート ポートレットでは、JSP タグを使って Pipeline セッションからショッピング カート、保存されたショッピング カート、在庫数量を取得します。

<webflow:getProperty id="shoppingCart" property="<%=PipelineSessionConstants.SHOPPING_CART%>"
type="com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart" scope="session" namespace="portal" />
<webflow:getProperty id="savedShoppingCart" property="<%=PipelineSessionConstants.SAVED_SHOPPING_CART%>"
type="com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart" scope="session" namespace="portal" />
<webflow:getProperty id="inventoryCount" property="<%=B2CPortalConstants.INVENTORY_CHECK%>" type="int[]"
scope="session" namespace="portal" />

ショッピング カートの各行を繰り返し参照した後で、不足気味の在庫についてのメッセージが必要かどうかを決定します。

例:

<% if ( (inventoryCount != null) && (inventoryCount[inventoryIndex]
<= shoppingCartLine.getQuantity() ) ) { outOfStock = true; %><%=
shoppingCartLine.getProductItem().getName() %> -
<i><i18n:getMessage bundleName="checkout"
messageName="over_inventory"/></i> - <% ;}
else { %><%= shoppingCartLine.getProductItem().getName() %> <% } %>

在庫チェックは、CheckInventoryPC Pipeline コンポーネントで実装されます。このソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src
¥examples¥e2e¥b2c¥shoppingcart¥pipeline¥CheckInventoryPC.java

この Pipleline コンポーネントは、在庫をチェックし、追加の値を入れます。このサンプル アプリケーションでは、Pipeline コンポーネントはショッピング カートの内容が変更される度に呼び出されます。たとえば、step1.jsp ページには、[再計算] ボタンが関連付けられた [数量] フィールドがあります。ユーザがこのポートレットの数量を変更すると、在庫が再びチェックされます。

注意: 本番環境では、パフォーマンス上の理由からビジネス ロジックに基づいてこの動作を変更した方がよい場合があります。たとえば、在庫の実際の数量を保持し、在庫にある数量とショッピング カートにある数量との差に基づいてさまざまなメッセージを示すことで、アイテムがショッピング カートに初めて入れられたときにだけ在庫をチェックするようにします。

CheckInventoryPC Pipeline コンポーネントは、InventoryProvider SPI と連動します。このソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥common¥inventory¥spi¥*.java

この SPI は checkInventory リモート メソッドを含むステートレス セッション Bean です。このメソッドは、次の処理を行います。

在庫チェックでは、over_inventory メッセージ名に注目してください。国際化 (I18N) への取り組みをサポートするために、これは以下のとおり別個のプロパティ ファイルである checkout.properties で定義されています。

# If the inventory cannot fulfill the quantity requested
over_inventory=out of stock

step1.jsp ポートレットでは、提示するラインアイテム割引の金額も計算されます。このサンプルでは、AviPix Customer Camera カテゴリのあらゆるカメラを 10% 割り引くことを選択しました。10,000 円を超える注文については、注文合計割引も計算されます。

step1.jsp ページでは、以下の多数のイベントが発生する可能性があります。

これらのイベントの詳細については、いずれかのボタンをクリックした後のイベントの技術詳細に関する節を参照してください。

注意: ユーザが step1.jsp ポートレットの [ショッピングを続ける] ボタンをクリックすると、以下の JSP タグを使ってこのユーザに [Products] ページが表示されます。

<a href="<portal:createPortalPageChangeURL  pagename="Products"	/>">
<img src="<webflow:createResourceURL
resource='<%=imagesPath + "check_step1_continue.gif"%>'/>"
width="94" height="18" alt="" border="0"></a>

次のステップ

ツアーを続けるには、[保存されているアイテム] リストのアイテムの隣に表示される [カートに追加] ボタンをクリックします。

[保存されているアイテム] リストの [カートに追加] ボタン

ショッピング カート step1.jsp ポートレットの [保存されているアイテム] リストにある [現在のアイテム] リストには、カートに追加した製品アイテムが入っています。表示されるのは、単価、10,000 円を超えるアイテムの単価からの 10% 割引、10,000 円を超える注文合計からの 15% 割引、合計金額です。直前のページで選択したアイテムは、[保存されているアイテム] リストには表示されなくなります。

以下のサンプル画面に表示されているアイテムは、実際に表示されるカートの内容とは異なることがあります。


 

[保存されているアイテム] リストの [カートに追加] ボタンの技術詳細

step1.jsp [My ショッピング カート] ページには、button.moveItemToShoppingCart というイベントが含まれます。このイベントは、ユーザがショッピング カートの [保存されているアイテム] リストの
[カートに追加] ボタンをクリックするとトリガされます。更新されたページでは、アイテムが [保存されているアイテム] リストから [現在のアイテム] リストに移されます。

step1.jsp ポートレット ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥checkout¥*

step1.jsp からの例:

<a href="<portlet:createWebflowURL namespace="checkoutportlet"
event="button.moveItemToShoppingCart"
extraParams="<%= extraParams %>" />">
<img src="<webflow:createResourceURL
resource='<%=imagesPath + "check_step1_add.gif"%>'/>"
width="52" height="13" alt="" border="0"></a>

extraParams パラメータには、step1.jsp で収集された製品アイテムについてのデータが含まれます。

<%
extraParams = HttpRequestConstants.CATALOG_ITEM_SKU + "="
shoppingCartLine.getProductItem().getKey().getIdentifier();
%>

button.moveItemToShoppingCart イベントは、以下のディレクトリにある checkoutportlet.wf Webflow ファイルで定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project
¥application-sync¥webapps¥b2cPortal

イベントは以下のとおりです。

<event event-name="button.moveItemToShoppingCart">
<destination namespace="checkoutportlet"
node-name="shoppingcart_MoveProductItemToShoppingCartIP"
node-type="inputprocessor"/>
</event>

Pipeline コンポーネントは、MoveProductItemToShoppingCartPC です。その Java ソース ファイルは以下で確認できます。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src
¥examples¥e2e¥b2c¥shoppingcart¥pipeline

MoveProductItemToShoppingCartPC は、顧客の保存されたアイテムのリストから ProductItem を削除し、これをショッピング カートに追加します。顧客のログイン ID は Pipeline セッションの PipelineSessionConstants.USER_NAME 属性で指定されます。移動するアイテムの SKU は、PipelineSessionConstants.CATALOG_ITEM_SKU Pipeline セッション属性で指定されます。PipelineSessionConstants.SAVED_SHOPPING_CARTPipelineSessionConstants.SHOPPING_CART という Pipeline セッションの属性、および WLCS_SAVED_ITEM_LIST テーブルは、その変更を反映して更新されます。

次のステップ

ツアーを続けるには、[保存されているアイテム] リストのアイテムの隣に表示される [削除] ボタンをクリックします。

[保存されているアイテム] リストの [削除] ボタン

ショッピング カート step1.jsp ポートレットの [保存されているアイテム] リストにある [削除] ボタンをクリックすると、そのページは同じポートレットに対する新しいデータを反映して更新されました。選択した製品アイテムは [保存されているアイテム] リストから削除されています。

[保存されているアイテム] リストの [削除] ボタンの技術詳細

step1.jsp [My ショッピング カート] ページには、 button.deleteItemFromSavedList というイベントが含まれます。このイベントは、ユーザがショッピング カートの [保存されているアイテム] リストの [削除] ボタンをクリックするとトリガされます。更新されたページの [保存されているアイテム] リストにはアイテムが表示されなくなります。

step1.jsp ポートレット ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥checkout¥*

step1.jsp からの例:

<a href="<portlet:createWebflowURL namespace="checkoutportlet"
event="button.deleteItemFromSavedList"
extraParams="<%= extraParams %>" />">
<img src="<webflow:createResourceURL
resource='<%=imagesPath + "check_step1_remove.gif"%>'/>"
width="42" height="13" alt="" border="0"></a>

extraParams パラメータには、step1.jsp で収集された製品アイテムについてのデータが含まれます。

<%
extraParams = HttpRequestConstants.CATALOG_ITEM_SKU + "=" +
shoppingCartLine.getProductItem().getKey().getIdentifier();
%>

button.deleteItemFromSavedList イベントは、以下のディレクトリにある checkoutportlet.wf Webflow ファイルで定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥application-sync¥webapps¥b2cPortal

イベントは以下のとおりです。

<event event-name="button.deleteItemFromSavedList">
<destination namespace="checkoutportlet"
node-name="shoppingcart_DeleteProductItemFromSavedListIP"
node-type="inputprocessor"/>
</event>

Pipeline コンポーネントは、DeleteProductItemFromSavedListPC です。その Java ソース ファイルは以下で確認できます。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥b2c¥shoppingcart¥pipeline

DeleteProductItemFromSavedListPC は、顧客の保存されたアイテム リストから ProductItem を削除します。顧客のログイン ID は Pipeline セッションの PipelineSessionConstants.USER_NAME 属性で指定されます。削除するアイテムの SKU は、PipelineSessionConstants.CATALOG_ITEM_SKU Pipeline セッション属性で指定されます。PipelineSessionConstants.SAVED_SHOPPING_CARTPipelineSessionConstants.SHOPPING_CART という Pipeline セッションの属性、および WLCS_SAVED_ITEM_LIST テーブルは、その変更を反映して更新されます。

次のステップ

ツアーを続けるには、[現在のアイテム] リストのアイテムの隣に表示される
[削除] ボタンをクリックします。

[現在のアイテム] リストの [削除] ボタン

ショッピング カート step1.jsp ポートレットの [現在のアイテム] リストにある [削除] ボタンをクリックすると、そのページは同じポートレットに対する新しいデータを反映して更新されました。製品アイテムとその価格はカートから削除されています。

[現在のアイテム] リストの [削除] ボタンの技術詳細

step1.jsp [My ショッピング カート] ページには、button.deleteItemFromShoppingCart というイベントが含まれます。このイベントは、ユーザがショッピング カートの [現在のアイテム] リストの [削除] ボタンをクリックするとトリガされます。更新されたページの [現在のアイテ
ム] リストにはアイテムが表示されなくなります。

step1.jsp ポートレット ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥checkout¥*

step1.jsp からの例:

<a href="<portlet:createWebflowURL namespace="checkoutportlet"
event="button.deleteItemFromShoppingCart"
extraParams="<%= extraParams %>" />">
<img src="<webflow:createResourceURL
resource='<%=imagesPath + "check_step1_remove.gif"%>'/>"
width="42" height="13" alt="" border="0"></a>

extraParams パラメータには、step1.jsp で収集された製品アイテムについてのデータが含まれます。

<%
extraParams = HttpRequestConstants.CATALOG_ITEM_SKU + "="+
shoppingCartLine.getProductItem().getKey().getIdentifier();
%>

button.deleteItemFromShoppingCart イベントは、以下のディレクトリにある checkoutportlet.wf Webflow ファイルで定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project
¥application-sync¥webapps¥b2cPortal

イベントは以下のとおりです。

<event event-name="button.deleteItemFromShoppingCart">
<destination namespace="checkoutportlet"
node-name="shoppingcart_DeleteProductItemFromShoppingCartIP"
node-type="inputprocessor"/>
</event>

入力プロセッサは、DeleteProductItemFromShoppingCartIP です。その Java ソース ファイルは以下で確認できます。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal¥WEB-INF¥src¥examples¥e2e¥b2c¥shoppingcart¥webflow

DeleteProductItemFromShoppingCartIP は、指定されたアイテムをショッピング カートから削除します。削除されるアイテムの SKU は要求オブジェクトの HttpRequestConstants.CATALOG_ITEM_SKU パラメータとして指定されます。ショッピング カートは、Pipeline セッションの PipelineSessionConstants.SHOPPING_CART 属性から取り出されます。アイテムは削除され、Pipeline セッションは変更されたショッピング カートで更新されます。

次のステップ

ツアーを続けるには、カートの [現在のアイテム] リストのアイテムの隣に表示される [保留] ボタンをクリックします。

[現在のアイテム] リストの [保留] ボタン

step1.jsp ショッピング カート ポートレットの [現在のアイテム] の部分にある [保留] ボタンをクリックすると、ページは同じポートレットに対する新しいデータを反映して更新されます。アイテムのステータスは変更され、カートの
[保存されているアイテム] リストに移されました。


 

技術詳細

step1.jsp [My ショッピング カート] ページには、button.moveItemToSaveList というイベントが含まれます。このイベントは、ユーザがショッピング カートの [ 現在のアイテム] リストの [保留] ボタンをクリックするとトリガされます。更新されたページでは、アイテムが [保存されているアイテム] リストから [現在のアイテム] リストに移されています。

step1.jsp ポートレット ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥checkout¥*

step1.jsp からの例:

<a href="<portlet:createWebflowURL namespace="checkoutportlet"
event="button.moveItemToSavedList" extraParams="<%= extraParams %>" />">
<img src="<webflow:createResourceURL
resource='<%=imagesPath + "check_step1_save.gif"%>'/>"
width="61" height="13" alt="" border="0"></a>

extraParams パラメータには、step1.jsp で収集された製品アイテムについてのデータが含まれます。

<%
extraParams = HttpRequestConstants.CATALOG_ITEM_SKU + "=" +
shoppingCartLine.getProductItem().getKey().getIdentifier();
%>

button.moveItemToSavedList イベントは、以下のディレクトリにある checkoutportlet.wf Webflow ファイルで定義されています。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥application-sync¥webapps¥b2cPortal

イベントは以下のとおりです。

<event event-name="button.moveItemToSavedList">
<destination namespace="checkoutportlet"
node-name="shoppingcart_MoveProductItemToSavedListIP"
node-type="inputprocessor"/>
</event>

Pipeline コンポーネントは、MoveProductItemToSaveListPC です。その Java ソース ファイルは以下で確認できます。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥b2c¥shoppingcart¥pipeline

MoveProductItemToSavedListPC は、顧客のショッピング カートから ProductItem を削除し、これを顧客の保存されたアイテムのリストに追加します。顧客のログイン ID は Pipeline セッションの PipelineSessionConstants.USER_NAME 属性で指定されます。移動するアイテムの SKU は、PipelineSessionConstants.CATALOG_ITEM_SKU Pipeline セッション属性で指定されます。PipelineSessionConstants.SAVED_SHOPPING_CARTPipelineSessionConstants.SHOPPING_CART という Pipeline セッションの属性、および WLCS_SAVED_ITEM_LIST テーブルは、その変更を反映して更新されます。

次のステップ

ツアーを続けるには、ショッピング カート step1.jsp ポートレットの下部にある [チェックアウト] ボタンをクリックします。

 


チェックアウト ポートレット、Step2.jsp

step1.jsp ショッピング カートの [チェックアウト] ボタンをクリックすると、ポータル アプリケーションの Webflow によって、[Shopping Cart] ページに step2.jsp チェックアウト ポートレットが表示されます。顧客が注文調達プロセスのどの段階にいるのか把握できるように、グラフィック check_step2_header.gif がロードされました。このサンプルを簡易化するために、ログイン ユーザのデータがページに表示されています。チェックアウト処理のステップ 2 〜 4 では、注文データのセキュリティ暗号化にセキュア ソケット レイヤ (SSL) プロトコル (アプリケーションの URL の https://...) が使われていることに注意してください。

以下は、チェックアウト ポートレットです。スペースの理由からここでは 2 つに分けて示します。


 

下の図は、同じポートレットの下の部分です。


 

チェックアウト ポートレットの技術詳細

step2.jsp チェックアウト ポートレットには、ログイン ユーザ Rachel Adams のあらかじめ設定された請求と出荷情報が表示されます。このサンプル アプリケーションのシンプルなスコープを維持するため、ユーザがクレジット カードの情報や出荷情報を入力したり、変更したりできるポートレットは除外しました。ただし、WebLogic Portal はこのタイプの処理をサポートしており、これを実演する別のサンプルが用意されています。WebLogic Portal のドキュメントの「コマースおよびキャンペーン ツアー」を参照してください。

step2.jsp チェックアウト ポートレットは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥b2cPortal
¥portlets¥checkout¥*

次のステップ

ツアーを続けるには、[注文を続ける] ボタンをクリックして step3.jsp の [注文の送信] ページに進みます。

 


注文の送信ポートレット、Step3.jsp

ショッピング カートの step2.jsp チェックアウト ポートレットで [注文を続ける] ボタンをクリックすると、ポータル アプリケーションの Webflow によって、この step3.jsp ポートレットが表示されます。概要情報が示されます。たとえば、次のように表示されます。


 

注文の送信ポートレットの技術詳細

この節では、このページで行われる処理について詳しく説明します。

はじめに

step3.jsp チェックアウト ポートレットは、発行しようとする注文の概要を示した (発行前の) [注文の送信] ページを提供します。

このページでの注目すべき点とは、ユーザがページの下の方にある [注文の送
信] ボタンをクリックした後で、何が起こるかということです。クレジット カードの認可は、CajunBasedPaymentPC という Pipeline コンポーネントを介して実行されます。これによって、WebLogic Workshop で作成した Payment Web サービスが呼び出されます。

注文が確認された後 (ステップ 4)、ConvertOrderRepPC という Pipeline コンポーネントによって、保持されている注文が XML 表示に変換され、これが Java Message Service (JMS) キューに置かれます。WebLogic Integration Business Process Management (BPM) イベント プロセッサは、注文をキューから削除し、これを処理します。そのプロセスの詳細については、注文の確認ポートレット、Step4.jsp節を参照してください。

WebLogic Workshop Web サービスでの支払認可

step3.jsp ポートレットの [注文の送信] ボタンによって、link.next イベントが呼び出されます。checkoutportlet.wf Webflow ファイルには以下のコードが含まれています。

<presentation-origin node-name="step3" node-type="jsp">
<node-processor-infopage-name="step3.jsp"page-relative-path="/portlets
/checkout"/>
<event-list>
<event event-name="link.next">
<destination namespace="checkoutportlet"
node-name="Commit" node-type="inputprocessor"/>

この Webflow ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project
¥application-sync¥webapps¥b2cPortal

b2c_order.pln Pipeline ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp-project¥application-sync¥pipelines

このファイルには、以下のコードが含まれます。

<root-component component-name="CommitOrderPC"/>
<component-branch-item>
<source-component component-name="CommitOrderPC"/>
<branch-success destination-component="CajunBasedPaymentPC"/>
</component-branch-item>

クレジット カードの支払認可処理は、CajunBasedPaymentPC という Pipeline コンポーネントによって処理されます。これは、Pipeline コンポーネントが Payment Web サービスを呼び出すことを可能にする Java プロキシを呼び出します。Web サービスは、WebLogic Workshop を使用してすでに作成済みです。

CajunBasedPaymentPC.java ファイルのソース ファイルは、以下の場所で確認できます。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥b2c¥payment¥pipeline

Payment Web サービスは、WebLogic Workshop フレームワークの対話的な機能を使用します。最初の呼び出しでクレジット カードを認可します。つまり、認可されるクレジット カード番号と金額を引数として渡します。クレジット カードの認可が終了すると、金額を取得するよう呼び出しが行われます。最後に、金額を決済する要求が行われます。

以下の画面は、Payment Web サービスの作成に使用した WebLogic Workshop Integrated Development Environment (IDE) の一部を示しています。最初の画面は、[デザイン ビュー] です。


 

WebLogic Workshop では、[デザイン ビュー] と以下の [ソース ビュー] を簡単に切り替えることができます。


 

Payment Web サービスから CajunBasedPaymentPC に返されるコードは、次のとおりです。

注意: Payment Web サービスは、サードパーティの支払サービスに接続および承認されている場合のように、常にエラーなく支払い情報を送信するわけではありません。Payment Web サービスを介した支払い処理は、本番環境向けに設計されていません。支払いを正確に処理するには、サードパーティ ベンダの支払いサービスと統合する必要があります。ただし、サンプルの Pipeline コンポーネントで表示されるコードは、エラーを適切に処理するよう設定されています。

CajunBasedPaymentPC Pipeline コンポーネントと Payment Web サービスの詳細については、Web サービス ツアーを参照してください。このサンプルの「はじめに」ページにも説明が記載されています。

[キャンセル] ボタンについて

step2.jsp または step3.jsp ショッピング カートのポートレットで [キャンセル] ボタンをクリックすると、アプリケーションの Webflow によってカートの step1.jsp に戻ります。カート内に現在あるアイテムおよび保存されているアイテムは、そのまま表示されています。キャンセルは、単にその注文のチェックアウト処理のステップ 2 または 3 を終了させるだけです。

次のステップ

ツアーを続けるには、[注文の送信] ボタンをクリックします。

 


注文の確認ポートレット、Step4.jsp

ショッピング カートの step3.jsp 注文の送信ポートレットで [注文の送信] ボタンをクリックすると、ポータル アプリケーションの Webflow によって、この step4.jsp ポートレットが表示されます。ここには、確認メッセージが一覧表示されます。保持されている注文は、JMS キューを介して、このポートレットとビジネス プロセス ワークフロー間の非同期通信を可能にする Pipeline コンポーネントによって発行されました。このインタラクションは、単一の WebLogic Server ドメイン インスタンスで稼動する WebLogic Portal と WebLogic Integration との間のアプリケーション統合を実証しています。


 

注文の確認ポートレットの技術詳細

注文がデータベースに保持されている場合は、同じ注文の XML 表示が注文管理用にキューに入れられます。作業は ConvertOrderRepPC Pipeline コンポーネントで開始されます。その Java ソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥b2c¥order¥pipeline

ConvertOrderRepPC Pipeline コンポーネントは、PurchaseManager SPI と連動します。このソース ファイルは、以下の場所にあります。

weblogic700¥samples¥platform¥e2eDomain¥beaApps¥e2eApp¥src¥examples¥e2e¥common¥purchase¥spi¥*.java

この SPI は、queueOrder リモート メソッドを含むステートレス セッション Bean です。

WebLogic Integration には、他のシステムとの通信に利用可能な以下のエントリ ポイントがあります。

このサンプル アプリケーションでは、JMS キューとの非同期通信を利用します。プロセスの流れを以下に図示します。


 

再び、ConvertOrderRepPC は、注文を JMS XML メッセージに変換し、これを BPM ワークフローのサブスクライブ先である JMS キュー (com.bea.wlpi.EventQueue) に送信します。次に BPM イベント リスナは、JMS キューからメッセージを取り出し、これを処理します。メッセージは、ワークフロー インスタンスを実行して、ワークフローを開始するか、リスンされるワークフロー イベントをトリガします。WebLogic Integration は、サンプル DBMS アダプタを使用して JMS キューから XML メッセージを取り出し、データをデータベースに転送します。サンプル DBMS アダプタは、WebLogic Integration でそのアプリケーション統合コンポーネントと共に使用するために提供されています。

XML メッセージは、ワークフローへの入力ドキュメントとして使われます。ワークフローは、次の 2 つのアクションに応答します。

Xpath を使って XML メッセージを解析し、すべての入力データをアプリケーション統合サービスに渡します。

ユーザが DBMS アダプタのアプリケーション ビューをデプロイするときに定義されるアプリケーション統合サービスを呼び出します。アプリケーション ビュー サービスはデータベースを更新します。

B2C ポータル ツアーの最終ステップ

以上で、注文は完了しました。[ショッピングを続ける] ボタンまたは [Products] タブをクリックすれば、オンライン ツアーのショッピングを続けることができます。または、[ログアウト] ボタンをクリックすると、このサンプルの [はじめに] ページに戻ることができます。ログアウトする場合、ショッピング カートのデータは次のセッションでは保持されないので注意してください。

 

ページの先頭 前 次