はじめに
この連載では、「GlassFish」という製品を利用して、Java言語に親しんでもらうことを目的としています。第6回目の今回は、前回に引き続き買い物かご機能部分の実装を解説していきます。
対象読者
- Javaでなにかしらのアプリケーションを作成したことのある方
- Javaの変数の宣言や、if文・for文・while文の制御文など簡単な文法を知っており、アプリケーションを作成したことのある方
オブジェクト指向プログラミングができなくとも構いません。徐々に学んでいければと考えています。また、学びやすいWebアプリケーションをサンプルとするので、Webアプリケーションとは違った分野を勉強したい方には当連載は向いていません。
本稿で想定する主要技術のバージョン
Java EE 5を使用するため、主な技術要素のバージョンは以下の通りです。EJBに関しては応用編で扱う予定です。
- Servlet:2.5
- JSP:2.1
- JSTL:1.2
- JTA:1.1
- EJB:3.0(応用編)
買い物への削除・更新機能を実装
第5回ではimoshopデータベースにテーブルを追加・変更する方法の説明と、カタログで選択した銘柄を買い物かごへ追加する機能を実装しました。今回は、買い物かごへの削除・更新機能の実装を説明します。
「オープンソースApache Tuscanyで楽しむSOA」という連載ではAjaxを含めJavaScriptを多用したため説明が分からないという指摘を受けました。ページの半分以上がAjaxを含むJavaScriptで埋め尽くされてしまい、非常に分かりづらいコードとなってしまいました。
今回は説明をシンプルにするため、JavaScriptは一切使わないことにします。Ajaxに詳しい方は当連載のサンプルのコードにAjaxを適用し、よりユーザビリティの高いプログラムを作成してください。したがって、当連載ではクライアントとサーバはボタンのクリックで発生するアクションによりはじめて通信が開始されるよう作成します。
仕様の確認
第5回で買い物かごの仕様を定義しました。もう一度おさらいということで再掲します。
買い物かごで実装する仕様は以下の通りです。
- カタログの芋焼酎の銘柄を選択し[買い物かごに追加]ボタンをクリックすると、買い物かごに芋焼酎の銘柄が追加される。追加した場合の本数の初期値は1本とする。ただし、既に買い物かごに存在する場合は、本数は増加させない。
- 本数を増減させたい場合、直接、本数のテキストフィールドに本数を入力する。本数が0本になった場合、買い物かごから削除する。[買い物かごを再表示する]をクリックすると0本にした銘柄が買い物かごからなくなっている
- 買い物かごの銘柄の明細には単価と本数をかけた金額が表示される
- 買い物かごには明細の金額の合計と送料、合計と送料を足した総合計が表示される
- [レジへ進む]ボタンをクリックすると買い物かごは空になる
買い物かごの銘柄ごとの金額の計算
1の機能は第5回で実装しました。残りの機能を実装するのも難しくはありません。本数を増減させてもその場で金額は変わりません。その代わり[買い物かごを再表示する]ボタンをクリックすると金額が計算されて再表示されます。
BasketItemクラスの変更
まずは金額を表示させるためにBasketItemクラスに銘柄の金額(単価と本数をかけたもの)をサーバ側で再計算させ表示させます。そのためにはBasketItemに金額フィールド(itemTotal)を追加します。
いつもはエディタ内で右クリックし[リファクタリング] -[フィールドをカプセル化]と選択することでgetter/setterメソッドを用意するところですが、金額は単価と本数で導出できる項目であるため、getterメソッドは手作りします。getItemTotalはその場で単価と本数をかけたものを呼び出し元に返します。
ImochochuShop.jspの変更
次にImoshochuShop.jspを変更します。まずは今まで表示していなかった金額を表示するため式言語を使用します。BasketItemのgetItemTotalを定義したことにより、${basket_item.itemTotal}だけで値が習得できるようになります。さらにtype属性値がsubmitのinputタグを用意します。カタログと買い物かごを同じformタグに入れてしまうと非常にサーバ側のプログラムが煩雑になるため、カタログ部分のformはcatalogというid、買い物かごのformはrefresh_basketというidを付け分離します。
最後にbasket_itemのidを表示させ、Servletでその値を受け取れるよう変更します。図1がImoshochuShop.jspのrefresh_basketというidを持つformタグの部分です。basket_itemのidをhiddenで持たせているのはパラメータに含めたいからですが、このままだと表示できないため、テンプレート・テクストに改めて式言語を加えることで表示できるようにしています。
ここでtype属性をhiddenではなくtextにし、disabledを指定すればいいようにも思えますが、この場合パラメータに含めることができず、ServletでString[] basketIds = request.getParameterValues("id");
で受け取ろうとしても内容はnullになるため使用できません。