Helperクラスを作成
先述の通り、Webアプリケーションは層アーキテクチャを適用するのが一般的です。層アーキテクチャの場合、適用できるデザインパターンを多くありますが、今回は何を行っているのか分かりやすいよう、あえてデザインパターンの適用はしません。変更が容易な作りを目標とします。図16がBasketHelperクラスです。このクラスからDAOクラスのメソッドを呼び出し、値を格納したり、取りだしたりしています。
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クラスです。メソッドを慎重に設計することにより、再利用が容易になることがお分かりいただけたと思います。
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でインポートしてご利用ください。
今回までの状態で実行すると図19、図20、図21、図22の通りとなります。まず、NetBeansで[サービス]-[サーバー]-[GlassFish]と開き、右クリックし[起動]を選択するとGlassFishを起動します。さらに、[サービス]-[データベース]-[jdbc:mysql://localhost/imoshop]と開き、右クリックし[接続]を選択するとMySQLが起動します。次にブラウザでURLに「http://localhost:8080/ImoshochuWeb01/ImoshochuWelcome.html」と入力すると図19の画面が表示されます。
[芋焼酎カタログへ]ボタンをクリックすると図20の画面が表示されます。まだカタログの下の買い物かごは空のはずです。カタログの左側のチェックボックスを選択します。
例として「貴心樹」と「杜氏潤平紅芋原酒」を選択した画面が図21です。この状態で[買い物かごに追加する]ボタンをクリックすると図21のようにカタログの下に「貴心樹」と「杜氏潤平紅芋原酒」の銘柄名、単価、本数が表示されます。金額は次回実装します。
いったんブラウザを閉じ、再度立ち上げると、図20のように買い物かごは空ではなく図22のように「貴心樹」と「杜氏潤平紅芋原酒」が既に表示されているはずです。買い物かごにない銘柄をカタログから追加すると買い物かごに追加され、買い物かごに既にあるものを追加しようとしても買い物かごには追加されないことが確認できるはずです。これで、買い物かごへの追加機能が実装されました。
次回は買い物かごへの変更・削除と送料・合計の表示の実装を説明します。





