広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2011年02月12日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.216(の続き)

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


========================================================
◆ 00.お知らせ(バックナンバーの閲覧に関して)
========================================================


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


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

さて、このアプリケーションの操作としては、各Webページをそれぞれ
次のような手順で開くことにしましょう。

(O-1) Webブラウザー(Internet Explorer)上で上記(前回の最後)のindex.jsp
を呼び出すためのURLを入力することにより、注文のリストのWebページが開く。
[このとき実行されるActionクラスの名前はOrderListActionとする。]

(O-2) 注文のリストのWebページ上で詳細を見たい注文の注文番号をクリック
すると、個々の注文の詳細を表示するWebページが開く。
[このとき実行されるActionクラスの名前はOrderDetailActionとする。]



では、これらのActionクラスを作っていくことにしますが、その前に
これらのOrder関係のActionクラスから呼び出されることになるデータベース
アクセスのメソッドを先に作成しておきましょう。
なお、Order関係のデータベースにアクセスするクラスは既にOrderDbManager
というクラス名で作られているので、これにメソッドを追加することにします。
(時間と解説量を節約するため、クラスやパッケージを既存のものと共有します。)

基本的には、注文番号を指定すると該当するデータ(レコード)をORDERHEADERテーブル
から取り出すメソッドと、全てのレコードを取り出すメソッドを作成した
いのですが、話を簡単にするために注文番号を指定すると該当するレコードを
取り出すメソッドをgetDataByNumber()というメソッド名で作成し、注文番号
に0を指定した場合には同じメソッドが全てのレコードを取り出してくれる
ようにプログラミングすることにします。(注文番号は1以上にしてデータベース
に書き込むようにしているので、注文番号が0というレコードは存在しないから、
これで問題ない。)



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

では、OrderDbManager.javaを開いて、下記のように編集して下さい。
(プロジェクト・エクスプローラー内のStrutsShop配下の「Javaリソース: src」配下
のjp.co.flsi.lecture.struts.dbの配下の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 java.util.Vector;

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 (?, ?, ?, ?)";

   private static final String selectOrderNumberSql = "SELECT * FROM ORDERHEADER WHERE O_NUM = ?";
   private static final String selectAllOrdersSql = "SELECT * FROM ORDERHEADER";


   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());
         if (anOrder.isPayment()) {  // paymentの値がtrueなら
            insHeaderPs.setInt(6, 1);  // 支払い済み
         }
         else { // paymentの値がfalseなら
            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;
   }


   public Vector<Order> getDataByNumber(int orderNumber) throws StruShopDbException {
      logger.info("Start ...............");
      ValueLogStringMaker stringMaker = new ValueLogStringMaker();
      logger.info("Method parameter: <<<<<" + stringMaker.getValues("orderNumber", orderNumber));
      logger.info(">>>>>");
      Vector<Order> orderList = new Vector<Order>();
      try {
         PreparedStatement selectPs = null;
         ResultSet rs;
         if (orderNumber == 0) {  // orderNumberが0(未指定)の場合
            selectPs = conn.prepareStatement(selectAllOrdersSql);
         }
         else {
            selectPs = conn.prepareStatement(selectOrderNumberSql);
            selectPs.setInt(1, orderNumber);
         }
         rs = selectPs.executeQuery();
         int payment = 0;
         while (rs.next()) {
            Order order = new Order();
            order.setOrderNumber(rs.getInt("O_NUM"));
            order.setOrderDate(rs.getDate("O_DATE"));
            order.setUserType(rs.getString("U_TYPE"));
            order.setUserId(rs.getString("USERID"));
            order.setPayMethod(rs.getInt("PAYMETHOD"));
            payment = rs.getInt("PAYMENT");
            if (payment == 1) {  // 支払い済みの場合
               order.setPayment(true);
            }
            else {  // 未払いの場合
               order.setPayment(false);
            }
            order.setDelivery(rs.getShort("DELIVERY"));

            orderList.add(order);
         }
         selectPs.close();
      }
      catch (SQLException e) {
         logger.error(e, e);
         throw new StruShopDbException("Error: getDataByNumber() failed!", e);
      }
      catch (Throwable e) {
         logger.error(e, e);
      }
      finally {
         logger.info("End ...............");
      }
      logger.info("Method return: <<<<<" + stringMaker.getValues("orderList", orderList));
      logger.info(">>>>>");
      return orderList;
   }

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

