ImoshochuShop.jspの修正
第4回では芋焼酎のカタログのみの表示でした。仕様で記述したとおり、購入したい銘柄が選択できなくてはなりません。そのためには図11のformタグ(A)の追加、action属性値(B)の指定、チェックボックスの追加(C)、選択された場合Servletに渡す値(D)、submitボタン(E)の追加が必要です。Bの値はjp.kawakubo.BasketServletクラスを作成するときに指定したURLパターン「/BasketServlet」(正確にはContextパスである/ImoshochuWeb01を頭に付けます)です。Dは選択された銘柄のidを式言語で指定します。
繰り返しになりますが、プログラミングは1つずつ確かめながら進めるべきだと思います。本来なら買い物かごの実装を行いところですが我慢して、JSPで選択した銘柄のidがBasketServletで取得できるかのみ確認します。そのための仮のBasketServletプログラムが図12となります。
getParameterValuesはチェックボックスのように同じ名前で複数の値を持つ場合に使用します。for文の中で選択した銘柄のidを表示しています。
図13が選択した後の銘柄カタログです。「がんこ焼酎屋」「鴨神楽」「一壺春」を選択しているため、BasketServletが実行されると図14のように1、3、4が表示されます。このことにより選択した銘柄のidがBasketServletに渡されていることが確認できます。
BasketServletの修正
図15がカタログから選択した銘柄を買い物かごへ追加するServletです。13行目で分かるように今回はユーザidを「tomoharu」に固定します。第3回でuserテーブルなどに改良を加えることで、userテーブルなどに登録したユーザidをHttpSessionから取り出し、複数のユーザが使用できるよう改良します。
001: protected void processRequest(HttpServletRequest request, HttpServletResponse response)
002: throws ServletException, IOException {
003:
004: ArrayList basketItems = new ArrayList();
005:
006: String[] meigaraItems = request.getParameterValues("items");
007:
008: int basketId = 0;
009:
010: BasketHelper basketHelper = new BasketHelper();
011: // ログインしたユーザidをもとにデータベースからbasket情報を
012: // 取得する。第5回は固定で「tomoharu」とする
013: basketId = basketHelper.getBasketId("tomoharu");
014:
015: basketHelper.insertBasketItems(basketId, meigaraItems);
016:
017: basketItems = basketHelper.getBasketItems(basketId);
018: request.getSession().setAttribute("basket", basketItems);
019:
020: // ImoshochuShop.jspに遷移する
021: RequestDispatcher rd = request.getRequestDispatcher("/ImoshochuShop.jsp");
022: rd.forward(request, response);
023: }
図15の説明をします。4、17、18行目はJSPに渡すための処理です。4行目でBasketItemのArrayListを作成し、途中の処理を経て、17行目でそのArrayListに値を設定しています。18行目はJSPで値を取り出せるようにHttpSessionに"basket"で格納しています。21、22行目は前回説明したとおり、遷移したいJSPを指定します。
新しいところを説明します。10、13、15、17、18行目が目新しいところです。10行目はそれ以降の処理で直接データベースにアクセスせずにすむようHelperクラスを生成しています。少し難しい表現になりますが、層(ティア)アーキテクチャに則って、Servletクラスからデータベース操作を隠ぺいしています。簡単に言えば、データベースの操作の仕方に左右されない作りにするためにHelperクラスを導入してみました。




