SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

GlassFishからアプローチするJava

GlassFishからアプローチするJava~入門編~
第5回「Webアプリケーションの作成 MySQL Workbenchを使う」

買い物かごへの追加機能の実装

ダウンロード サンプルコード (13.0 KB)

Helperクラスを作成

 先述の通り、Webアプリケーションは層アーキテクチャを適用するのが一般的です。層アーキテクチャの場合、適用できるデザインパターンを多くありますが、今回は何を行っているのか分かりやすいよう、あえてデザインパターンの適用はしません。変更が容易な作りを目標とします。図16がBasketHelperクラスです。このクラスからDAOクラスのメソッドを呼び出し、値を格納したり、取りだしたりしています。

図16.BasketHelperクラス
001:public class BasketHelper {
002:    
003:    BasketDAO basketDAO = new BasketDAOImpl();
004:
005:    public int getBasketId(String userId) {
006:        int basketId = basketDAO.getBasketId(userId);
007:        if (basketId == 0) {
008:            basketDAO.insertBasket(userId);
009:            basketId = basketDAO.getBasketId(userId);
010:        }
011:        return basketId;
012:    }
013:
014:    public void insertBasketItems(int basketId, String[] meigaraItems) {
015:        ArrayList insertedIds = basketDAO.retrieveItems(basketId, meigaraItems);
016:        basketDAO.insertItems(basketId, insertedIds);
017:    }
018:    
019:    public ArrayList getBasketItems(int basketId) {
020:        return basketDAO.getBasketItems(basketId);
021:    }
022:}

 BasketHelperクラスを詳しく説明します。BasketHelperクラスには3つのメソッドが存在します。

getBasketIdメソッド

 ユーザidを基にbasketテーブルを検索し、basketテーブルのidを取得します。6行目がDAOクラスのgetBasketIdを呼び出し、返ってきたbasketテーブルのidをbasketIdという変数に代入しています。後に説明しますが、BasketDAOImplのgetBasketIdはユーザidの取得に成功した場合はそのidを、取得できなかった場合は0を返します。紙面の都合上、javadocは省略していますが、戻り値が0の意味をきちんと記述すべきです。7行目から10行面がユーザidがbasketテーブルになかった場合の処理です。DAOクラスのinsertBasketを呼び出すことによりbasketテーブルに新しいユーザidを持ったレコードを追加しています。ここで戻り値にbasketテーブルのidを返すようにすることもできますが、今回は可読性の高い、容易に変更できる作りにしています。新しく作ったレコードのidは6行目のgetBasketIdメソッドを使って取りだしています。

insertBasketItemsメソッド

 第1引数はbasketテーブルのid、第2引数はカタログで選択されたmeigaraテーブルのidを渡すように定義しています。15行目は第1引数で渡されたbasketテーブルのidを持つbasket_itemレコードの銘柄のidを返しています(当然、複数の値を返すこともあります)。ここでは仕様通り、既に買い物かごにある銘柄のidを除いたidのArrayListが返ってきます。メソッド名はretrieveItemsではなくもっと分かりやすい名前にすべきですね。16行目で新しく買い物かごに追加する処理を行っています。第1引数はbasketテーブルのid、第2引数はretrieveItemsから返された追加すべきものだけに減らされた銘柄のidです。

getBasketItemsメソッド

 ユーザのbasketに入っているすべての銘柄情報を返します。

 上記3つのメソッドはその中からDAOクラスのメソッドを読んでいます。それらのメソッドは粒度が細かく、再利用しやすくなっています。Helperクラスはこれら粒度の細かいDAOクラスのメソッドを組み合わせ、Servletで必要な機能を提供できるわけです。実際、前回作成したImoshochuCatalogServletクラス(前回のサンプルコードではImoshochuCatalogクラスとなっています。Servletクラスが分かりやすいようにNetBeansのリファクタリング機能を使用し名前を変更しています。名前を変更してもデプロイメント・ディスクリプタやHTML、JSPの名称は変更されないためプロジェクト全体を検索して変更する必要があります)に当HelperクラスのgetBasketIdとgetBasketItemsメソッドを組み込めば、カタログ表示と同時に買い物かごも表示できるようになります。図17が変更後のImoshochuCatalogServletクラスです。メソッドを慎重に設計することにより、再利用が容易になることがお分かりいただけたと思います。