これも、特に解説する必要はありませんね。



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


では、続いてActionクラスを作成していきましょう。

これらのActionクラスは(StrutsのTilesの学習用という意味を込めて)
jp.co.flsi.lecture.struts.tiles
という名前のパッケージに入れることにします。

まず、パッケージを作成しましょう。

(1) プロジェクト・エクスプローラー内のStrutsShop配下の「Javaリソース: src」
を右クリックし、「新規」→「パッケージ」を選択します。

(2) 「新規Javaパッケージ」ウインドウにおいて「名前」欄に

jp.co.flsi.lecture.struts.tiles

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



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


続いて、このjp.co.flsi.lecture.struts.tilesの中にOrderListActionを作成
しましょう。

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

(2) 「新規」ウインドウで「Amateras」配下の「Struts」配下の「Struts Action」を選択し、
「次へ」ボタンをクリックします。

(3) 「Struts Action」ウインドウにおいて「名前」欄に

OrderListAction

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



では、OrderListAction.javaを下記のように編集して下さい。

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

import java.util.Vector;

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

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.StruShopDbException;

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 OrderListAction extends Action {
   private static Logger logger = Logger.getLogger(OrderListAction.class);

   public ActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequest request, HttpServletResponse response) {
      String forward = "success";
      logger.info("Start ...............");
      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(">>>>>");
      OrderDbManager orderDbManager = new OrderDbManager();
      try {
         orderDbManager.connect();
         Vector<Order> orderList = null;
         orderList = orderDbManager.getDataByNumber(0);
         request.setAttribute("orderList", orderList);
      } catch (StruShopDbException e) {
         logger.error(e, e);
         forward = "systemerror";
      }
      catch (Throwable e) {
         logger.error(e, e);
         forward = "systemerror";
      }
      finally {
         try {
            orderDbManager.disconnect();
         }
         catch (Exception e) {
            logger.info("Disconnect failed or there is no connection.");
         }
         logger.info("End ...............");
      }
      logger.info("Method return: <<<<< " + forward);
      logger.info(">>>>>");
      return mapping.findForward(forward);
   }

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

このソース・コードの中の

request.setAttribute("orderList", orderList);

という行における"orderList"という名前が、先ほどのorderList.jspファイルの中の

<logic:iterate id="order" name="orderList" scope="request">

という行の"orderList"と一致させられていることに注意して下さい。

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



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


次に、OrderDetailActionを作成しましょう。

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

(2) 「新規」ウインドウで「Amateras」配下の「Struts」配下の「Struts Action」を選択し、
「次へ」ボタンをクリックします。

(3) 「Struts Action」ウインドウにおいて「名前」欄に

OrderDetailAction

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



では、OrderDetailAction.javaを下記のように編集して下さい。

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

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.StruShopDbException;

import org.apache.commons.beanutils.DynaBean;
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 OrderDetailAction extends Action {
   private static Logger logger = Logger.getLogger(OrderDetailAction.class);

   public ActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequest request, HttpServletResponse response) {
      logger.info("Start ...............");
      String forward = "success";
      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();
         orderDb.connect();
         DynaBean dynaForm = (DynaBean) form;
         int orderNum = (Integer) dynaForm.get("selectedOrderNumber");
         if (orderNum == 0) {  // もし注文番号(selectedOrderNumber)が0の場合
            // (データベース上では注文番号が0はありえない!)
            logger.info("Method return: <<<<< systemerror: selectedOrderNumber Invalid");
            logger.info(">>>>>");
            return mapping.findForward("systemerror");
         }
         Vector<Order> orders = orderDb.getDataByNumber(orderNum);
         Order order = orders.get(0);  // 一つの注文番号で取得できるのは1レコードのみ
         session.setAttribute("ORDERSET", order);
      } catch (StruShopDbException e) {
         logger.error(e, e);
         forward = "systemerror";
      }
      catch (Throwable e) {
         logger.error(e, e);
         forward = "systemerror";
      }
      finally {
         try {
            orderDb.disconnect();
         }
         catch (Exception e) {
            logger.info("Disconnect failed or there is no connection.");
         }
         logger.info("End ...............");
      }
      logger.info("Method return: <<<<< " + forward);
      logger.info(">>>>>");
      return mapping.findForward(forward);
   }

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

このソース・コードも同じく、

session.setAttribute("ORDERSET", order);

という行の中の"ORDERSET"という名前が、先ほどのorderDetail.jspファイルの中の

<bean:write name="ORDERSET" property="orderNumber"/>

などのコードの中の"ORDERSET"と一致させられていることに注意して下さい。

あとは、特に解説する必要はありませんね。



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


では続いて、struts-config.xmlファイルの中にactionタグの追加と、先ほどの
DynaActionFormの記述を行いましょう。

(プロジェクト・エクスプローラー内のStrutsShop配下のWebContent配下の
WEB-INF配下のstruts-config.xmlを開いて下さい。)


struts-config.xmlファイルのソース・コードは現在、下記のようになっていること
と思います。

--------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
  <data-sources>
  </data-sources>
  <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-bean name="userRegForm" type="jp.co.flsi.lecture.struts.UserRegForm"/>
  </form-beans>
  <global-exceptions>
  </global-exceptions>
  <global-forwards>
  </global-forwards>
  <action-mappings>
    <action path="/itemlist" name="itemSelectForm" type="jp.co.flsi.lecture.struts.ItemListAction" scope="request" input="/itemSelect.jsp">
      <forward name="success" path="/itemList.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/cart" name="itemListForm" type="jp.co.flsi.lecture.struts.CartAction" scope="request" input="/itemList.jsp">
      <forward name="success" path="/cart.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/orderprocess" name="cartForm" type="jp.co.flsi.lecture.struts.OrderProcessAction" scope="request" validate="true" input="/cart.jsp">
      <forward name="success" path="/order.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/confirmorder" name="orderForm" type="jp.co.flsi.lecture.struts.ConfirmOrderAction" scope="request" input="/order.jsp">
      <forward name="success" path="/confirmOrder.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="userInsertError" path="/userInsertError.jsp"/>
      <forward name="newUser" path="/userReg.jsp"/>
      <forward name="useridInvalid" path="/useridInvalid.jsp"/>
      <forward name="passwordInvalid" path="/passwordInvalid.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/completeorder" name="confirmOrderForm" type="jp.co.flsi.lecture.struts.CompleteOrderAction" scope="request" input="/confirmOrder.jsp">
      <forward name="success" path="/completeOrder.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="userVacant" path="/userVacant.jsp"/>
      <forward name="tokenInvalid" path="/tokenInvalid.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/userreg" name="userRegForm" type="jp.co.flsi.lecture.struts.UserRegistrationAction" scope="request" input="/userReg.jsp">
      <forward name="success" path="/confirmOrder.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="userInsertError" path="/userInsertError.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
  </action-mappings>
  <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
  <message-resources parameter="MessageResources"/>
  <plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
    <set-property property="moduleAware" value="true"/>
  </plug-in>
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
  </plug-in>
</struts-config>
--------------------------------------------------------

これに下記のようなコードを追加しましょう。

[<form-beans>から</form-beans>までの間に以下を追加]
    <form-bean name="orderListForm" type="org.apache.struts.action.DynaActionForm">
      <form-property name="selectedOrderNumber" type="java.lang.Integer" initial="1"/>
    </form-bean>

[<action-mappings>から</action-mappings>までの間に以下を追加]
    <action path="/ordermanage" type="jp.co.flsi.lecture.struts.tiles.OrderListAction" scope="request">
      <forward name="success" path="tile.orderList"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/orderdetail" name="orderListForm" type="jp.co.flsi.lecture.struts.tiles.OrderDetailAction" scope="request" input="tile.orderList">
      <forward name="success" path="tile.orderDetail"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>


これらの追加を含めると、全体は下記のようになります。

--------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
  <data-sources>
  </data-sources>
  <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-bean name="userRegForm" type="jp.co.flsi.lecture.struts.UserRegForm"/>
    <form-bean name="orderListForm" type="org.apache.struts.action.DynaActionForm">
      <form-property name="selectedOrderNumber" type="java.lang.Integer" initial="1"/>
    </form-bean>
  </form-beans>
  <global-exceptions>
  </global-exceptions>
  <global-forwards>
  </global-forwards>
  <action-mappings>
    <action path="/itemlist" name="itemSelectForm" type="jp.co.flsi.lecture.struts.ItemListAction" scope="request" input="/itemSelect.jsp">
      <forward name="success" path="/itemList.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/cart" name="itemListForm" type="jp.co.flsi.lecture.struts.CartAction" scope="request" input="/itemList.jsp">
      <forward name="success" path="/cart.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/orderprocess" name="cartForm" type="jp.co.flsi.lecture.struts.OrderProcessAction" scope="request" validate="true" input="/cart.jsp">
      <forward name="success" path="/order.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/confirmorder" name="orderForm" type="jp.co.flsi.lecture.struts.ConfirmOrderAction" scope="request" input="/order.jsp">
      <forward name="success" path="/confirmOrder.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="userInsertError" path="/userInsertError.jsp"/>
      <forward name="newUser" path="/userReg.jsp"/>
      <forward name="useridInvalid" path="/useridInvalid.jsp"/>
      <forward name="passwordInvalid" path="/passwordInvalid.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/completeorder" name="confirmOrderForm" type="jp.co.flsi.lecture.struts.CompleteOrderAction" scope="request" input="/confirmOrder.jsp">
      <forward name="success" path="/completeOrder.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="userVacant" path="/userVacant.jsp"/>
      <forward name="tokenInvalid" path="/tokenInvalid.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/userreg" name="userRegForm" type="jp.co.flsi.lecture.struts.UserRegistrationAction" scope="request" input="/userReg.jsp">
      <forward name="success" path="/confirmOrder.jsp"/>
      <forward name="cartVacant" path="/cartVacantError.jsp"/>
      <forward name="userInsertError" path="/userInsertError.jsp"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/ordermanage" type="jp.co.flsi.lecture.struts.tiles.OrderListAction" scope="request">
      <forward name="success" path="tile.orderList"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
    <action path="/orderdetail" name="orderListForm" type="jp.co.flsi.lecture.struts.tiles.OrderDetailAction" scope="request" input="tile.orderList">
      <forward name="success" path="tile.orderDetail"/>
      <forward name="systemerror" path="/systemerror.jsp"/>
    </action>
  </action-mappings>
  <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
  <message-resources parameter="MessageResources"/>
  <plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
    <set-property property="moduleAware" value="true"/>
  </plug-in>
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
  </plug-in>
</struts-config>
--------------------------------------------------------



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


では、テストをしてみましょう。

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

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

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

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

http://localhost:8080/StrutsShop/tiles-parts/index.jsp

または、

http://localhost:8080/StrutsShop/tiles-parts/

を入力しましょう。

(3) 注文のリストが表示されますので、その中のどれかの注文番号(たとえば 1)を
クリックしましょう。

注文の詳細のWebページが開きますね。

どうですか、期待通りに動きましたか。

どちらのWebページも先ほどのレイアウトになっていることがわかりましたね。

そして、タイトルと本体(body)の部分はページごとに違っていますね。

(なお、支払い方法や支払い状況、配達状況に数字やtrue/falseなどのわかりずらい値
を表示するなど、体裁の悪いところがありますが、これらも次回に修正していきます。)



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


(次回に続く)



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      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) 2011 Future Lifestyle Inc. 不許無断複製