買い物かごを作成する
作成する前に動作条件を提示します。今回作成するアプリケーションはFirefoxで動作しますが、IEでは動作しません。フィードからentry要素を取得する処理がうまく動作しないためです。今回はクロスブラウザ問題は追及しないので、動作確認にはFirefoxを使ってください。
JavaScriptとサーバのクラスを別々に説明すると関連性がよく見えてこないため、買い物かごにワインを入れる場合、買い物かごからワインを取り出す場合などに使用するpost、get、delete、putというHTTPのメソッドを、順に説明します。全体のプログラムはページのトップからダウンロードしてください。
メソッド毎の説明に入る前に、買い物かごを実現しているBasketImplクラスの概要を説明します。図4がEclipseでメソッドを折りたたんだ状態のクラスです。initメソッドとgetTotalメソッド以外はBasketインターフェースを実現したメソッドです。Basketインターフェースはorg.apache.tuscany.sca.data.collection.Collectionインターフェースを継承しており、これら6つのメソッドはこのCollectionインターフェースに由来します。Atomを使用したRESTな作りを実現するにはこれらのメソッドを継承する必要があります。
買い物かごにワインを入れる機能を実装する
ワインリストと買い物かごをどのように作りたいかを第3回で宣言しました。復習しましょう。
- ワインリストのチェックボックスを「ON」にすると、自動的に買い物かごに追加される
- ワインリストのチェックボックスを「OFF」にすると、自動的に買い物かごから削除される
- 買い物かごの「本数」を変えると、明細合計・送料・合計金額が自動的に表示される
- 「買い物かごを空にする」ボタンをクリックすると、買い物かごは空になる
ワインリストの左側にあるラジオボタンをチェックすると、買い物かごに追加され、チェックを外すと買い物かごから削除されます。これを実現するには、第3回で作成したワインリストの「チェックボックスがクリックされると呼び出される関数」を用意する必要があります。そのための関数が図5のdisplayBasket関数です。その作りは非常にシンプルで、クリックされたオブジェクトがチェックされていれば買い物かごにワインを追加するaddItemToBasket関数を呼び出し、チェックされていなければremoveItemFromBasket関数を呼び出します。
ワインリストのラジオボタンをクリックされるとdisplayBasket関数が呼び出され、チェックされているかを判定します(図5のA)。チェックされている場合、addItemToBasket関数が呼び出されます。addItemToBasket関数では、引数で渡されたnameでワインリストから該当するワインを探し出します。一致した場合、そこからname要素の内容からprice要素の内容までを取り出し、Atomのentry要素を作成します(図5のB)。entry要素はentryという変数に代入され、basketのpostメソッドの第1引数として渡されます(図5のC)。
basketはJavaScriptの最初の方で、「var basket = new tuscany.sca.Reference("basket");」として宣言されています。第3回のワインリストでも説明しましたが、このbasketはサーバ側で買い物かごであるBasketImplオブジェクトのスタブとして機能します。従って、JavaScript内でbasket.postが呼び出されると、サーバ側のBasketImplのpostメソッドが呼ばれます。RESTではpostメソッドは登録するためのメソッドです。図6がpostメソッドの実装です。多くのネットショップでは買い物かごに商品を入れる場合、既に買い物かごに入っていてもエラーとせずに数量を増やします。筆者はこの実装は非常に紛らわしいと思っています。既に買い物かごに入っている場合は入っている旨のメッセージを表示するか、無視して数量もそのままの状態にする方が、お客さまにとって親切ではないかと考えています。既に買い物かごに入れたのを忘れ、もう1度入れてしまい、余計な支払いを筆者が何度も経験しているためです。今回は、既に買い物かごにワインが入っている場合は単に無視するような作りとしています。
basket.postの第2引数がbasket_postResponseとなっており、戻り値を処理する関数になっています。一見、basket_postResponseという命名は何か規則に準じているようですが、特に決まりはありません。ここでは示しませんが、呼び出し側と宣言している呼び出し元の関数名を適当に変えても正常に動作します。ただし、このサンプルが参考にしているTuscanyのstoreというサンプルプログラムがこのような命名の仕方をしています。アンダースコア(_)の前がスタブ名(basket)、アンダースコアの後ろがスタブのメソッド名(post)に「Response」を付け足した文字列になっているため、戻り値をどこで処理しているか迷わずに探せるところが非常に分かりやすいと考え、踏襲しています。