図17.ImoshochuCatalogServletクラスのprocessRequestメソッド
001:    protected void processRequest(HttpServletRequest request,
002:                                    HttpServletResponse response)
003:    throws ServletException, IOException {
004:        // DAOクラスをインスタンス化する
005:        ImoshochuCatalogDAO imoshochuCatalogDAO = new ImoshochuCatalogDAOImpl();
006:        // requestからHttpSessionを取り出し、ImoshochuCatalogItemのArrayList
007:        // を"imoCatalog"として埋め込む
008:        request.getSession().setAttribute("imoCatalog",
009:                                imoshochuCatalogDAO.getImoshochuCatalogList());
010:
011:        BasketHelper basketFactory = new BasketHelper();
012:        // ログインしたユーザidをもとにデータベースからbasket情報を
013:        // 取得する。第5回は固定で「tomoharu」とする
014:        int basketId = 0;
015:        ArrayList basketItems = new ArrayList();
016:        basketId = basketFactory.getBasketId("tomoharu");
017:        basketItems = basketFactory.getBasketItems(basketId);
018:        request.getSession().setAttribute("basket", basketItems);
019:
020:
021:        // ImoshochuShop.jspに遷移する
022:        RequestDispatcher rd = request.getRequestDispatcher("/ImoshochuShop.jsp");
023:        rd.forward(request, response);

 14行目から18行目がまさしくBasketHelperクラスのメソッドを再利用した箇所です。

 BasketDAOImplクラスの各メソッドについての説明は割愛します。難しいSQL文は使用していません。ページの上部にあるサンプルコードをダウンロードし確認してください。プロジェクト構成は図18の通りです。また、データベースに関してはMySQL WorkbenchのMySQL AdministratorのManage Importでインポートしてご利用ください。

図18.第5回までのプロジェクト構成
図18.第5回までのプロジェクト構成

 今回までの状態で実行すると図19、図20、図21、図22の通りとなります。まず、NetBeansで[サービス]-[サーバー]-[GlassFish]と開き、右クリックし[起動]を選択するとGlassFishを起動します。さらに、[サービス]-[データベース]-[jdbc:mysql://localhost/imoshop]と開き、右クリックし[接続]を選択するとMySQLが起動します。次にブラウザでURLに「http://localhost:8080/ImoshochuWeb01/ImoshochuWelcome.html」と入力すると図19の画面が表示されます。

図19.ImoshochuWelcome画面
図19.ImoshochuWelcome画面

 [芋焼酎カタログへ]ボタンをクリックすると図20の画面が表示されます。まだカタログの下の買い物かごは空のはずです。カタログの左側のチェックボックスを選択します。

図20.「芋焼酎酒店」初期画面
図20.「芋焼酎酒店」初期画面

 例として「貴心樹」と「杜氏潤平紅芋原酒」を選択した画面が図21です。この状態で[買い物かごに追加する]ボタンをクリックすると図21のようにカタログの下に「貴心樹」と「杜氏潤平紅芋原酒」の銘柄名、単価、本数が表示されます。金額は次回実装します。

図21.「芋焼酎酒店」で銘柄を選択した状態の画面
図21.「芋焼酎酒店」で銘柄を選択した状態の画面

 いったんブラウザを閉じ、再度立ち上げると、図20のように買い物かごは空ではなく図22のように「貴心樹」と「杜氏潤平紅芋原酒」が既に表示されているはずです。買い物かごにない銘柄をカタログから追加すると買い物かごに追加され、買い物かごに既にあるものを追加しようとしても買い物かごには追加されないことが確認できるはずです。これで、買い物かごへの追加機能が実装されました。

図22.「芋焼酎酒店」の買い物かごに銘柄が追加された状態の画面
図22.「芋焼酎酒店」の買い物かごに銘柄が追加された状態の画面

 次回は買い物かごへの変更・削除と送料・合計の表示の実装を説明します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
GlassFishからアプローチするJava連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4900 2010/03/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー