広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2010年04月11日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.199

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:毎週日曜の夜に発行
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:毎週水曜の夜に発行
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.Strutsのアプリケーション開発(プロジェクト:StrutsShop)
========================================================


では、次に、vol.188のアプリケーションの処理の流れのうち(U-9)〜(U-11)
までのプログラミングへと進んで行きましょう。

念のため、(U-9)〜(U-11)までの部分を抜粋し、再提示しておきます。

--------------------------------------------------------
(U-9) 注文確認のためのWebページが開く。
[confirmOrder.jsp]

(U-10) 注文内容を確認し、「購入」ボタンを押す。
[completeorder.do]→[CompleteOrderAction.java]

(U-11) 注文の完了を知らせるWebページが開く。
[completeOrder.jsp]
--------------------------------------------------------



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


まず、confirmOrder.jspを下記のように編集しましょう。

--------------------------------------------------------
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-nested" prefix="nested" %>

<html:html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <title>購入(注文)内容の確認</title>
   </head>
   <body bgcolor="#77ffff" text="#fa5a00">
      <h1>購入する商品</h1>
      <html:form method="POST" action="/completeorder">
         <table border="1" width="100%">
           <tbody>
             <tr>
               <th>商品番号</th>
               <th>商品名</th>
               <th>価格</th>
               <th>カテゴリー</th>
               <th>購入個数</th>
             </tr>
             <%@ page import="java.util.Vector" %>
             <%@ page import="jp.co.flsi.lecture.struts.db.OrderItem" %>
             <% String homebase = request.getContextPath(); %>
            <% int totalPrice = 0; %>
             <bean:define id="orderItemList" name="ORDER" property="orderItems" type="Vector<OrderItem>" scope="session" />
            <logic:iterate id="item" type="OrderItem" name="orderItemList" scope="page">
               <tr>
                  <td><bean:write name="item" property="itemNum" /></td>
                  <td><bean:write name="item" property="itemName" /></td>
                  <td><bean:write name="item" property="price" />円</td>
                  <td><bean:write name="item" property="catName" /></td>
                  <td align="center"><bean:write name="item" property="orderQuantity" /></td>
                </tr>
                <% totalPrice += item.getPrice() * item.getOrderQuantity(); %>
            </logic:iterate>
           </tbody>
         </table>
         <br>
         <table border="1">
             <tr>
               <th>合計金額:</th>
               <th><%= totalPrice %>円</th>
             </tr>
         </table>
         <br>
         <br>
         <h1>商品の送付先:</h1>
         <table border="1">
             <tr>
               <th>郵便番号</th>
               <th>住所</th>
               <th>氏名</th>
             </tr>
             <tr>
               <td><bean:write name="USER" property="zipcode" /></td>
               <td><bean:write name="USER" property="address" /></td>
               <td><bean:write name="USER" property="name" /></td>
             </tr>
         </table>
         <br>
         <br>
         この内容で購入(注文)を確定するには、下の「購入(注文確定)する」ボタンを押してください。
         <br>
         <FONT color="#ff0000"><STRONG>
         なお、「購入(注文確定)する」ボタンを押すと注文が確定してしまい、取り消しはできませんのでご注意ください。
         </STRONG></FONT>
         <br>
         <br>
         <html:submit property="submit" value="購入(注文確定)する" />
      </html:form>
      <br>
      <html:link page="/itemSelect.jsp">トップ・ページ(商品検索のページ)に戻る</html:link>
   </body>
</html:html>
--------------------------------------------------------

編集した内容は、formを組み込んでsubmitボタンを付けたことだけですね。
解説は必要ないですね。



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


さて、これで、formが組み込まれましたので、それに対応するActionFormオブジェクト
をconfirmOrderFormという名前で用意することにしましょう。

confirmOrderFormは、下記のようにして、struts-config.xmlに登録することにしましょう。

まず、struts-config.xmlの中の

--------------------------------------------------------
  <form-beans>
    <form-bean name="itemSelectForm" type="jp.co.flsi.lecture.struts.ItemSelectForm" />
    <form-bean name="itemListForm" type="jp.co.flsi.lecture.struts.ItemListForm" />
    <form-bean name="cartForm" type="jp.co.flsi.lecture.struts.CartForm" />
    <form-bean name="orderForm" type="jp.co.flsi.lecture.struts.OrderForm" />
  </form-beans>
--------------------------------------------------------

の部分を
--------------------------------------------------------
  <form-beans>
    <form-bean name="itemSelectForm" type="jp.co.flsi.lecture.struts.ItemSelectForm" />
    <form-bean name="itemListForm" type="jp.co.flsi.lecture.struts.ItemListForm" />
    <form-bean name="cartForm" type="jp.co.flsi.lecture.struts.CartForm" />
    <form-bean name="orderForm" type="jp.co.flsi.lecture.struts.OrderForm" />
    <form-bean name="confirmOrderForm" type="org.apache.struts.action.DynaActionForm" />
  </form-beans>
--------------------------------------------------------

というように編集しましょう。ここでconfirmOrderFormのクラスとしてはDynaActionForm
を使っていることに注意して下さい。

以前もお話したように、DynaActionFormクラスを指定すると、自分でActionFormのサブ
クラスをプログラミングしなくてもStrutsが自動的にActionFormオブジェクトを用意し
てくれますので、プロパティーの処理や入力データの検証などの特別なプログラミングが
必要ない場合はこのようにしておきます。


続いて、struts-config.xmlの中の

--------------------------------------------------------
    <action path="/completeorder" type="jp.co.flsi.lecture.struts.CompleteOrderAction"
     input="/confirmOrder.jsp">
      <forward name="success" path="/completeOrder.jsp"/>
    </action>
--------------------------------------------------------

の部分を

--------------------------------------------------------
    <action path="/completeorder" type="jp.co.flsi.lecture.struts.CompleteOrderAction"
     name="confirmOrderForm" scope="request" input="/confirmOrder.jsp">
      <forward name="success" path="/completeOrder.jsp"/>
    </action>
--------------------------------------------------------

というように編集して下さい。ここら辺はいつものパターンですね。



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


さて今回は、購入(注文)を確定する処理を行うので、データベースの注文の
テーブル(ORDERHEADERテーブルとORDERITEMテーブル)へデータを登録するため
のクラスも作成しましょう。OrderDbManagerというクラス名にしましょう。

(1) プロジェクト・エクスプローラー内でjp.co.flsi.lecture.struts.dbを右クリック
し、「新規」→「クラス」を選択します。

(2) 「名前」欄に

OrderDbManager

と入力し、「完了」ボタンをクリックします。

(3) OrderDbManager.javaのエディターが開いたら、下記のように編集しましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.struts.db;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import jp.co.flsi.lecture.reflect.ValueLogStringMaker;
import org.apache.log4j.Logger;

public class OrderDbManager extends DbManager  {
   private static Logger logger = Logger.getLogger(OrderDbManager.class);
   private String selectMaxONumSql = "SELECT MAX(O_NUM) FROM ORDERHEADER";
   private String insHeaderSql = "INSERT INTO ORDERHEADER  VALUES (?, ?, ?, ?, ?, ?, ?)";
   private String insItemSql = "INSERT INTO ORDERITEM  VALUES (?, ?, ?, ?)";

   public boolean insertData(Order anOrder) throws StruShopDbException {
      logger.info("Start ...............");
      ValueLogStringMaker stringMaker = new ValueLogStringMaker();
      logger.info("Method parameter: <<<<<" + stringMaker.getValues("user", anOrder));
      logger.info(">>>>>");
      try {
         conn.setAutoCommit(false);
         Statement selectSt = conn.createStatement();
         PreparedStatement insHeaderPs = conn.prepareStatement(insHeaderSql);
         PreparedStatement insItemPs = conn.prepareStatement(insItemSql);
         ResultSet rs = selectSt.executeQuery(selectMaxONumSql);
         int newOrderNumber = 1;
         if (rs.next()) newOrderNumber = rs.getInt(1) + 1;
         insHeaderPs.setInt(1, newOrderNumber);
         insHeaderPs.setDate(2, new java.sql.Date((new Date()).getTime()));
         insHeaderPs.setString(3, anOrder.getUserType());
         insHeaderPs.setString(4, anOrder.getUserId());
         insHeaderPs.setInt(5, anOrder.getPayMethod());
         insHeaderPs.setInt(6, 0);  // 未払い
         insHeaderPs.setInt(7, 0);  // 未配達
         insHeaderPs.executeUpdate();
         int seqNum = 1;
         for (OrderItem oi : anOrder.getOrderItems()) {
            insItemPs.setInt(1, newOrderNumber);
            insItemPs.setInt(2, seqNum);
            insItemPs.setString(3, oi.getItemNum());
            insItemPs.setInt(4, oi.getOrderQuantity());
            insItemPs.executeUpdate();
            seqNum++;
         }
         selectSt.close();
         insHeaderPs.close();
         insItemPs.close();
         conn.commit();
      }
      catch (SQLException e) {
         try {
            conn.rollback();
            logger.info("Rollback executed.");
         }
         catch (Exception ex) {
            logger.info("Rollback failed.", ex);
         }
         logger.error(e, e);
         throw new StruShopDbException("Error: insertData() failed!", e);
      }
      catch (Throwable e) {
         try {
            conn.rollback();
            logger.info("Rollback executed.");
         }
         catch (Exception ex) {
            logger.info("Rollback failed.", ex);
         }
         logger.error(e, e);
         return false;
      }
      finally {
         logger.info("End ...............");
      }
      logger.info("Method return: <<<<< true");
      logger.info(">>>>>");
      return true;
   }

}
--------------------------------------------------------

これも解説は不要ですね。



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


では、次にCompleteOrderActionクラスをコーディングしましょう。

CompleteOrderAction.javaのエディターを開いて下さい。(Eclipseのプロジェクト・
エクスプローラー内のStrutsShop配下の「Javaリソース:src」配下の
jp.co.flsi.lecture.struts配下のCompleteOrderAction.javaをダブルクリックする。)

CompleteOrderAction.javaを下記のように編集しましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.struts;

import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.flsi.lecture.reflect.ValueLogStringMaker;
import jp.co.flsi.lecture.struts.db.Order;
import jp.co.flsi.lecture.struts.db.OrderDbManager;
import jp.co.flsi.lecture.struts.db.OrderItem;
import jp.co.flsi.lecture.struts.db.StruShopDbException;
import jp.co.flsi.lecture.struts.db.User;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class CompleteOrderAction extends Action {
   private static Logger logger = Logger.getLogger(CompleteOrderAction.class);

   public ActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequest request, HttpServletResponse response) {
      logger.info("Start ...............");
      OrderDbManager orderDb = new OrderDbManager();
      try {
         ValueLogStringMaker stringMaker = new ValueLogStringMaker();
         logger.info("Method parameter: <<<<<" + stringMaker.getValues("mapping", mapping));
         logger.info(">>>>>");
         logger.info("Method parameter: <<<<<" + stringMaker.getValues("form", form));
         logger.info(">>>>>");
         logger.info("Method parameter: <<<<<" + stringMaker.getValues("request", request));
         logger.info(">>>>>");
         logger.info("Method parameter: <<<<<" + stringMaker.getValues("response", response));
         logger.info(">>>>>");
         HttpSession session = request.getSession();
         Order anOrder = (Order)session.getAttribute("ORDER");
         if (anOrder == null) {
            logger.info("Method return: <<<<< cartVacant (1)");
            logger.info(">>>>>");
            return mapping.findForward("cartVacant");
         }
         Vector<OrderItem> orderItemList = anOrder.getOrderItems();
         if (orderItemList == null) {
            logger.info("Method return: <<<<< cartVacant (2)");
            logger.info(">>>>>");
            return mapping.findForward("cartVacant");
         }
         User user = (User)session.getAttribute("USER");
         if (user == null) {
            logger.info("Method return: <<<<< userVacant");
            logger.info(">>>>>");
            return mapping.findForward("userVacant");
         }
         orderDb.connect();
         orderDb.insertData(anOrder);
      } catch (StruShopDbException e) {
         logger.error(e, e);
      }
      catch (Throwable e) {
         logger.error(e, e);
      }
      finally {
         try {
            orderDb.disconnect();
         }
         catch (Exception e) {
            logger.info("Disconnect failed or there is no connection.");
         }
         logger.info("End ...............");
      }
      logger.info("Method return: <<<<< success");
      logger.info(">>>>>");
      return mapping.findForward("success");
   }

}
--------------------------------------------------------

これも大切しなくても理解できますね。



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


では、続いてcompleteOrder.jspをコーディングしましょう。

completeOrder.jspを下記のように編集しましょう。

--------------------------------------------------------
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-nested" prefix="nested" %>

<html:html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <title>注文完了</title>
   </head>
   <body bgcolor="#77ffff" text="#fa5a00">
      <h1>下記のご注文を受け付けました。</h1>
      <table border="1" width="100%">
        <tbody>
          <tr>
            <th>商品番号</th>
            <th>商品名</th>
            <th>価格</th>
            <th>カテゴリー</th>
            <th>購入個数</th>
          </tr>
          <%@ page import="java.util.Vector" %>
          <%@ page import="jp.co.flsi.lecture.struts.db.OrderItem" %>
          <% String homebase = request.getContextPath(); %>
         <% int totalPrice = 0; %>
          <bean:define id="orderItemList" name="ORDER" property="orderItems" type="Vector<OrderItem>" scope="session" />
         <logic:iterate id="item" type="OrderItem" name="orderItemList" scope="page">
            <tr>
               <td><bean:write name="item" property="itemNum" /></td>
               <td><bean:write name="item" property="itemName" /></td>
               <td><bean:write name="item" property="price" />円</td>
               <td><bean:write name="item" property="catName" /></td>
               <td align="center"><bean:write name="item" property="orderQuantity" /></td>
             </tr>
             <% totalPrice += item.getPrice() * item.getOrderQuantity(); %>
         </logic:iterate>
        </tbody>
      </table>
      <br>
      <table border="1">
          <tr>
            <th>合計金額:</th>
            <th><%= totalPrice %>円</th>
          </tr>
      </table>
      <br>
      <br>
      お支払い方法が銀行振り込みの場合は下記の口座に代金をお振込みください。お振込み後に商品の発送手続きにはいります。
      <br>
      <table border="0">
          <tr>
            <th>STRUSHOP銀行</th>
            <th>XYZ支店</th>
            <th>普通預金口座</th>
            <th>1234567</th>
          </tr>
      </table>
      <br>
      <br>
      ご注文ありがとうございました。
      <% session.invalidate(); %>
      <br>
      <br>
      <html:link page="/itemSelect.jsp">トップ・ページ(商品検索のページ)に戻る</html:link>
   </body>
</html:html>
--------------------------------------------------------

ここで、
session.invalidate();
というJavaのコードを入れることによって、セッションを終了させていること
に注意して下さい。この意味を忘れた人は、vol.094などを復習して下さい。

あとは特に説明の必要はありませんね。



では、動作確認をしてみましょう。

(1) 「サーバー」ビューの中の「ローカル・ホストのTomcat v5.5サーバー」を
右クリックし、「開始」を選択します。しばらくして、

ローカル・ホストのTomcat v5.5サーバー[始動済み,同期済み]

というように、後ろに「始動済み」の表示が出たら、Tomcatの起動が完了しています。

(2) Webブラウザー(Internet Explorer)を起動して、URL

http://localhost:8080/StrutsShop/itemSelect.jsp

を入力しましょう。

(3) 「商品の検索」のWebページが開いたら、そのまま「商品検索」ボタンをクリック
して、次の「商品のリスト」のWebページでは全ての選択欄にチェックマークを入れて
「買物かごに入れる」ボタンをクリックしましょう。

(4) 「ショッピング・カートの中のリスト」のWebページが開いたら、そのまま
「これらの商品を購入する」ボタンをクリックしましょう。

(5) 「購入する商品」のWebページが開いたら、「お名前」欄、「郵便番号」欄、
「ご住所」欄、「お電話番号」欄、「Eメール・アドレス」欄に適当に入力し、
「お支払い方法」欄は「クレジット・カード払い」または「銀行振り込み」を選択し、
「最終購入確認画面に進む」ボタンをクリックしましょう。

ただし、「ご住所」欄の番地は「1-2-3」のようにハイフンを半角で入力し、全角では
入力しないで下さい。その理由は、あとでLinuxへデプロイする段階になったときに
まとめて説明します。

(6) 購入(注文)内容の確認のWebページが開いたら、、「購入(注文確定)する」ボタン
をクリックして下さい。


最後に注文完了のWebページ(「下記のご注文を受け付けました。」のWebページ)が
開くことを確認して下さい。

また、EclipseのDBViewerでORDERHEADERテーブルとORDERITEMテーブルを表示して、
正しくデータが登録されていることを確認して下さい。

(DBViewerの操作方法を忘れた人は、vol.084などを復習のこと。)



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


(次回に続く)


では、今日はここまでにします。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2010 Future Lifestyle Inc. 不許無断複製