BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Portal > 開発者ガイド > Commerce サービスのセットアップ |
開発者ガイド
|
Commerce サービスのセットアップ
WebLogic Portal で利用できる重要なコマース サービスには、課税や支払などのビジネス トランザクション サービスと、プロダクト カタログ サービスがあります。 これらのサービスに関連する開発作業としては、ローカルの課税サービスとサードパーティの課税サービスの統合、およびローカルの支払サービスとサードパーティの支払サービスの統合があります。 また、プロダクト カタログ サービスについての開発作業には、カタログ データベースへのデータのロードと、カスタム カタログ サービスの作成および機能拡張があります。
この章では、以下の内容について説明します。
ポータルとビジネス トランザクション サービスの統合
WebLogic Portal は、課税サービスや支払サービスなどのビジネス トランザクション サービスと統合することができます。 ポータルにこれらのサービスを付け加えると、外部サービスをポータルでローカルに利用できるようになるので、ポータルの機能が拡張されます。 これらのサービスとの統合は開発任務の 1 つであり、そこでは、エンタープライズ アプリケーションに含まれている特定の EJB と、特定のコンフィグレーション ファイルに記述されている URL の更新が必要になります。 ここでは、こうした修正について説明します。
この節では、以下のトピックを扱います。
課税サービスと統合する
WebLogic Portal にインストールされている Tax Web サービスは、デフォルトの TaxCalculator EJB から受け取った取引に関する税額計算を処理するためのデフォルトのフレームワークを提供します。 ビジネス メソッドには、注文に対する課税を遂行するための標準ワークフローが実装されています (Tax Web サービスそのものは、Web サービス化するためのコードでステートレス セッション EJB をラップしたものです)。
エンタープライズ アプリケーションを Tax Web サービスと統合するには、TaxCalculator EJB か Tax Web サービスのどちらかを修正する必要があります。 どちらを修正するかは、自らの組織とサードパーティ税額計算ベンダのどちらが Web サービスのホストになるかで決まります。
重要な注意: WebLogic Portal に付属しているデフォルトの Tax Web サービスでは、注文に対して自動的に 5% の課税を行います。 こうしたデフォルトの税率適用は、実際の運用現場で用いるためのものではありません。 サードパーティ ベンダの課税サービスと統合して、税額を適切に計算する必要があります。
サードパーティ ベンダが Web サービスのホストになる場合
サードパーティ ベンダが Tax Web サービスのホストになる場合には、そのベンダが、同 Web サービスをベンダ プログラムの API と統合し、Web サービス内部の TaxWebService EJB を修正します。この EJB の修正では、SOAP 呼び出し (エンタープライズ アプリケーションの TaxCalculator EJB から Web サービスに送信される SOAP 呼び出し) がベンダ API にとって解釈可能なメッセージに変換され、TaxCalculator EJB に返すための SOAP 呼び出しが適切に作成されるようにします。
ベンダをホストとする Web サービスに接続するには、以下の手順に従います。
<BEA_HOME>¥Weblogic700¥samples¥portal¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥tax¥
<BEA_HOME>¥Weblogic700¥samples¥portal¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥tax¥
WebLogic Server は、起動時に application-config.xml ファイルを読み込むので、Web サービスの所在がわかります。
自らの組織が Web サービスのホストになる場合
自らの組織が Tax Web サービスのホストになる場合には、エンタープライズ アプリケーションが動作している JVM (Java Virtual Machine) とは別の JVM に Web サービスをデプロイします。 こうすることで、Web サービスが停止して、その稼働元の JVM がフリーズするような事態になっても、エンタープライズ アプリケーションの JVM は稼働し続けることになります。
自らの組織をホストとする Tax Web サービスに接続するには、以下の手順に従います。
<BEA_HOME>¥Weblogic700¥samples¥portal¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥tax¥
<BEA_HOME>¥Weblogic700¥samples¥portal¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥tax¥
WebLogic Server は、起動時に application-config.xml ファイルを読み込むので、Web サービスの所在がわかります。
支払サービスと統合する
WebLogic Portal にインストールされている Credit Card Web サービスは、デフォルトの CreditCardService EJBから受け取ったクレジット カード取引の認可(承認)、売上計上、および決済を処理するためのデフォルトのフレームワークを提供します。 ビジネス メソッドには、クレジット カード取引を遂行するための標準ワークフローが実装されています。 取引の現在の状態が維持管理され、各アクションがログに記録されます (Credit Card Web サービスそのものは、Web サービス化するためのコードでステートレス セッション EJB をラップしたものです)。
エンタープライズ アプリケーションを Payment Web サービスと統合するには、CreditCardService EJB か Credit Card Web サービスのどちらかを修正する必要があります。 どちらを修正するかは、自らの組織とサードパーティ支払処理ベンダのどちらが Web サービスのホストになるかで決まります。
重要な注意: WebLogic Portal に付属しているデフォルトの Payment Web サービスでは常に、あたかもサードパーティの支払サービスに接続しそこで承認を受けたかのように支払情報を送信し、エラーを発生しません。 こうしたデフォルトの支払処理は、実際の運用現場で用いるためのものではありません。 サードパーティ ベンダの支払サービスと統合して、支払処理を適切に行う必要があります。
サードパーティ ベンダが Web サービスのホストになる場合
サードパーティ ベンダが Credit Card Web サービスのホストになる場合には、そのベンダが、同 Web サービスをベンダ プログラムの API と統合し、Web サービス内部の CreditCardWebService EJB を修正します。この EJB の修正では、SOAP 呼び出し (エンタープライズ アプリケーションの CreditCardService EJB から Web サービスに送信される SOAP 呼び出し) がベンダ API にとって解釈可能なメッセージに変換され、CreditCardService EJB に返すための SOAP 呼び出しが適切に作成されるようにします。
ベンダをホストとする Credit Card Web サービスに接続するには、以下の手順に従います。
<BEA_HOME>¥Weblogic700¥samples¥portal¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥payment
<BEA_HOME>¥Weblogic700¥samples¥portal¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥payment
WebLogic Server は、起動時に application-config.xml ファイルを読み込むので、Web サービスの所在がわかります。
セキュリティに関する重要な注意
Web サービスは SOAP(すなわち、XML over HTTP)に基づいているので、クレジット カード情報の受け渡しは Web を介してプレーン テキストで行われます。 こうした情報は、盗聴中のハッカーに不正な目的で探知されるおそれがあります。 そのため、クレジット カード処理サービス プロバイダへの専用線を設置し、やり取りされる HTTP 通信にセキュア ソケット レイヤ (SSL) を付け加えることを強くお勧めします。 また、通信内容をすべて暗号化するクレジット カード プロバイダを選ぶことも必要です。
自らの組織が Web サービスのホストになる場合
自らの組織が Credit Card Web サービスのホストになる場合には、エンタープライズ アプリケーションが動作している JVM (Java Virtual Machine) とは別の JVM に Web サービスをデプロイすることを強くお勧めします。 こうすることで、Web サービスが停止して、その稼働元の JVM がフリーズするような事態になっても、エンタープライズ アプリケーションの JVM は稼働し続けることになります。
自らの組織をホストとする Credit Card Web サービスに接続するには、以下の手順に従います。
<BEA_HOME>¥Weblogic700¥samples¥samples¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥payment
<BEA_HOME>¥Weblogic700¥samples¥samples¥wlcsDomain¥beaApps¥
wlcsApp¥src¥examples¥wlcs¥sampleapp¥payment
WebLogic Server は、起動時に application-config.xml ファイルを読み込むので、Web サービスの所在がわかります。
Credit Card Web サービス EJB を修正する際のガイドライン
Payment サービス EJB は、クレジット カード取引の認可(承認)、売上計上、および決済に関係するサービスを提供するステートレス セッション Bean です。 Credit Card Web サービス EJB は、さまざまな支払処理ソリューションとの統合を可能にするインタフェースの役目を果たします。 各取引の現在の状態が維持管理され、各アクションがログに記録されます。 取引の一般的特徴は以下のとおりです。
法律によって、取引の売上計上を行えるのは、商品の発送が完了した場合に限られています。 たとえば、ベンダからオンラインで書籍を購入し、その発送までに 2 日かかる場合には、ベンダは取引の認可だけはできますが、売上計上はできません。 2 日後、商品が発送されたら、ベンダはその取引の売上計上を行うことができます。 しかし、ソフトウェアをオンラインで購入し直ちにダウンロードするような場合には、ベンダはその場で取引の認可と売上計上を行うことができます。注文と実際の発送(ダウンロード)が数秒しかずれていないからです。
プロダクト カタログのサポート
この節では、プロダクト カタログのサポートに関連する開発作業について説明します。 以下で取り上げる作業の中には、BEA から提供されるリソースを用いて作成されたプロダクト カタログに当てはまるものもあれば、適切なステートレス セッション EJB サービス API を実装することで作成できるカスタム カタログ サービスに当てはまるものもあります。前者については、『管理者ガイド』の「カタログの作成と管理」 (http://edocs.beasys.co.jp/e-docs/wlp/docs70/admin/commerce.htm#1167188) を参照してください。 さらに、JSP を用いてカタログを表示する方法と、カタログ サービスとカタログ キャッシュを統合する方法についても取り上げます。
この節では、以下のトピックを扱います。
プロダクト カタログ データベース スキーマへの商品データのロード
最も重要な開発作業は、商品に関する情報を WebLogic にとって解釈可能な形式に変換することです。 それには、DBLoader プログラムを使用します。 DBLoader を使用すれば、任意のデータをデータベース内の任意のテーブルに一度にロードすることができます。
DBLoader を用いてプロダクト カタログを作成するには、以下の手順に従う必要があります。
ステップ 1: DBLoader の使用準備をする
商品情報をデータベースに追加するには、まず、データベースに関する以下の問題点について検討し、入力ファイルを用意する必要があります。
データベースに関する重要事項を確認する
DBLoader プログラムを使用する際には、以下に示すように、データベースに関して念頭に置いておかなければならない重要なポイントがいくつかあります。
参照整合性と制約: プロダクト カタログのスキーマでは、制約を用いて、テーブル間のデータ整合性および参照整合性を実現します。 たとえば、WLCS_PRODUCT と WLCS_CATEGORY についての主キー制約や、WLCS_PRODUCT_CATEGORY についての外部キー制約などです。
主キーとユニークなインデックスがあれば、テーブルにエントリが重複して格納されるおそれはなくなります。 外部キー制約では、親キーがすでに存在することを確認してからデータベースへの子レコードの書き込みを許可することで、参照整合性が確保されます。
注意: WLCS_PRODUCT テーブルと WLCS_CATEGORY テーブルのどのエントリについても、対応するエントリを CATALOG_ENTITY テーブルにも作成する必要があります。
Java における String の取り扱い: Java では、すべての String が Unicode 2.0 文字の列として表されます (Unicode 2.0 は、世界中の主要な言語をサポートする 16 ビット文字エンコーディングです)。 したがって、JVM (Java Virtual Machine) にテキストを読み込む際と、JVM からテキストを書き出す際には、エンコーディング体系を用いて、オペレーティング システムで使用される「ネイティブ」エンコーディングと Unicode 2.0 の間の変換を行う必要があります。 テキスト ファイルに記述されたデータは、そのエンコーディングが JVM(およびオペレーティング システム)のデフォルトのファイル エンコーディングに一致する際には、Unicode 2.0 に自動的に変換されます。
プロダクト カタログ スキーマにロードする商品情報入力ファイルを用意する
この節で示すルールに従って、Web サイトで使用する商品情報を記載した入力ファイル(テキスト ファイル)を作成します。 データベース テーブルごとに、別個のファイルを作成します。
入力ファイルのファイル構造の検証: 入力データ ファイルは、デフォルトでは、パイプで値を区切ったテキスト ファイルです。 この入力ファイルの構造は以下のとおりです。
表14-1 に入力ファイルの構造を示します。
リスト 14-1 に、簡単な入力ファイルの例を示します。
コード リスト 14-1 簡単な入力ファイル
3|WLCS_PRODUCT
*SKU|NAME|IN_STOCK|EST_SHIP_TIME|SPECIAL_NOTES|CREATION_DATE
VARCHAR|VARCHAR|VARCHAR|VARCHAR|VARCHAR|DATE
P123|CoolKid|N|Out of stock until further notice|Special order
only|02-Oct-2000
P124|FastKid|Y|One week|No special order|02-Oct-2000
P125|RadSneakers|Y||regular stock|02-Oct-2000
注意: 簡単な入力ファイルは以下の場所でも参照できます。 <PORTAL_HOME>¥db¥data¥sample¥wlcs¥hardware¥PRODUCT.dat
空の入力文字列: データ ファイル内に空の入力文字列があると、データベースには空の文字列として挿入されます。 値を指定しないカラムが入力レコード内に存在する場合には、その対応する位置(第 2 行で列挙したカラムの位置に一致)に区切り文字(デフォルトでは、カンマ)を入れて、そのことを明示する必要があります。 たとえば、以下のように指定します。
P125|RadSneakers|Y||regular stock|02-Oct-2000
非主キー フィールドの未指定値: 上記の例では、第 4 カラム (EST_SHIP_TIME) の値が指定されていません。 このカラムはデータベース レコードの主キーではないので、これでも問題ありません。 このカラムの値は、空の文字列として格納されます。
注意: データベース内で主キー以外のカラムにヌル値を格納したい場合には、該当するレコード内のそのカラムの位置に NULL と入力しなければなりません。 ただし、NULL を引用符で囲んではいけません。引用符で囲むと、カラムは文字列として格納されることになるからです。
ステップ 2: databaseload.properties ファイルを編集する
DBLoader では、databaseload.properties ファイルに記載された情報を用いて、 データとロード処理についての情報 (たとえば、どのようなドライバ、データベース、あるいはログインを使用するかといったこと) を決定します。 <PORTAL_HOME>¥db ディレクトリにある databaseload.properties ファイルを開きます。 使いたいデータベース用の行についてコメントを外し、正しい設定を入力します。 Pointbase 以外のデータベースを使用する場合は、必ず Pointbase の行をコメントアウトします。
databaseload.properties ファイルで、先頭に # 記号の付いた行はすべてコメント行です。 ファイルには、コメント行と空白行のどちらも含めることができます。
表14-2
ステップ 3: DBLoader プログラムを実行してデータをロードする これで、入力ファイルの作成と databaseload.properties ファイルのセットアップが完了したので、databaseload スクリプトを実行して DBLoader プログラムを起動します。
databaseload の基本事項を確認する
スクリプトは以下の場所にあります。
注意: PORTAL_HOMEは、WebLogic Portal のインストール先ディレクトリです。
databaseload スクリプトでは、以下のタスクを実行します。
非 Windows 環境 - スクリプトの実行準備をする
非 Windows 環境の場合、databaseload スクリプトを実行するには、その前にまず、databaseload.properties ファイルで指定しているのと同じデータベースを set-environment スクリプトにも指定していることを確認しておきます。 set-environment スクリプトは、databaseload スクリプトと同じディレクトリに入っています。 たとえば、databaseload.properties ファイルに `jdbc:pointbase:server://localhost:9092/wlportal' 接続が指定されている場合には、set-environment スクリプト側では SET DATABASE=POINTBASE となっていなければなりません。
すでに述べたように、DBLoader の動作は WebLogic Portal サーバとは無関係です。 したがって、ローダを実行しようとする場合にサーバを停止する必要はありません。
WebLogic Portal サーバを Oracle と連携して実行する場合には、データがデータベースにロードされる間はパフォーマンスが低下することがあります。
注意: DBLoader を実行する前に、更新対象のテーブルをバックアップしたほうがよいでしょう。 DBLoader プログラムでは、データベース内に履歴レコードを保存しません。
databaseload スクリプトを実行する
スクリプトを実行するコマンドのフォーマットは、以下のとおりです。
>> databaseload { -insert | -update | -delete } input-file.dat
たとえば、以下のように入力します。
>> databaseload -update product_categories.dat
上の例では、DBLoader プログラムは、プロダクト カタログ データベース内の行のうち、category.dat 入力ファイルに指定されている主キーに一致するものを更新します。
操作のタイプの選択: 実行可能な 3 種類の操作、すなわち -insert、-update、または -delete の中から 1 つを選択する必要があります。
UNIX と特権: UNIX システムでは、databaseload.sh ファイルのデフォルトの保護設定に実行特権が含まれている必要があります。 その設定には、通常、以下のコマンドを用います。
$ chmod +x databaseload.sh
複数のテーブルへのデータのロード: 複数テーブル内のデータの挿入、更新、削除を行うには、テーブルごとに、対応する入力ファイル名をパラメータとして指定して、databaseload スクリプトを別々に実行します。 更新されるテーブルの順序については、 他のすべての SQL 文の場合と同じデータ整合性ルールに従わなければなりません。 たとえば、主キー制約のある親テーブルに行を挿入してから、外部キー制約のある子テーブルに行を挿入します。
ステップ 4: DBLoader ログ ファイルを用いてトラブルシューティングする
以下の 2 つの監査トレイル ログ ファイルを用いて、DBLoader 操作の実行時に発生したエラーなどの問題を明らかにすることができます。
この節では、以下のトピックを扱います。
ログ ファイルの検査のタイミングを決定する
各操作のあとすぐにログ ファイルを調べる必要があります。DBLoader の各操作によってログ ファイルが上書きされるからです。 どちらのファイルも、databaseload スクリプトの実行時と同じディレクトリに作成されます。
dbloader.log ファイルを検査する
dbloader.log ファイルには、以下の情報が含まれています。
dbloader.err ファイルを検査する
データベースへのロード操作を実行中にエラーが発生した場合には、dbloader.err ファイルに以下の情報が書き込まれます。
DBLoader プログラムでは、ロードの影響を受けるカラムの数(入力データ ファイルの第 2 行に指定されている)と、各レコード内の入力カラムの数を照合します。 カラム区切り記号はカンマ(デフォルト)であるので、この文字を入力カラムの文字列に含めることはできません。 LONG_DESC(詳細な説明)カラム内の句読点など、余分なカンマをうっかり入れると、エラーが発生し、dbloader.err ファイルに記録されます。 この種のエラーを避けるには、入力データのカラム値を区切るのに用いているカンマの数を注意深くチェックします。 あるいは、別の区切り文字を選んで、databaseload.properties ファイル内に指定します。 詳細については、ステップ 2: databaseload.properties ファイルを編集するを参照してください。
エラーと例外はすべて、DBLoader プログラムが動作しているコンソールに表示されます。 エラーのあるレコードは読み飛ばされ、処理はファイルの最後まで続行します (エラーが発生しても、プログラムはトランザクションをロール バックしません)。
JSP を用いたカタログの表示
Commerce サービス に用意されている JavaServer Pages (JSP) テンプレートと JSP タグを利用すれば、プロダクト カタログのプレゼンテーション部分を容易に作成することができます。 これらのテンプレートは、訪問者がカタログのカテゴリと商品アイテムを閲覧するためのメカニズムを提供します。すなわち、これらのテンプレート内の JSP タグには、そうした機能が実装されているのです。
JSP タグ ライブラリを使用すれば、プロダクト カタログに含まれている商品やカテゴリの属性を簡単に取得することができます。 取得した属性はそのあと、HTML タグを用いて書式化することができます。 カスタム レイアウトの作成には、どのような HTML エディタでも使用することができます。 また、JSP 内にカスタム Java コードを組み込んで、カテゴリや商品を表示することもできます。
カタログ JSP タグを使用するには、JSP に以下のコードを追加することで、cat.tld タグ ライブラリを JSP ファイルにインポートする必要があります。
<%@ taglib uri="cat.tld" prefix="catalog" %>
BEA から提供されるデフォルトのプロダクト カタログを構成する JSP テンプレートでは、以下の 3 つの基本タグが使用されます。
指定された ProductItem または Category から表示用のプロパティを取得する。 明示的プロパティも暗黙的プロパティも取得することができます。
指定された ViewIterator に対して反復処理を行う。 ViewIterator に対する反復処理は、View 単位(反復ごとに 1 つの View)でも、View の中に含まれている Catalog アイテム単位(反復ごとに 1 つの ProductItem または Category)でも行うことができます。
指定された ViewIterator 内を順に調べ、指定された View 内に含まれている ProductItem または Category を反復処理する。
ビジネス ニーズに合わせ、必要に応じて、これら以外のタグを追加することができます。
<catalog:getProperty> タグの使い方
ProductItem または Category から表示用のプロパティを取得するには、<catalog:getProperty> タグ(表14-3 参照)を用います。 プロパティは、明示的プロパティ(Catalog アイテムに対して get メソッドを呼び出して取得できるプロパティ)でも、暗黙的プロパティ(Catalog アイテムに対して ConfigurableEntity getProperty メソッドを呼び出して取得できるプロパティ)でもかまいません。 このタグは、まず、指定されたプロパティを明示的プロパティとして取得できるかどうかを調べます。 それができない場合には、指定されたプロパティは暗黙的プロパティとして取得されます。
サンプル 1: アイテムからの JSP の詳細情報の取得 リスト 14-2 では、既存の ProductItem から JSP の詳細情報が取得されます。 コード リスト 14-2 アイテムからの JSP の詳細情報の取得 サンプル 2: getterArgument 属性の使い方 リスト 14-3 では、getterArgument 属性を用いて、以下の特徴を持つプロパティ セット/スキーマの暗黙的(すなわちカスタム)プロパティを取得する方法を示しています。
<%@ taglib uri=”cat.tld” prefix=”catalog” %>
<catalog:getProperty
object="<%= item %>"
propertyName="Jsp"
getterArgument=
"<%= new Integer(ProductItem.DETAILED_DISPLAY_JSP_INDEX) %>"
id="detailJspInfo"
returnType="com.beasys.commerce.ebusiness.catalog.JspInfo"
/>
注意: getterArgument は実行時表現でなければならないため、ここでは、MyCatalog を String 変数に代入し、その変数を getterArgument の値として用いています。
コード リスト 14-3 getterArgument 属性の使い方
<%@ taglib uri=”cat.tld” prefix=”catalog” %>
<%
String myPropertySetName = "MyCatalog";
ProductItem myProductItem = .....; // ProductItem への参照
%>
<catalog:getProperty
object="<%=myProductItem%>
propertyName="color"
getterArgument="<%=myPropertySetName%>"
/>
<catalog:iterateViewIterator> タグの使い方
ViewIterator に対して反復処理を行うには、<catalog:iterateViewIterator>タグ(表14-5 参照)を用います。 ViewIterator は、固定サイズの一連の View に分割される潜在的に大量のリモート データ群に対するイテレータです。 ViewIterator は、多数の ProductItem または Category から成る集合を返す可能性があるすべての Catalog サービス API メソッドから返されます。 このタグを使用すれば、ViewIterator 内の要素を順に調べ、一度に 1 つのアイテム(ProductItem または Category)を、あるいは一度に 1 つの View 全体(一定数の ProductItem または Category から成る集合)を処理することができます。前者がデフォルトの動作です。 このタグは、処理の完了時に ViewIterator の状態をリセットしないことに注意してください。
サンプル 1: ViewIterator 内に含まれるカテゴリのキーの表示 リスト 14-4 では、ViewIterator 内の全カテゴリのキーが表示されます。
コード リスト 14-4 ViewIterator 内に含まれるカテゴリのキーの表示
<%@ taglib uri=”cat.tld” prefix=”catalog” %>
<catalog:iterateViewIterator
iterator="<%= myIterator %>"
id="category"
returnType="com.beasys.commerce.ebusiness.catalog.Category">
<%= category.getKey().toString() %>
</catalog:iterateViewIterator>
サンプル 2: ViewIterator 内の全 View の表示 リスト 14-5 では、ViewIterator 内に含まれているすべての View が表示されます。
コード リスト 14-5 ViewIterator 内の全 View の表示
<%@ taglib uri=”cat.tld” prefix=”catalog” %>
<catalog:iterateViewIterator
iterator="<%= myIterator %>"
id="view"
returnType="com.beasys.commerce.ebusiness.catalog.ViewIterator"
iterateByView=”true”>
<%= view.toString() %>
</catalog:iterateViewIterator>
<catalog:iterateThroughView> タグの使い方
<catalog:iterateThroughView> タグ (表14-6 参照) は、指定された ViewIterator の View について反復処理を行います。 このタグは、View の最後に達するまで、View 内の Catalog アイテムを一度に 1 つずつ反復処理します。 反復対象となる特定の View を(インデックスによって)指定しない場合には、ViewIterator の現在の View が使用されます。 このタグは、処理の完了時に ViewIterator の状態をリセットしないことに注意してください。
サンプル 1: ViewIterator の現在の View に含まれている全 ProductItem のキーの表示 リスト 14-6 では、指定された ViewIterator の現在の View に含まれているすべての ProductItem のキーが表示されます。 コード リスト 14-6 ViewIterator の現在の View に含まれている全 ProductItem のキーの表示 サンプル 2: ViewIterator の先頭の View に含まれている全 ProductItem のキーの表示 リスト 14-7 では、指定された ViewIterator の先頭の View に含まれているすべての ProductItem のキーが表示されます。 コード リスト 14-7 ViewIterator の先頭の View に含まれている全 ProductItem のキーの表示 ショッピング カートとカタログを接続する ショッピング カートとカタログを接続するには、カタログに shoppingcart.jsp テンプレートを実装する必要があります。 このテンプレートには、ショッピング カート サービスを正常に実行するのに必要なビジネス ロジックとバックエンド処理の多くを管理するのに用いられる必須の入力プロセッサや Pipeline コンポーネントの実装など、ショッピング カート サービスを管理するコードが記述されています。 このテンプレートをそのまま実装してもよいし、特定のニーズに合うように手を加えてもかまいません。 shoppingcart.jsp を実装する shopppingcart.jsp を実装するには、まず、この JSP がアプリケーションの適切なポートレット フォルダに格納されていることを確かめます。 そのあと、以下のいずれかを行います。
<%@ taglib uri=”cat.tld” prefix=”catalog” %>
<catalog:iterateThroughView
iterator="<%= myIterator %>"
id="item"
returnType="com.beasys.commerce.ebusiness.catalog.ProductItem">
<%= item.getKey().toString() %>
</catalog:iterateThroughView><%@ taglib uri=”cat.tld” prefix=”catalog” %>
<catalog:iterateThroughView
iterator="<%= myIterator %>"
id="item"
returnType="com.beasys.commerce.ebusiness.catalog.ProductItem"
viewIndex=”new Integer(0)”>
<%= item.getKey().toString() %>
</catalog:iterateThroughView>
または
shoppingcart.jsp の動作の仕組み
顧客は、任意の商品カタログ ページ内の [カートの中を見る] ボタン(あるいはそれと同等の機能を果たすもの)をクリックすることで、そのページから shoppingcart.jsp テンプレートに移動できます。 shoppingcart.jsp テンプレートには、顧客のショッピング カートに現在入っている商品が表示されます。 顧客がカート(現在の買物のアクティブな構成要素)に追加した商品ごとに、数量、商品名、定価、実売価格、割引、および小計が、shoppingcart.jsp テンプレートに表示されます。 この情報に従って、注文の合計金額が表示されます。
商品の数量は編集可能なフィールドに表示され、顧客は、このフィールドに新しい数量を入力して [Update] ボタンをクリックするだけで、商品の数量を変更できます。 顧客にとって便利なように、商品名は、プロダクト カタログ内の当該商品の説明にハイパーリンクされています。 また、ショッピング カート内の商品ごとに、[Remove] ボタンと [Buy later] ボタンも用意されています。 [Remove] ボタンをクリックすると、その商品はショッピング カートから削除され、一方、[Buy later] ボタンをクリックすると、その商品は [ショッピング カート] から [保存されているアイテム] リストに移されます。 [保存されているアイテム] リストに表示されている商品ごとに、ハイパーリンク付きの商品名と商品概要が表示されます。 さらに、このセクションの [Remove] ボタンや [Add to cart] ボタンを利用すると、顧客はその商品を完全に削除したり、アクティブな [ショッピング カート] に戻すことができます。
顧客が個々の商品アイテムのリンクをクリックして、その商品についての詳細情報を参照しようとすると、適切なプロダクト カタログ ページが次に表示されます。 顧客が [Update]、[Empty cart]、[Remove]、[Buy later] のいずれかのボタンをクリックした場合には、適切な入力プロセッサや Pipeline が実行されて変更内容が保存されたあと、ショッピング カート ページ (shoppingcart.jsp) に戻ります。
顧客は、ショッピング カートに表示されている内容を見てこれでよいと思ったら、[Check out] ボタンをクリックしてチェックアウト プロセスを開始することができます。 その場合には、配送情報のページ (shipping.jsp) が次に表示されます。
注意: 顧客がまだサイトにログインしていない状態で [Check out] ボタンをクリックした場合には、(shipping.jsp テンプレートがロードされる前に)login.jsp テンプレートが表示され、ログインするように促されます。
[保存されているアイテム] リストの機能を利用するには、顧客はまずログインしておく必要があります。
顧客のショッピング カートに何も商品が入っていない場合には、[Emptycart] ボタン、[Update] ボタン、および [Check out] ボタンは利用できません。
顧客は、ショッピング カートの内容を見てこれでよいと思ったら、[Check out] ボタンをクリックしてチェックアウト プロセスを開始することができます。
注意: 顧客が e コマース サイトにログインしていない場合には、チェックアウト プロセスの次のステップに進む前に、ログインを求められます。
顧客が最初からやり直したいと思った場合には、[Empty cart] ボタンをクリックすれば、ショッピング カートの中身(アクティブなアイテムも保留中のアイテムも)をそっくり空にすることができます。 顧客が買い物を続けたい場合には、[Continue shopping] ボタンをクリックすれば、プロダクト カタログに戻ることができます。
解説
shoppingcart.jsp テンプレートに注釈を付けたものを、図 14-1 と図 14-2 に示します。図 14-1 に示すのは、まだログインしていない顧客に表示されるページです。
図14-1 shoppingcart.jsp − まだログインしていない訪問者用に書式化された Web ページ
図 14-2 に示すのは、ログイン済みの顧客に表示されるページです。 図14-2 shoppingcart.jsp − ログイン済みの訪問者用に書式化された Web ページ
このテンプレートのメイン コンテンツ領域には、動的に生成されるデータと静的なコンテンツが両方とも表示されています。 shoppingcart.jsp の動的なコンテンツは、 WebLogic Server JSP タグと Pipeline JSP タグを用いて生成されます。これらの JSP タグでは、アクティブなショッピング カート用のコンテンツも [保存されているアイテム] リスト用のコンテンツも取得し表示します。 shoppingcart.jsp テンプレートの場合、フォーム ポストを行うものには、[Empty cart]、[Check out]、[Remove]、[Update]、および [Continue shopping] があります。 ユーザがログインする前後での変更点は、以下のとおりです。
テンプレートの主要コンポーネントを表14-7 に示します。
デフォルト Webflow での位置
顧客は、[カートの中を見る] ボタンをクリックすることで、任意の商品カタログ ページから shoppingcart.jsp テンプレートに移動できます。 顧客は、このページに表示されているショッピング カートの内容を見てこれでよいと思ったら、[Check out] ボタンをクリックしてチェックアウト プロセスを開始することができます。 その場合には、配送情報のページ (shipping.jsp) が次に表示されます。
注意: 顧客がまだサイトにログインしていない状態で [Check out] ボタンをクリックした場合には、(shipping.jsp テンプレートがロードされる前に)login.jsp テンプレートが表示され、ログインするように促されます。
顧客が個々の商品アイテムのリンクをクリックして、その商品についての詳細情報を参照しようとすると、適切なプロダクト カタログ ページが次に表示されます。 顧客が [Update]、[Empty cart]、[Remove]、[Buy later] のいずれかのボタンをクリックした場合には、適切な入力プロセッサや Pipeline が実行されて変更内容が保存されたあと、ショッピング カート ページ (shoppingcart.jsp) に戻ります。
この JSP テンプレートは、sampleapp_order ネームスペース内にあります。
イベント
顧客がショッピング カートの内容を操作するボタンをクリックするたびに、その操作はイベントとみなされます。 各イベントが発生すると、デフォルト Webflow 内の特定の応答がトリガされて、顧客は操作を続けることができます。 この応答によって別の JSP がロードされることもありますが、通常は、入力プロセッサまたは Pipeline が先に呼び出されます。これらのイベントとそれによって呼び出されるビジネス ロジックを表14-8 に示します。
注意: InitShoppingCartIP と RefreshSavedList Pipeline は shoppingcart.jsp テンプレートに関連付けられていますが、いずれも、このページで発生するイベントでトリガされるわけではありません。 これらはどちらも、shoppingcart.jsp が表示される前に実行されるのです。 InitShoppingCartIP 入力プロセッサが、顧客の買い物に備えて空のショッピング カートを作成するのに対して、RefreshSavedList Pipeline は、顧客がそれまでに保留にしたショッピング カート内商品のリストを取得します。 shoppingcart.jsp でのデータ表示の仕組み shoppingcart.jsp テンプレートの目的の 1 つは、顧客の買い物に関するデータを表示して、顧客がそれを確認できるようにすることです。 shoppingcart.jsp では、WebLogic Server JSP タグ、Pipeline JSP タグ、およびアクセサ メソッド/属性を組み合わせて、これを実現しています。 まず、getProperty JSP タグによって、Pipeline セッションから SHOPPING_CART 属性と SAVED_SHOPPING_CART 属性が取得されます。表14-10 に、これらの属性の詳細を示します。
getProperty JSP タグを用いて Pipeline セッションからこれらの属性を取得する方法を、リスト 14-8 に示します。 コード リスト 14-8 ショッピング カート属性の取得 Pipeline セッション属性内に格納されているデータには、Java スクリプトレット内でアクセサ メソッド/属性を用いてアクセスします。ShoppingCart(および savedShoppingCart)のアクセサ メソッド/属性の詳細を表14-11 に、また、ShoppingCartLine のアクセサ メソッド/属性については表14-12 に、それぞれ示します。
<webflow:getProperty id="shoppingCart"
property="<%=PipelineSessionConstants.SHOPPING_CART%>"
type="com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart"
scope="session" namespace="sampleapp_main" /><webflow:getProperty id="savedShoppingCart"
property="<%=PipelineSessionConstants.SAVED_SHOPPING_CART%>"
type="com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart"
scope="session" namespace="sampleapp_main" />
getShoppingCartLineCollection() メソッドを使用すると、ショッピング カート内の個々の明細行のコレクションを取得できるので、各明細行に含まれている個々の情報を取り出すためのアクセサ メソッド/属性も用意されています。これらのメソッドおよび属性を表14-12 に示します。
Java スクリプトレット内でのこれらのアクセサ メソッド/属性の使用例を、リスト 14-9 に示します。 コード リスト 14-9 shoppingcart.jsp Java スクリプトレット内でのアクセサ メソッドの使い方 shoppingcart.jsp で用いられるフォーム フィールド shoppingcart.jsp テンプレートのもう 1 つの目的は、さまざまな HTML フォーム フィールドを用いて、顧客が自分のショッピング カートの内容を変更できるようにすることです。 また、これらのフォーム フィールドは、必要な情報を Webflow に渡すためにも使用されます。 shoppingcart.jsp テンプレートで使用されるフォーム フィールドとそれらの解説を、表14-13 にまとめます。
<<td align="right" valign="top" bgcolor="#CCCCFF"><div class="tabletext" nowrap>
<%-- i18n タグを用いることで、"currency.properties" ファイルでは、返される 3 文字の --%>
<%-- ISO4217 コード ("USD" など) の代わりに "$" などの表示通貨を使用できるようになる。 --%>
<i18n:getMessage bundleName="/commerce/currency" messageName="<%=
shoppingCartLine.getProductItem().getMsrp().getCurrency() %>"/>
<%= WebflowJSPHelper.priceFormat(shoppingCartLine.getProductItem().
getMsrp().getValue() ) %></div> </td>
<td align="right" valign="top"><div class="tabletext" nowrap>
<i18n:getMessage bundleName="/commerce/currency" messageName="<%=
shoppingCartLine.getUnitPrice().getCurrency() %>"/>
<%= WebflowJSPHelper.priceFormat( shoppingCartLine.getUnitPrice().
getValue() ) %></div> </td>
<td align="right" valign="top" bgcolor="#CCCCFF"><div class="tabletext"
nowrap>
<i18n:getMessage bundleName="/commerce/currency" messageName="<%=
shoppingCartLine.getBaseSavings().getCurrency() %>"/> <%= WebflowJSPHelper.priceFormat( shoppingCartLine.getBaseSavings().
getValue() ) %></div> </td>
<td align="right" valign="top"><div class="tabletext" nowrap>
<i18n:getMessage bundleName="/commerce/currency" messageName="<%=
shoppingCartLine.getBaseTotal().getCurrency() %>"/> <%= WebflowJSPHelper.priceFormat( shoppingCartLine.getBaseTotal().
getValue() ) %>
</div>
</td>
注意: JSP コード内でリテラルとして扱われるパラメータは、引用符で囲んで示されています。一方、リテラルでないパラメータを JSP 内で使用するには、スクリプトレット構文 (たとえば、 shoppingcart.jsp で用いられる入力プロセッサ shoppingcart.jsp では、入力プロセッサおよび Pipeline と呼ばれる Webflow コンポーネントを用いて、必要なビジネス ロジックの多くを実行します。 この節では、利用可能な主要入力プロセッサについて説明します。 これらの入力プロセッサは、Webflow メカニズムから起動されたときに、より複雑なショッピング カート サービス タスクを実行するために呼び出される Java クラスを表します。 この節では、以下に示すこれらの入力プロセッサについて説明します。
<%= HttpRequestConstants.CATALOG_ITEM_SKU %> など) に従う必要があります。
注意: Webflow の使用、作成、あるいは変更と、入力プロセッサの使用については、ポータル ナビゲーションのセットアップを参照してください。
DeleteProductItemFromShoppingCartIP
この入力プロセッサ (入力プロセッサ名はすべて末尾に「IP」という文字が付く) は、ショッピング カートから商品アイテムを削除します。
EmptyShoppingCartIP この入力プロセッサは、新しいショッピング カートを作成し、それを Pipeline セッションに格納したあと、古いショッピング カートを破棄します。
InitShoppingCartIP この入力プロセッサは、shoppingcart.jsp テンプレートをロードする前に、アクティブなショッピング カートを初期化します。 ショッピング カートがすでに存在している場合には、この入力プロセッサは何もしません。
UpdateShoppingCartQuantitiesIP この入力プロセッサは、ショッピング カートの各明細行の数量フィールドを検証し、それらの数量を設定します。 数量が 0 の場合には、その商品アイテムをショッピング カートから削除します。
UpdateSkuIP この入力プロセッサは、HTTP リクエストから SKU を読み込んで、Pipeline セッション内に設定します。
shoppingcart.jsp で用いられる Pipeline コンポーネント この節では、shoppingcart.jsp テンプレートに関連付けられている各 Pipeline コンポーネントについて簡単に説明します。 これらの Pipeline は、Shopping Cart サービスに関係する特定タスクの実行を Webflow で開始する際に呼び出されるプロセッサ ノードです。 注意: Pipeline コンポーネントの中には、他の基本 Pipeline コンポーネントを拡張するものがあります。 基本クラスの詳細については、『Javadoc』を参照してください。 Pipeline コンポーネントの詳細については、ノードのタイプを参照してください。 この節では、以下の Pipeline コンポーネントについて説明します。
注意: Webflow の使用、作成、あるいは変更と、Pipeline コンポーネントの使用については、ポータル ナビゲーションのセットアップを参照してください。
DeleteProductItemFromSavedListPC
このPipeline コンポーネント (Pipeline コンポーネント名はすべて末尾に「PC」という文字が付く) は、保留アイテム リストから商品を削除し、データベース内の WLCS_SAVED_ITEM_LIST テーブルを更新します。
MoveProductItemToSavedListPC この Pipeline コンポーネントは、ショッピング カートから商品アイテムを削除し、それを保留アイテム リストに追加します。 その後、データベース内の WLCS_SAVED_ITEM_LIST テーブルを更新します。
MoveProductItemToShoppingCartPC このPipeline コンポーネントは、保留アイテム リストから商品を削除し、それを数量 1 としてショッピング カートに追加します。 その後、データベース内の WLCS_SAVED_ITEM_LIST テーブルを更新します。
RefreshSavedListPC この Pipeline コンポーネントは、WLCS_SAVED_ITEM_LIST テーブルにクエリを発行し、Pipeline セッション内の保留ショッピング カートをリフレッシュします。 Pipeline セッション内に保留ショッピング カートが存在しない場合には、保留アイテム リストだけが更新されます。
PriceShoppingCartPC この Pipeline コンポーネントは、Pricing サービスを呼び出して、各明細行の総額(小計)、割引額、ショッピング カート全体の総額、およびショッピング カート全体の割引総額を計算します。
AddToCartTrackerPC この Pipeline コンポーネントは、カートにどの商品アイテムが追加されたかを示す AddToCartEvent を発生させます。 このイベントの詳細については、イベントおよび行動追跡を参照してください。
RemoveFromCartTrackerPC この Pipeline コンポーネントは、カートからどの商品アイテムが削除されたかを示す RemoveFromCartEvent を発生させます。 このイベントの詳細については、イベントおよび行動追跡を参照してください。
UpdateShoppingCartQuantitiesTrackerPC この Pipeline コンポーネントは、ショッピング カートの明細行ごとに以下のいずれかを実行します。
サービスとカタログ キャッシュを統合する
カタログ アーキテクチャには、プロダクト カタログ内の商品アイテムおよびカテゴリ用の強力なキャッシング メカニズムが用意されています。 サービスとキャッシュの統合に当たっては、サービスをキャッシュのフロントエンドにするか、バックエンドにするかを選択することができます。 現在、ProductItemManager と CategoryManager では、キャッシング アーキテクチャが活用されています。
CatalogManager のデプロイメント記述子で Bean のJNDI 名を変更することによって、キャッシュのフロントエンドにあるサービスが別のものに置き換わります。 元のサービスは、独自のキャッシング メカニズムを実装するか、あるいはキャッシングの活用を諦めなければなりません。
あらかじめ定義されているサービス (CatalogManager のデプロイメント記述子で指定されている) では、商品アイテムとカテゴリにアクセスするためのキャッシュを実装しています。 以下の Bean は、キャッシュに問い合わせ、キャッシュされたデータがあればそれを返します。そうでなければ、デプロイメント記述子で指定されている Bean に処理を委託します。
ProductItemManager Bean と CategoryManager Bean のデプロイメント記述子を編集することで、キャッシュのバックエンドでもプロダクト カタログの機能を利用できるようにすることができます。 それによって、キャッシング アーキテクチャのことを気にせずに、カタログの永続性モデルに専念できるようになります。 リスト 14-10 に示すように、ejb-jar.xml デプロイメント記述子で指定されている現在の代理サービス プロバイダ クラス (JdbcCategoryManager) を、CategoryManager インタフェースを実装する新しいセッション Bean の名前に置き換える必要があります。 同様の変更を、weblogic-ejb-jar.xml ファイルに対しても行う必要があるでしょう。
コード リスト 14-10 CategoryManager のデプロイメント記述子 (ejb-jar.xml)
<session>
<ejb-name>
com.beasys.commerce.ebusiness.catalog.service.
category.CategoryManager
</ejb-name>
<home>
com.beasys.commerce.ebusiness.catalog.service.
category.CategoryManagerHome
</home>
<remote>
com.beasys.commerce.ebusiness.catalog.service.
category.CategoryManager
</remote>
<ejb-class>
com.beasys.commerce.ebusiness.catalog.service.
category.CategoryManagerImpl
</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<!-- delegateName を指定して、どの EJB に委託するかをブリッジ
コンポーネント (カタログ マネージャで使用されるもの) に指示する。
このように、env-entry を変更することで委託先を変更することができる...
-->
<env-entry>
<env-entry-name>delegateName</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>ejb/JdbcCategoryManager</env-entry-value>
</env-entry>
<ejb-ref>
<ejb-ref-name>ejb/JdbcCategoryManager</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>
com.beasys.commerce.ebusiness.catalog.service.category.
JdbcCategoryManagerHome
</home>
<remote>
com.beasys.commerce.ebusiness.catalog.service.
category.JdbcCategoryManager
</remote>
</ejb-ref>
.
.
.
</session>
ejb-jar.xml ファイルと weblogic-ejb-jar.xml ファイルは、ebusiness.jar ファイルにパッケージ化されています。この JAR ファイルは、<BEA_HOME>¥weblogic700¥common¥templates¥domains¥ shared¥bea¥portal¥apps¥jars ディレクトリ内にあります(<BEA_HOME> は、BEA アプリケーションのインストール先ディレクトリ)。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |